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ć?
Nie ma powodu, aby używać, set
chyba ż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. dim
Jednak 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 object
może być a Range
, a Worksheet
lub 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 object
zadeklarowane, możesz uzyskać dostęp do jego właściwości i metod.
myString = myRange.Value
Set
bez wcześniejszejDim
zmiany zmiennej?Dim
deklaruje zmienną .Dim r As Range
Set
ustawia zmienną na odniesienie do obiektu .Set r = Range("A1")
Jednak nie sądzę, że tak naprawdę pytasz.
To się nigdy nie uda. Bez
Set
ciebie pojawi się błąd wykonania # 91 Zmienna obiektu lub zmienna bloku With nie jest ustawiona . Dzieje się tak, ponieważ musisz użyć,Set
aby 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
r
będziemyVariant
typem.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.
r
jest zadeklarowany jako wariant`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
jest ustawiona naRange
zawierającą komórkę „A1”Set r = Range("A1") ' TypeName(r) returns "Range"
r
jest ustawiona na wartość tego mienia domyślnej zRange("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
Set
przykład:To nie zadziałałoby bez uprzedniego zadeklarowania, że
r
jest to obiektRange
lubVariant
... za pomocąDim
instrukcji - chyba że nie maszOption Explicit
włączonej opcji, a powinieneś. Zawsze. W przeciwnym razie używasz identyfikatorów, których nie zadeklarowałeś i wszystkie są niejawnie zadeklarowane jako warianty .źródło
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
źródło
Dim
po prostu deklaruje wartość i typ.Set
przypisuje wartość zmiennej.źródło
Jeśli zmienna jest zdefiniowana jako obiekt, np. Dim myfldr As Folder, przypisywana jest jej wartość za pomocą słowa kluczowego „Set”.
źródło
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
Set
kluczowe służy do przypisywania zmiennej obiektu do nowego obiektu.Mam nadzieję, że to wyjaśnia różnicę.
źródło
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:
w rzeczywistości wszystkie vars są takie same!
źródło