Co właściwie robi słowo kluczowe Set w VBA?

150

Miejmy nadzieję, że to łatwe pytanie, ale chciałbym uzyskać techniczną odpowiedź na to!

Jaka jest różnica pomiędzy:

i = 4

i

Set i = 4

w VBA? Wiem, że ten ostatni wyrzuci błąd, ale nie do końca rozumiem dlaczego.

Jon Artus
źródło
4
Tło tutaj: stackoverflow.com/a/9924325/17034
Hans Passant Kwietnia

Odpowiedzi:

95

setsłuży do przypisania odniesienia do obiektu. Odpowiednik C byłby

 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
źródło
5
Odwołanie do obiektu VB nie jest tym samym, co wskaźnik w C. I nie ma odpowiednika „& i” w VB.
Tomalak
10
Nie całkiem to samo, nie. Ale wystarczająco blisko, abym zrozumiał tę koncepcję.
Treb
@Tomalak: Możesz użyć VarPtr ()
Atmocreations
To nie jest dobra analogia. Weźmy ten przykład ( VBA on the left | C on the right) Dim A, B As Range | Range A, B;. Idąc z twoją analogią, A = B | A = B;byłoby poprawne (i byłoby w C), ale w Set A = B | A = &B;rzeczywistości jest poprawne w VBA (i zawiodłoby w C). W VBA A = Bi Set A = BOBA są odpowiednikami C A = B;! To rozróżnienie dzieje się gdzie indziej.
Niko
77

W twoim przypadku spowoduje to błąd. :-)

Setprzypisuje odniesienie do obiektu. Dla wszystkich innych przypisań instrukcja (niejawna, opcjonalna i rzadko używana) Letjest poprawna:

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

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

i = 0
i = FunctionReturningAValue(SomeArgument)
Tomalak
źródło
44

Z MSDN :

Set Keyword: W VBA słowo kluczowe Set jest niezbędne do rozróżnienia między przypisaniem obiektu a przypisaniem domyślnej właściwości obiektu. Ponieważ właściwości domyślne nie są obsługiwane w języku Visual Basic .NET, słowo kluczowe Set nie jest potrzebne i nie jest już obsługiwane.

Galwegian
źródło
Dobrze znalezione, ale link do artykułu, który znalazłeś na MSDN byłby jeszcze lepszy :)
Neil Barnwell,
1
@Neil - link jest tam, jeśli klikniesz MSDN w moim poście.
Galwegian
2
Podczas kopiowania z MSDN, przynajmniej poprawny artykuł. Ten odnosi się do VB.NET, a nie do VBA.
Tomalak
1
OP pyta o VBA i chociaż informacja o tym, że Set nie jest już potrzebna do użytku w .NET, jest przydatna, to jest poza tematem i nie jest pomocna dla osób przyjeżdżających tutaj z Object variable or With block variable not setbłędem z VBA :)
AJP
7
Bardzo dziękuję za wyciąg z MSDN. Wszystkie inne odpowiedzi, nawet ta zaakceptowana, nie mają sensu. „zestaw” dotyczy WŁASNOŚCI DOMYŚLNEJ. Po prostu przeczytaj stackoverflow.com/a/9924325/717732
quetzalcoatl
10

Zestaw służy do ustawiania odniesień do obiektów, a nie do przypisywania wartości.

LeppyR64
źródło
1

Z góry myślę, że Set służy do przypisywania obiektów COM do zmiennych. Robiąc Set, podejrzewam, że pod maską wykonuje wywołanie AddRef () na obiekcie, aby zarządzać jego okresem życia.

Sean
źródło
1
Jest używany nie tylko dla obiektów COM, ale dla wszystkich obiektów. Główny powód, dla którego używasz SET, został wyjaśniony przez Galwegian.
Ikke,
0

Więc kiedy chcesz ustawić wartość, nie potrzebujesz "Ustaw"; w przeciwnym razie, jeśli odnosisz się do obiektu, np. arkusza / zakresu itp., musisz użyć opcji „Ustaw”.

Eric Wang
źródło
-1

Set jest słowem kluczowym i służy do przypisywania odniesienia do obiektu w VBA.

Na przykład * Poniższy przykład pokazuje, jak używać Set w VBA.

Dim WS As Arkusz

Ustaw WS = ActiveWorkbook.Worksheets („Sheet1”)

WS.Name = "Amit"

Amit Singh
źródło