2012-03-30 10 views
5

Ich schrieb einige funktionelle VBA:speichern Bereich variable

Sheets("Src").Range("A2:A9").Copy Destination:=Sheets("Dest").Range("A2") 

ich den Quellbereich in eine Variable für Flexibilität extrahieren möchten.

SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Dies funktioniert jedoch nicht. Womit sollte SrcRange gedimmt werden? Ist die erste Zeile überhaupt korrekt?
habe ich versucht, Dimming SrcRange als Bereich und es gab mir
Runtime error 91: Object Variable or With block variable not set

ich mit der Sprache nicht sehr vertraut bin und die Dokumentation hat mich wollen links (ich nicht den Rückgabetyp der Sheets (Index) finden konnte Aufruf, this war der nächste, den ich fand). Wenn ich auf "Aufnahme Makro" klicke, einige Aktionen ausführe und "Stopp" drücke, ist der Makro-Bereich noch leer.

Könnte jemand etwas Licht in die Verwendung von SrcRange als Variable werfen?

Antwort

9

In Ihrer eigenen Antwort, können Sie dies effektiv tun:

Dim SrcRange As Range ' you should always declare things explicitly 
Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Sie sind wirklich nicht um den Bereich zu einer Variablen „Extrahieren“, sind Sie auf den Bereich eine Referenzeinstellung.

In vielen Situationen kann dies sowie flexibler effizienter sein:

Dim Src As Variant 
Src= Sheets("Src").Range("A2:A9").Value 'Read range to array 
'Here you can add code to manipulate your Src array 
'... 
Sheets("Dest").Range("A2").Value = Src 'Write array back to another range 
+0

Ich mag in der Lage zu lesen, zu einer Variant-Variable/Array für weitere Flexibilität. Danke für den Tipp! –

7

... Und die Antwort lautet:

Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Die Set den Unterschied macht. Dann funktioniert es wie ein Zauber.

8

zu klären Gerade, gibt es einen großen Unterschied zwischen diesen beiden Aktionen, die von Jean-François Corbett vorgeschlagen, wie.

Eine Aktion/Laden namens vArray (Verwechslung von Variant-Array und Blatt sowohl genannt Src zu vermeiden geändert) die aktuellen Daten aus den Range("A2:A9") in einer Variante Array zu kopieren:

vArray = Sheets("Src").Range("A2:A9").Value

, während der andere setzt einfach eine Bereichsvariable (SrcRange) mit der Adresse des Bereichs bis Sheets("Src").Range("A2:A9"):

Set SrcRange = Sheets("Src").Range("A2:A9")

In diesem Fall werden die Daten nicht kopiert und bleiben dort, wo sie sich befinden, aber auf sie kann jetzt ähnlich wie bei einem Array zugegriffen werden. Das ist oft völlig ausreichend, aber wenn Sie wiederholt auf diese Daten zugreifen, sie testen oder berechnen müssen, ist das Laden in ein Array viel schneller.

Angenommen, Sie möchten eine "Datenbank" (großes Blatt) mit einer Liste bekannter Vorstädte und Postleitzahlen vergleichen. Beide Datensätze sind in separaten Blättern, aber wenn Sie wollen, dass es schnell läuft, laden Sie die Vororte und Postleitzahlen in ein Array (lebt im Speicher), dann durchlaufen Sie jede Zeile der Hauptdatenbank und testen mit den Array-Daten. Dies wird viel schneller als wenn Sie beide von ihren Originalblättern zugreifen.