Jaka jest różnica między dim i set in vba

82

Przepraszam, bo jestem nowicjuszem w VBA.

Czasami używam

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

Innym razem używam

Set r = Range("A1")

Jaka jest różnica? A kiedy czego użyć?

Ram
źródło

Odpowiedzi:

78

Nie ma powodu, aby używać, setchyba że odwołuje się do odwołania do obiektu. Dobrą praktyką jest używanie go tylko w tym kontekście. W przypadku wszystkich innych prostych typów danych wystarczy użyć operatora przypisania. dimJednak dobrym pomysłem jest (zwymiarowanie) WSZYSTKICH zmiennych:

Przykłady prostych typów danych byłoby integer, long, boolean, string. Są to tylko typy danych i nie mają własnych metod ani właściwości.

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

Przykładem objectmoże być a Range, a Worksheetlub a Workbook. Mają swoje własne metody i właściwości.

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

Jeśli spróbujesz użyć ostatniej linii bez Set, VB zgłosi błąd. Teraz, gdy masz objectzadeklarowane, możesz uzyskać dostęp do jego właściwości i metod.

myString = myRange.Value
Michael
źródło
3
Czy mogę wiedzieć, do którego samouczka lub książki się odwołałeś, aby to zrozumieć?
Ram
18
Ta odpowiedź tak naprawdę nie wyjaśnia „dlaczego”
kizzx2
1
VBA jest bardzo sprytny, nie wymaga od ciebie mówienia mu, co do cholery robisz, jak wiele języków. To jednak dodaje czasu. Jeśli używasz całego szeregu różnych wymiarów na różnego rodzaju różnych wariantach, wtedy sumuje się czas. Jeśli powiesz VBA, czego się spodziewać, gdy zobaczy zmienną, nie musi tego rozpracowywać. Również jeśli powiesz VBA, że zmienna jest liczbą całkowitą, a nie łańcuchem, nie zajmie ona tyle pamięci RAM. Chociaż ta ostatnia kwestia prawdopodobnie nie jest tak ważna w typowych małych projektach VBA, nadal jest to dobra praktyka kodowania.
Szybki
czy można używać Setbez wcześniejszej Dimzmiany zmiennej?
przesilenie
64

Jednak nie sądzę, że tak naprawdę pytasz.

Czasami używam:

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

To się nigdy nie uda. Bez Setciebie pojawi się błąd wykonania # 91 Zmienna obiektu lub zmienna bloku With nie jest ustawiona . Dzieje się tak, ponieważ musisz użyć, Setaby przypisać wartość zmiennej do odwołania do obiektu. Wtedy powyższy kod będzie działał.

Myślę, że poniższy kod ilustruje, o co naprawdę pytasz. Załóżmy, że nie deklarujemy typu i zamiast tego rbędziemy Varianttypem.

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

Więc wyjaśnijmy, co się tutaj dzieje.

  1. r jest zadeklarowany jako wariant

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. rjest ustawiona na Rangezawierającą komórkę „A1”

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. rjest ustawiona na wartość tego mienia domyślnej z Range("A1").

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

W tym przypadku domyślną właściwością Range jest .Value, więc następujące dwa wiersze kodu są równoważne.

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

Aby uzyskać więcej informacji na temat domyślnych właściwości obiektu, zobacz „Default Member of a Class” Chipa Pearsona .


Jak na Setprzykład:

Innym razem używam

Set r = Range("A1")

To nie zadziałałoby bez uprzedniego zadeklarowania, że rjest to obiekt Rangelub Variant... za pomocą Diminstrukcji - chyba że nie masz Option Explicitwłączonej opcji, a powinieneś. Zawsze. W przeciwnym razie używasz identyfikatorów, których nie zadeklarowałeś i wszystkie są niejawnie zadeklarowane jako warianty .

RubberDuck
źródło
@PierreClaverie Tak :) zawiera oryginalne odniesienia do Dim and Set
Wolf
1
@Wolf nie jest pewien, czy wiesz, ale odniesienie do języka VBA jest teraz obsługiwane na github. github.com/OfficeDev/VBA-content/blob/master/VBA/…
RubberDuck,
@RubberDuck Nie byłem świadomy (jestem nowy na czasowniku *), dzięki za dodanie tej notatki.
Wolf,
Nie ma za co @Wolf. Wiem, że w dzisiejszych czasach trudno jest znaleźć dokumenty VBA i stare dokumenty VB6.
RubberDuck,
8

Dim: definiujesz zmienną (tutaj: r to zmienna typu Range)

Set: ustawiasz właściwość (tutaj: ustaw wartość r na Range („A1”) - to nie jest typ, ale wartość).

Musisz użyć set z obiektami, gdyby r był typem prostym (np. Int, string), to po prostu napisałbyś:

Dim r As Integer
r=5
Tobias Schittkowski
źródło
3

Dim po prostu deklaruje wartość i typ.

Set przypisuje wartość zmiennej.

Justin Niessner
źródło
2

Jeśli zmienna jest zdefiniowana jako obiekt, np. Dim myfldr As Folder, przypisywana jest jej wartość za pomocą słowa kluczowego „Set”.

user2479175
źródło
1

Dim jest skrótem od Dimension i jest używane w VBA i VB6 do deklarowania zmiennych lokalnych.

Z drugiej strony set nie ma nic wspólnego z deklaracjami zmiennych. Słowo Setkluczowe służy do przypisywania zmiennej obiektu do nowego obiektu.

Mam nadzieję, że to wyjaśnia różnicę.

IqbalHamid
źródło
0

Zgodnie z pomocą VBA w instrukcji SET ustawia odniesienie do obiektu. Więc jeśli zmienisz właściwość, rzeczywisty obiekt również się zmieni.

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

inne właściwości Vars również się zmieniają, więc:

Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`

w rzeczywistości wszystkie vars są takie same!

Soroush
źródło