Vba'da dim ve set arasındaki fark nedir


82

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:


78

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

3
Bunu anlamak için hangi öğretici veya kitaba başvurduğunuzu öğrenebilir miyim?
Ram

18
Bu cevap "neden" i gerçekten açıklamıyor
kizzx2

1
VBA çok zekidir, birçok dil gibi ne yaptığınızı ona söylemenizi gerektirmez. Ancak bu, zaman ekler. Her türden farklı varyantta bir dizi farklı boyut kullanıyorsanız, o zaman zamanı ekler. VBA'ya bir değişken gördüğünde ne bekleyeceğini söylerseniz, onu çözmesi gerekmez. Ayrıca VBA'ya bir değişkenin bir tamsayı olduğunu söylerseniz, o kadar RAM kullanmaz. İkinci nokta muhtemelen yaygın küçük VBA projelerinde o kadar geçerli olmasa da, hala iyi bir kodlama uygulamasıdır.
Hızlı

o kullanılmasının bir sakıncası yoktur Setolmadan Dimilk değişkeni ing?
gündönümü333

64

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.

  1. r bir Varyant olarak ilan edildi

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. rRangeiçeren hücre "A1" olarak ayarlanmış

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. 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 .


@PierreClaverie Evet :) Dim ve Set
Wolf

1
@ Wolf farkında olup olmadığından emin değil, ancak VBA dili referansı artık github'da tutuluyor. github.com/OfficeDev/VBA-content/blob/master/VBA/…
RubberDuck

@RubberDuck Farkında değildim (vb * konusunda yeniyim), bu notu eklediğiniz için teşekkürler.
Wolf

Rica ederim @ Wolf. Bu günlerde VBA ve eski VB6 belgelerini bulmanın zor olabileceğini biliyorum.
RubberDuck

8

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


2

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.


1

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.


0

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!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.