it-swarm.com.de

Was ist der Unterschied zwischen dim und set in vba?

Verzeihen Sie mich als Neuling in der VBA. 

Manchmal benutze ich

Dim r as Range
r = Range("A1")

Andere Zeiten verwende ich

Set r = Range("A1")

Was ist der Unterschied? Und wann sollte ich was verwenden?

65
Ram

Es gibt keinen Grund, set zu verwenden, es sei denn, es wird auf eine Objektreferenz verwiesen. 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, ALLE Variablen dim (dimension) zu verwenden:

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 eine object wäre eine Range, eine Worksheet oder eine Workbook. Diese haben ihre eigenen Methoden und Eigenschaften. 

Dim myRange as Range
Set myRange = Sheet1.Range("A1")

Wenn Sie versuchen, die letzte Zeile ohne Set zu verwenden, gibt VB einen Fehler aus. Nachdem Sie nun eine object deklariert haben, können Sie auf ihre Eigenschaften und Methoden zugreifen.

myString = myRange.Value
64
Michael

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 den Laufzeitfehler # 91 Object variable oder With Blockvariable nicht gesetzt . Dies liegt daran, dass mussSet verwenden muss, um einer Objektreferenz einen Variablenwert zuzuweisen. Dann funktioniert der Code über

Ich denke, der folgende Code veranschaulicht, worüber Sie wirklich fragen. Nehmen wir an, wir deklarieren keinen Typ und lassen stattdessen r 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

Also, brechen wir ab, was hier passiert.

  1. r ist als Variante deklariert

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. r ist auf die Range-Zelle "A1" gesetzt.

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. r ist auf den Wert der Standardeigenschaft von Range("A1") gesetzt.

    r = Range("A1") ' TypeName(r) returns "String"
    

In diesem Fall lautet die Standardeigenschaft eines Bereichs .Value, daher sind die folgenden zwei Codezeilen gleichwertig.

r = Range("A1")
r = Range("A1").Value

Weitere Informationen zu Standardobjekteigenschaften finden Sie unter Chip Pearson "Standardmitglied einer Klasse" .


Wie für Ihr Set-Beispiel:

Andere Zeiten verwende ich

Set r = Range("A1")

Dies würde nicht funktionieren, wenn nicht zuvor erklärt wurde, dass r ein Range- oder Variant-Objekt ist ... mit der Dim-Anweisung - es sei denn, Sie haben Option Explicit nicht aktiviert, was Sie sollten. Immer. Andernfalls verwenden Sie Bezeichner, die Sie nicht deklariert haben, und sie werden implizit als Varianten deklariert.

56
RubberDuck

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 Folgendes schreiben:

Dim r As Integer
r=5
7

Dim deklariert einfach den Wert und den Typ.

Set weist der Variablen einen Wert zu.

4
Justin Niessner

Wenn eine Variable als Objekt definiert ist, z. Dim myfldr As Folder wird mit dem Schlüsselwort "Set" ein Wert zugewiesen.

1
user2479175

Dim ist die Abkürzung für Dimension und wird in VBA und VB6 verwendet, um lokale Variablen zu deklarieren.

Set dagegen hat nichts mit Variablendeklarationen zu tun. Das Schlüsselwort Set wird verwendet, um einem neuen Objekt eine Objektvariable zuzuweisen .

Ich hoffe, das macht den Unterschied für Sie klar.

1
IqbalHamid

Gemäß der VBA-Hilfe für die SET-Anweisung wird ein Verweis auf ein Objekt festgelegt. Wenn Sie 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!

0
Soroush