使用和不使用Set关键字之间的类型差异

App*_*Pie 5 vba

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