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:
setBir 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. dimAncak 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 objecta Range, a Worksheetveya 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 objectbeyanınız olduğuna göre , özelliklerine ve yöntemlerine erişebilirsiniz.
myString = myRange.Value
Setolmadan Dimilk 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. SetSiz 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 Setbir 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 rbir Varianttü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
rRangeiçeren hücre "A1" olarak ayarlanmış
Set r = Range("A1") ' TypeName(r) returns "Range"
rayarlandığı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 .Valueiç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 rbir Rangeveya Variantnesne olduğunu bildirmeden ... Dimifadeyi kullanarak - Option Explicitetkinleş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. SetAnahtar 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!