![](/img/trans.png)
[英]What's difference between working with arrays declared as Dim Array() as Variant and Dim Array as Variant in VBA?
[英]What is the difference between dim and set in vba
請原諒我是 VBA 的新手。
有時我用
Dim r as Range
r = Range("A1")
其他時候我用
Set r = Range("A1")
有什么不同? 我什么時候應該使用什么?
除非引用對象引用,否則沒有理由使用set
。 僅在該上下文中使用它是一種很好的做法。 對於所有其他簡單數據類型,只需使用賦值運算符。 但是,將(維度)所有變量dim
是一個好主意:
簡單數據類型的示例包括integer
、 long
、 boolean
、 string
。 這些只是數據類型,沒有自己的方法和屬性。
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
object
一個示例是Range
、 Worksheet
或Workbook
。 這些都有自己的方法和屬性。
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
如果您嘗試使用沒有Set
的最后一行,VB 將拋出錯誤。 現在您已經聲明了一個object
您可以訪問它的屬性和方法。
myString = myRange.Value
Dim
聲明變量。
Dim r As Range
Set
將變量設置為對象引用。
Set r = Range("A1")
但是,我認為這不是您真正要問的。
有時我使用:
Dim r as Range r = Range("A1")
這永遠不會奏效。 如果沒有Set
您將收到運行時錯誤#91 Object variable 或 With block variable not set 。 這是因為您必須使用Set
將變量值分配給對象引用。 然后上面的代碼將起作用。
我認為下面的代碼說明了您真正要問的問題。 假設我們不聲明類型,而是讓r
成為Variant
類型。
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
所以,讓我們分解一下這里發生的事情。
r
被聲明為 Variant
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
設置為包含單元格“A1”的Range
Set r = Range("A1") ' TypeName(r) returns "Range"
r
設置為Range("A1")
的默認屬性的值。
r = Range("A1") ' TypeName(r) returns "String"
在這種情況下, Range 的默認屬性是.Value
,因此以下兩行代碼是等效的。
r = Range("A1")
r = Range("A1").Value
有關默認對象屬性的更多信息,請參閱Chip Pearson 的“類的默認成員” 。
至於您的Set
示例:
其他時候我用
Set r = Range("A1")
如果不首先使用Dim
語句聲明r
是Range
或Variant
對象,這將不起作用 - 除非您沒有啟用Option Explicit
,您應該這樣做。 總是。 否則,您將使用尚未聲明的標識符,並且它們都被隱式聲明為Variants 。
Dim:您正在定義一個變量(此處:r 是 Range 類型的變量)
設置:您正在設置屬性(此處:將 r 的值設置為 Range("A1") - 這不是類型,而是值)。
您必須對對象使用 set,如果 r 是一個簡單類型(例如 int、string),那么您只需編寫:
Dim r As Integer
r=5
Dim
只是聲明了值和類型。
Set
為變量賦值。
如果將變量定義為對象,例如 Dim myfldr As Folder,則使用關鍵字“Set”為其分配值。
Dim
是 Dimension 的縮寫,在 VBA 和 VB6 中用於聲明局部變量。
另一方面,設置與變量聲明無關。 Set
關鍵字用於將對象變量分配給新對象。
希望這可以為您澄清差異。
根據 VBA 對 SET 語句的幫助,它設置了對對象的引用。因此,如果更改屬性,實際對象也將更改。
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
其他 Vars 屬性也會發生變化,因此:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
實際上所有的變量都是一樣的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.