我刚刚解决了一个问题,我将“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 的类型.如果该单元格包含一个字符串,那么您将得到一个字符串。




