Was ist der Unterschied zwischen dim und set in vba

82

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?

Ram
quelle

Antworten:

78

Es gibt keinen Grund zur Verwendung, es setsei 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, dimALLE 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 objectwäre a Range, a Worksheetoder 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 objectdeklariert haben, können Sie auf deren Eigenschaften und Methoden zugreifen.

myString = myRange.Value
Michael
quelle
3
Kann ich bitte wissen, auf welches Tutorial oder Buch Sie sich bezogen haben, um dies zu verstehen?
Ram
18
Diese Antwort erklärt nicht wirklich das "Warum"
kizzx2
1
VBA ist sehr klug, es erfordert nicht, dass Sie ihm sagen, was zum Teufel Sie wie viele Sprachen tun. Dies erhöht jedoch die Zeit. Wenn Sie eine ganze Reihe unterschiedlicher Dimensionen für alle Arten unterschiedlicher Variablen verwenden, summiert sich die Zeit. Wenn Sie VBA mitteilen, was zu erwarten ist, wenn eine Variable angezeigt wird, muss sie nicht ausgearbeitet werden. Auch wenn Sie VBA mitteilen, dass eine Variable eine Ganzzahl und keine Zeichenfolge ist, nimmt sie nicht so viel RAM ein. Obwohl der letztere Punkt in herkömmlichen kleinen VBA-Projekten wahrscheinlich nicht so gültig ist, ist er immer noch eine gute Codierungspraxis.
Rapid
Ist es in Ordnung, Setohne Dimdie Variable zuerst zu verwenden?
Sonnenwende333
64

Ich glaube jedoch nicht, dass Sie das wirklich fragen.

Manchmal benutze ich:

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

Das wird niemals funktionieren. Ohne Seterhalten Sie Laufzeitfehler # 91 Objektvariable oder Mit Blockvariable nicht gesetzt . Dies liegt daran , Sie müssen verwenden Seteinen 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 rstattdessen einen VariantTyp 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.

  1. r wird als Variante deklariert

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

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. rwird 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 SetBeispiel:

Andere Male benutze ich

Set r = Range("A1")

Dies würde nicht funktionieren, ohne vorher zu deklarieren, dass res sich um ein Rangeoder ein VariantObjekt handelt ... mit der DimAnweisung - es sei denn, Sie haben nicht Option Explicitaktiviert, was Sie sollten. Immer. Andernfalls verwenden Sie Bezeichner, die Sie nicht deklariert haben und die alle implizit als Varianten deklariert sind .

RubberDuck
quelle
@PierreClaverie Ja :) es enthält die Originalreferenzen für Dim and Set
Wolf
1
@ Wolf nicht sicher, ob Sie sich bewusst sind, aber die VBA-Sprachreferenz wird jetzt auf Github beibehalten. github.com/OfficeDev/VBA-content/blob/master/VBA/…
RubberDuck
@ RubberDuck Ich war mir nicht bewusst (ich bin neu bei vb *), danke, dass du diesen Hinweis hinzugefügt hast.
Wolf
Gern geschehen @Wolf. Ich weiß, dass die VBA- und alten VB6-Dokumente heutzutage schwer zu finden sind.
RubberDuck
8

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
Tobias Schittkowski
quelle
3

Dim deklariert einfach den Wert und den Typ.

Set weist der Variablen einen Wert zu.

Justin Niessner
quelle
2

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

user2479175
quelle
1

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 SetSchlüsselwort wird verwendet, um einem neuen Objekt eine Objektvariable zuzuweisen .

Hoffe das klärt den Unterschied für dich.

IqbalHamid
quelle
0

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!

Soroush
quelle