Was macht das Schlüsselwort Set in VBA tatsächlich?

150

Hoffentlich eine einfache Frage, aber ich hätte gerne eine technische Antwort darauf!

Was ist der Unterschied zwischen:

i = 4

und

Set i = 4

in VBA? Ich weiß, dass Letzteres einen Fehler auslösen wird, aber ich verstehe nicht ganz warum.

Jon Artus
quelle
4
Hintergrund hier: stackoverflow.com/a/9924325/17034
Hans Passant

Antworten:

95

setwird verwendet, um einem Objekt einen Verweis zuzuweisen. Das C-Äquivalent wäre

 int i;
int* ref_i;

i = 4; // Assigning a value (in VBA: i = 4)
ref_i = &i; //assigning a reference (in VBA: set ref_i = i)
Treb
quelle
5
Eine VB-Objektreferenz ist nicht ganz dasselbe wie ein C-Zeiger. Und es gibt kein Äquivalent von "& i" in VB.
Tomalak
10
Nein ganz gleich, nein. Aber nah genug, um das Konzept zu verstehen.
Treb
@Tomalak: Sie könnten VarPtr ()
Atmocreations
Dies ist keine gute Analogie. Nehmen Sie dieses Beispiel ( VBA on the left | C on the right) : Dim A, B As Range | Range A, B;. Mit Ihrer Analogie zu gehen, A = B | A = B;wäre korrekt (und es wäre in C), ist aber Set A = B | A = &B;in VBA tatsächlich korrekt (und es würde in C fehlschlagen). In VBA A = Bund Set A = Bsind beide gleichbedeutend mit C A = B;! Die Unterscheidung erfolgt woanders.
Niko O
77

In Ihrem Fall wird ein Fehler ausgegeben. :-)

Setweist eine Objektreferenz zu. Für alle anderen Zuweisungen ist die (implizite, optionale und wenig verwendete) LetAnweisung korrekt:

Set object = New SomeObject
Set object = FunctionReturningAnObjectRef(SomeArgument)

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

i = 0
i = FunctionReturningAValue(SomeArgument)
Tomalak
quelle
44

Von MSDN :

Set-Schlüsselwort: In VBA ist das Set-Schlüsselwort erforderlich, um zwischen der Zuweisung eines Objekts und der Zuweisung der Standardeigenschaft des Objekts zu unterscheiden. Da Standardeigenschaften in Visual Basic .NET nicht unterstützt werden, wird das Schlüsselwort Set nicht benötigt und nicht mehr unterstützt.

Galwegisch
quelle
Gut gefunden, aber ein Link zu dem Artikel, den Sie auf MSDN gefunden haben, wäre noch besser :)
Neil Barnwell
1
@Neil - der Link ist da, wenn Sie in meinem Beitrag auf MSDN klicken.
Galwegian
2
Wenn Sie den MSDN kopieren, dann mindestens den richtigen Artikel. Dieser bezieht sich auf VB.NET, nicht auf VBA.
Tomalak
1
OP fragt nach VBA, und obwohl die Informationen zu Set, die für die Verwendung in .NET nicht mehr erforderlich sind, nützlich sind, ist es ein Off-Topic und nicht hilfreich für Leute, die mit dem Object variable or With block variable not setFehler von VBA hierher kommen :)
AJP
7
Vielen Dank für den Auszug aus MSDN. Alle anderen Antworten, auch die akzeptierte, verfehlen den Punkt. 'set' dreht sich alles um das STANDARD-EIGENTUM. Lesen Sie einfach stackoverflow.com/a/9924325/717732
quetzalcoatl
10

Set wird zum Festlegen von Objektreferenzen verwendet, anstatt einen Wert zuzuweisen.

LeppyR64
quelle
1

Set wird verwendet, um Variablen COM-Objekte zuzuweisen. Wenn ich ein Set mache, vermute ich, dass es unter der Haube einen AddRef () -Aufruf für das Objekt ausführt, um dessen Lebensdauer zu verwalten.

Sean
quelle
1
Es wird nicht nur für COM-Objekte verwendet, sondern für alle Objekte. Der Hauptgrund, warum Sie SET verwenden, wird von Galwegian erklärt.
Ikke
0

Wenn Sie also einen Wert festlegen möchten, benötigen Sie nicht "Festlegen". Andernfalls müssen Sie "Set" verwenden, wenn Sie sich auf ein Objekt beziehen, z. B. ein Arbeitsblatt / einen Bereich usw.

Eric Wang
quelle
-1

Set ist ein Schlüsselwort und wird verwendet, um einem Objekt in VBA einen Verweis zuzuweisen.

Zum Beispiel zeigt * das folgende Beispiel, wie Set in VBA verwendet wird.

WS als Arbeitsblatt dimmen

Setze WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

Amit Singh
quelle