VBA'da acemi olduğum için beni affet.
Bazen kullanırım
Dim r as Range
r = Range("A1")
Diğer zamanlarda kullanıyorum
Set r = Range("A1")
Fark ne? Ve ne zaman neyi kullanmalıyım?
Yanıtlar:
set
Bir nesne referansına atıfta bulunmadığınız sürece kullanmak için hiçbir neden yoktur . Sadece bu bağlamda kullanmak iyi bir uygulamadır. Diğer tüm basit veri türleri için sadece bir atama operatörü kullanın. dim
Ancak TÜM değişkenleri (boyutlandırmak) iyi bir fikirdir :
Basit veri tiplerinin örnekleri olacaktır integer
, long
, boolean
, string
. Bunlar yalnızca veri türleridir ve kendi yöntemlerine ve özelliklerine sahip değildir.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Bir örneği object
a Range
, a Worksheet
veya a olabilir Workbook
. Bunların kendi yöntemleri ve özellikleri vardır.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Son satırı kullanmadan kullanmaya çalışırsanız Set
, VB bir hata atar. Artık bir object
beyanınız olduğuna göre , özelliklerine ve yöntemlerine erişebilirsiniz.
myString = myRange.Value
Set
olmadan Dim
ilk değişkeni ing?
Dim
değişkeni bildirir .
Dim r As Range
Set
değişkeni bir nesne başvurusuna ayarlar .
Set r = Range("A1")
Ancak, gerçekten istediğinin bu olduğunu sanmıyorum.
Bazen kullanıyorum:
Dim r as Range r = Range("A1")
Bu asla işe yaramayacak. Set
Siz olmadan çalışma zamanı hatası alacaksınız # 91 Nesne değişkeni veya With blok değişkeni ayarlanmadı . Eğer Bunun nedeni olmalıdır kullanmak Set
bir nesne referansına bir değişkenler değer atamayı. Sonra yukarıdaki kod olacaktır çalışır.
Bence aşağıdaki kod gerçekten ne sorduğunuzu gösteriyor. Bir tür belirtmediğimizi ve bunun yerine r
bir Variant
tür olduğunu varsayalım .
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
Öyleyse, burada neler olduğunu inceleyelim.
r
bir Varyant olarak ilan edildi
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
Range
içeren hücre "A1" olarak ayarlanmış
Set r = Range("A1") ' TypeName(r) returns "Range"
r
ayarlandığında değerin bir varsayılan özelliği arasında Range("A1")
.
r = Range("A1") ' TypeName(r) returns "String"
Bu durumda, bir Aralığın varsayılan özelliği olduğu .Value
için aşağıdaki iki kod satırı eşdeğerdir.
r = Range("A1")
r = Range("A1").Value
Varsayılan nesne özellikleri hakkında daha fazla bilgi için lütfen Chip Pearson'un "Bir Sınıfın Varsayılan Üyesi" bölümüne bakın .
Örneğinize gelince Set
:
Diğer zamanlarda kullanıyorum
Set r = Range("A1")
Bu, önce bunun r
bir Range
veya Variant
nesne olduğunu bildirmeden ... Dim
ifadeyi kullanarak - Option Explicit
etkinleştirmediyseniz, ki yapmalısınız. Her zaman. Aksi takdirde, belirtmediğiniz tanımlayıcıları kullanıyorsunuzdur ve bunların tümü dolaylı olarak Varyant olarak bildirilir .
Dim: bir değişken tanımlıyorsunuz (burada: r, Aralık türünde bir değişkendir)
Ayarla: özelliği ayarlıyorsunuz (burada: r'nin değerini Aralık ("A1") olarak ayarlayın - bu bir tür değil, bir değerdir).
Nesnelerle set kullanmalısınız, eğer r basit bir tür olsaydı (örneğin, int, string), o zaman sadece şunu yazarsınız:
Dim r As Integer
r=5
Dim
sadece değeri ve türü bildirir.
Set
değişkene bir değer atar.
Bir değişken bir nesne olarak tanımlanırsa, örneğin Klasör Olarak Dim myfldr, "Set" anahtar sözcüğü kullanılarak bir değer atanır.
Dim
Dimension'ın kısaltmasıdır ve VBA ve VB6'da yerel değişkenleri bildirmek için kullanılır.
Öte yandan set, değişken bildirimlerle ilgisi yoktur. Set
Anahtar kelime için kullanılır atamak Yeni bir nesneye bir nesne değişkeni.
Umarım bu sizin için farkı açıklığa kavuşturur.
SET ifadesindeki VBA yardımına göre, bir nesneye bir başvuru ayarlar. Yani bir özelliği değiştirirseniz gerçek nesne de değişir.
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
diğer Vars özellikleri de değişir, bu nedenle:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
gerçekte tüm değişkenler aynıdır!