我刚刚解决了一个问题,我将“Set”关键字放在定义行中,但我想知道的是“为什么”?

基本上,我这样做:

Dim startCell, iCell as Range 
For Each iCell in Range(whatever) 
    If iCell.value <>"" Then 
        Set startCell = Cells(iCell.Row + 1, iCell.Column) 
    End If 
Next iCell 

如果我省略“Set”关键字,代码仍然可以正常编译,但是在局部变量窗口中,我看到它的类型更改为“String”而不是“Variant/Object/Range”。为什么会这样?

请您参考如下方法:

这就是为什么。当你这样说时:

Dim startCell, iCell As Range 

你认为你已经这样做了:
Dim startCell As Range, iCell As Range 

但你真正做的是:
Dim startCell 'As Variant, by default 
Dim iCell As Range 

这是一个典型的 VBA 错误。大多数 VBA 程序员都做到了,这就是为什么大多数 VBA 程序员退回到每个 Dim 只声明一个变量的原因。语句(即每行一个)。否则很容易犯这个错误,而且以后很难发现它。

所以与 Dim startCell您已将变量隐式声明为 Variant 类型(相当于 Dim startCell As Variant )。

当你这样说时:
Set startCell = Cells(iCell.Row + 1, iCell.Column) 

Variant 获取引用赋值(Range)右侧的事物类型。然而,当你这样说时:
startCell = Cells(iCell.Row + 1, iCell.Column) 

没有 Set关键字,您不是在分配引用,而是为变量 startCell 分配值,现在获取右侧值的类型。那是什么类型?那么,Range 对象的默认属性是 Value ,所以你会得到 Cells(iCell.Row + 1, iCell.Column).Value 的类型.如果该单元格包含一个字符串,那么您将得到一个字符串。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!