Verzeihen Sie mir, wie ich ein Neuling in VBA bin.
Manchmal benutze ich
Dim r as Range
r = Range("A1")
Andere Male benutze ich
Set r = Range("A1")
Was ist der Unterschied? Und wann soll ich was verwenden?
Antworten:
Es gibt keinen Grund zur Verwendung, es set
sei denn, Sie beziehen sich auf eine Objektreferenz. Es ist empfehlenswert, es nur in diesem Zusammenhang zu verwenden. Verwenden Sie für alle anderen einfachen Datentypen einfach einen Zuweisungsoperator. Es ist jedoch eine gute Idee, dim
ALLE Variablen zu (dimensionieren):
Beispiele für einfache Datentypen wären integer
, long
, boolean
, string
. Dies sind nur Datentypen und haben keine eigenen Methoden und Eigenschaften.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Ein Beispiel für a object
wäre a Range
, a Worksheet
oder a Workbook
. Diese haben ihre eigenen Methoden und Eigenschaften.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Wenn Sie versuchen, die letzte Zeile ohne zu verwenden Set
, gibt VB einen Fehler aus. Nachdem Sie eine object
deklariert haben, können Sie auf deren Eigenschaften und Methoden zugreifen.
myString = myRange.Value
Set
ohne Dim
die Variable zuerst zu verwenden?
Dim
deklariert die Variable .
Dim r As Range
Set
Setzt die Variable auf eine Objektreferenz .
Set r = Range("A1")
Ich glaube jedoch nicht, dass Sie das wirklich fragen.
Manchmal benutze ich:
Dim r as Range r = Range("A1")
Das wird niemals funktionieren. Ohne Set
erhalten Sie Laufzeitfehler # 91 Objektvariable oder Mit Blockvariable nicht gesetzt . Dies liegt daran , Sie müssen verwenden Set
einen Variablen Wert auf einen Objektverweis zuweisen. Dann wird der obige Code wird funktionieren.
Ich denke, der folgende Code zeigt, worüber Sie wirklich fragen. Nehmen wir an, wir deklarieren keinen Typ und lassen r
stattdessen einen Variant
Typ sein.
Public Sub test()
Dim r
debug.print TypeName(r)
Set r = Range("A1")
debug.print TypeName(r)
r = Range("A1")
debug.print TypeName(r)
End Sub
Lassen Sie uns also zusammenfassen, was hier passiert.
r
wird als Variante deklariert
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
wird auf die Range
enthaltende Zelle "A1" gesetzt
Set r = Range("A1") ' TypeName(r) returns "Range"
r
wird auf den Wert der Standardeigenschaft von gesetzt Range("A1")
.
r = Range("A1") ' TypeName(r) returns "String"
In diesem Fall lautet die Standardeigenschaft eines Bereichs .Value
, sodass die folgenden zwei Codezeilen äquivalent sind.
r = Range("A1")
r = Range("A1").Value
Weitere Informationen zu Standardobjekteigenschaften finden Sie unter "Standardmitglied einer Klasse" von Chip Pearson .
Wie für Ihr Set
Beispiel:
Andere Male benutze ich
Set r = Range("A1")
Dies würde nicht funktionieren, ohne vorher zu deklarieren, dass r
es sich um ein Range
oder ein Variant
Objekt handelt ... mit der Dim
Anweisung - es sei denn, Sie haben nicht Option Explicit
aktiviert, was Sie sollten. Immer. Andernfalls verwenden Sie Bezeichner, die Sie nicht deklariert haben und die alle implizit als Varianten deklariert sind .
Dim: Sie definieren eine Variable (hier: r ist eine Variable vom Typ Range)
Set: Sie setzen die Eigenschaft (hier: Setzen Sie den Wert von r auf Range ("A1") - dies ist kein Typ, sondern ein Wert).
Sie müssen set mit Objekten verwenden. Wenn r ein einfacher Typ wäre (z. B. int, string), würden Sie einfach schreiben:
Dim r As Integer
r=5
Dim
deklariert einfach den Wert und den Typ.
Set
weist der Variablen einen Wert zu.
Wenn eine Variable als Objekt definiert ist, z. B. Dim myfldr As Folder, wird ihr mit dem Schlüsselwort "Set" ein Wert zugewiesen.
Dim
ist die Abkürzung für Dimension und wird in VBA und VB6 zum Deklarieren lokaler Variablen verwendet.
Set hingegen hat nichts mit Variablendeklarationen zu tun. Das Set
Schlüsselwort wird verwendet, um einem neuen Objekt eine Objektvariable zuzuweisen .
Hoffe das klärt den Unterschied für dich.
Laut der VBA-Hilfe zur SET-Anweisung wird ein Verweis auf ein Objekt festgelegt. Wenn Sie also eine Eigenschaft ändern, ändert sich auch das tatsächliche Objekt.
Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue
Die anderen Vars-Eigenschaften ändern sich ebenfalls.
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
Eigentlich sind alle Vars gleich!