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ć?
Odpowiedzi:
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śniejszej Dim
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.
Czasami używam:
Dim r as Range r = Range("A1")
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ędziemy Variant
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 na Range
zawierającą komórkę „A1”
Set r = Range("A1") ' TypeName(r) returns "Range"
r
jest 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 Set
przykład:
Innym razem używam
Set r = Range("A1")
To nie zadziałałoby bez uprzedniego zadeklarowania, że r
jest to obiekt Range
lub Variant
... za pomocą Dim
instrukcji - chyba że nie masz Option 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 .
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
Dim
po prostu deklaruje wartość i typ.
Set
przypisuje wartość zmiennej.
Jeśli zmienna jest zdefiniowana jako obiekt, np. Dim myfldr As Folder, przypisywana jest jej wartość za pomocą słowa kluczowego „Set”.
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ę.
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!