猿问

vba中的dim和set和有什么不一样

请原谅我是VBA的新手。


有时候我用


Dim r as Range

r = Range("A1")

其他时候我用


Set r = Range("A1")

有什么区别?我什么时候应该使用什么?


慕斯709654
浏览 1346回答 3
3回答

海绵宝宝撒

Dim 声明变量。Dim r As RangeSet 将变量设置为对象引用。Set r = Range("A1")但是,我认为这不是您真正要问的。有时我使用:    Dim r as Range    r = Range("A1")这将永远行不通。如果没有,Set您将收到运行时错误#91 对象变量或With块变量未设置。这是因为必须使用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 variantr设置为Range包含单元格“ A1”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")如果不先使用语句声明r是a Range或Variantobject ,这将无法工作Dim-除非您未Option Explicit启用,否则应该这样做。总是。否则,您使用的是尚未声明的标识符,它们都隐式声明为 Variants。
随时随地看视频慕课网APP
我要回答