Range of .Range ?

Status
Niet open voor verdere reacties.

MDN111

Gebruiker
Lid geworden
13 aug 2007
Berichten
503
Hallo,

Onlangs wilde ik, om snelheidsredenen, een Range onderbrengen in een array. Dat had ik ooit nog eens gedaan, dus even het vroegere bestand opgezocht en onderstaande code teruggevonden die foutloos werkt:

Code:
Dim myArray() As Variant, oSh As Worksheet
Set oSh = ThisWorkbook.Sheets("A")
With oSh
    myArray() = .Range(.Cells(3, 1), .Cells(100, 4))
End With


Bij nader toezien dacht ik dat het korter kon, door de variabele "oSh" weg te laten wat onderstaande code oplevert. Dit werkt echter niet. Er volgt een runtime error 13 - Type mismatch.

Code:
Dim myArray() As Variant
With ThisWorkbook.Sheets("A")
    myArray() = [B][COLOR="#FF0000"].[/COLOR][/B]Range(.Cells(3, 1), .Cells(100, 4))  'Dit werkt niet (???)
End With


Na een beetje trial and error kwam ik uit bij onderstaande code die dan weer wel werkt:

Code:
Dim myArray() As Variant
With ThisWorkbook.Sheets("A")
    myArray() = Range(.Cells(3, 1), .Cells(100, 4))
End With

Wat ik niet begrijp is dat het weglaten van het punt "." in ".Range(....." het verschil maakt.

Kan iemand mij daar een beter inzicht in bijbrengen ?

Grtz,
MDN111.
 
Die punt geeft aan dat je de range of cells bedoelt in het werkblad dat in de With is genoemd.
Dat is dan nodig als dat niet je huidige werkblad is.
 
Laatst bewerkt:
Ik zou dit gebruiken:

Code:
mijnArray= ThisWorkbook.Sheets("A").Cells(3, 1).resize(97, 4)

Dit werkt hier allemaal:
Code:
Sub M_snb()
   sn = Sheet1.Range(Sheet1.Cells(1, 1), Sheet1.Cells(10, 10))
   sn = Range(Sheet1.Cells(1, 1), Sheet1.Cells(10, 10))
   sn = Application.Range(Sheet1.Cells(1, 1), Sheet1.Cells(10, 10))
   With ThisWorkbook.Sheets(1)
      myArray = .Range(.Cells(3, 1), .Cells(100, 4))  'Dit werkt niet (???)
   End With
End Sub


Je heb de eigenschap 'Range' van Excel.
Die staat gelijk aan Application.Range
Deze Range-eigenschap heeft 2 argumenten.

Ook een werkblad heeft de eigenschap Range.
Hiervoor geldt hetzelfde.

De fout wordt veroorzaakt door de onjuiste declaratie.
Laat die weg en de code loopt vlekkelings.
of gebruik Dim myarray As Variant

Er is een verschil tussen het declareren van een variantvariabele en het declareren van een array()
Aan een array kun je geen waarden van een range toekennen.
Aan een variantvariabele wel.
 
Laatst bewerkt:
Bedankt voor de reacties, maar ik vrees dat ik (nog) niet verlost ben van mijn cargo cult gevoel...

@edmoor

Die punt geeft aan dat je de range of cells bedoelt in het werkblad dat in de With is genoemd.
Dat is dan nodig als dat niet je huidige werkblad is.


Dat begrijp ik, maar dat lijkt niet de reden van de fout. De code in het eerste en derde voorbeeld werkt zonder problemen, ongeacht welke worksheet de actieve sheet is. De code in het twee voorbeeld werkt helemaal niet, ook ongeacht welke worksheet de actieve sheet is.

Excuseer mij, maar mijn inzicht in het probleem is niet verbeterd.


@snb

mijnArray= ThisWorkbook.Sheets("A").Cells(3, 1).resize(97, 4)

Dat is natuurlijk nog beter. Maar dat werkt alleen als mijnArray geen array is, maar wel een variant-variabele, zoals je verderop aangeeft.


Je heb de eigenschap 'Range' van Excel.
Die staat gelijk aan Application.Range
Deze Range-eigenschap heeft 2 argumenten.

Ook een werkblad heeft de eigenschap Range.
Hiervoor geldt hetzelfde.

Dat begrijp ik. Dat lijkt mij aan te leunen bij het antwoord van edmoor.


De fout wordt veroorzaakt door de onjuiste declaratie.
Laat die weg en de code loopt vlekkelings.
of gebruik Dim myarray As Variant

Er is een verschil tussen het declareren van een variantvariabele en het declareren van een array()
Aan een array kun je geen waarden van een range toekennen.
Aan een variantvariabele wel.


Hier ben ik een beetje verloren, denk ik.
In de goed werkende code in mijn eerste en derde voorbeeld heb ik myArray toch expliciet als array() gedeclareerd en er daarna een Range aan toegewezen (???).

Grtz,
MDN111.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan