为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2019-10-17 13:59:05
请原谅我是VBA的新手。有时候我用Dim r as Ranger = Range("A1")其他时候我用Set r = Range("A1")有什么区别?我什么时候应该使用什么?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

Dim 声明变量。


Dim r As Range

Set 将变量设置为对象引用。


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 variant

r设置为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。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 1345 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信