95 Stimmen

Was ist der Unterschied zwischen dim und set in vba

Verzeihen Sie mir, ich bin ein Neuling in VBA.

Manchmal verwende ich

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

Andere Male verwende ich

Set r = Range("A1")

Worin besteht der Unterschied? Und wann sollte ich was verwenden?

83voto

Michael Punkte 1566

Es gibt keinen Grund für die Verwendung von set es sei denn, sie beziehen sich auf eine Objektreferenz. Es ist gute Praxis, ihn nur in diesem Zusammenhang zu verwenden. Für alle anderen einfachen Datentypen sollten Sie einfach einen Zuweisungsoperator verwenden. Es ist eine gute Idee, die dim (Dimension) ALLE Variablen jedoch:

Beispiele für einfache Datentypen wären integer , long , boolean , string . Diese 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 ein Range , a 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 wird VB einen Fehler ausgeben. Da Sie nun eine object erklärt, können Sie auf seine Eigenschaften und Methoden zugreifen.

myString = myRange.Value

68voto

RubberDuck Punkte 10990

Ich glaube jedoch nicht, dass dies Ihre eigentliche Frage ist.

Manchmal verwende ich:

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

Das wird niemals funktionieren. Ohne Set erhalten Sie einen Laufzeitfehler #91 Objektvariable oder With-Block-Variable nicht gesetzt . Der Grund dafür ist, dass Sie debe verwenden. Set um einer Objektreferenz einen Variablenwert zuzuweisen. Dann wird der obige Code 意志 Arbeit.

Ich denke, der folgende Code veranschaulicht, was Sie meinen wirklich und fragt nach. Nehmen wir an, wir deklarieren keinen Typ und lassen r ein sein Variant Typ stattdessen.

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

Schauen wir uns also an, was hier passiert.

  1. r wird als Variante deklariert

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
  2. r wird auf den Range die Zelle "A1" enthält

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

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

In diesem Fall ist die Standardeigenschaft eines Bereichs .Value Die folgenden zwei Codezeilen sind also gleichwertig.

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

Weitere Informationen über Standardobjekteigenschaften finden Sie unter Chip Pearsons "Standard-Mitglied einer Klasse" .


Was Ihre Set Beispiel:

Andere Male verwende ich

Set r = Range("A1")

Dies würde nicht funktionieren, ohne vorher zu erklären, dass r ist eine Range o Variant Objekt... unter Verwendung der Dim Anweisung - es sei denn, Sie haben keine Option Explicit aktivieren, was Sie tun sollten. Immer. Andernfalls verwenden Sie Bezeichner, die Sie nicht deklariert haben, und sie sind alle implizit deklariert als Varianten .

11voto

Dim: Sie definieren eine Variable (hier: r ist eine Variable vom Typ Range)

Setzen: 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), dann würden Sie einfach schreiben:

Dim r As Integer
r=5

4voto

Justin Niessner Punkte 235353

Dim deklariert einfach den Wert und den Typ.

Set weist der Variablen einen Wert zu.

2voto

user2479175 Punkte 1

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X