我刚刚解决了一个问题,我将"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
Run Code Online (Sandbox Code Playgroud)
如果省略"Set"关键字,代码仍然编译正常,但在局部变量窗口中,我看到它的类型更改为"String"而不是"Variant/Object/Range".为什么会这样?
Jea*_*ett 14
这就是为什么.当你这样说:
Dim startCell, iCell As Range
Run Code Online (Sandbox Code Playgroud)
你认为你做到了这一点:
Dim startCell As Range, iCell As Range
Run Code Online (Sandbox Code Playgroud)
但你真正做的是这样的:
Dim startCell 'As Variant, by default
Dim iCell As Range
Run Code Online (Sandbox Code Playgroud)
这是典型的VBA错误.大多数VBA程序员都做到了,这就是为什么大多数VBA程序员都会依赖于声明每个Dim语句只有一个变量(即每行一个).否则很容易犯这个错误,之后很难发现它.
因此,Dim startCell您已隐式将变量声明为Variant类型(相当于Dim startCell As Variant).
当你这样说时:
Set startCell = Cells(iCell.Row + 1, iCell.Column)
Run Code Online (Sandbox Code Playgroud)
Variant获取参考分配(Range)右侧的东西类型.但是,当你这样说时:
startCell = Cells(iCell.Row + 1, iCell.Column)
Run Code Online (Sandbox Code Playgroud)
如果没有Set关键字,则不是为变量赋值,而是为变量赋值startCell,现在获取右侧值的类型.那是什么类型的?好吧,Range对象的默认属性是Value,所以你将获得类型Cells(iCell.Row + 1, iCell.Column).Value.如果该单元格包含字符串,那么您将获得一个字符串.