range()之前的点是什么意思?

时间:2019-12-18 16:51:31

标签: excel vba

有人可以解释一下为什么吗

If Range("BJ" & i) - Range("R" & i) = 0 Then
    Range("BJ" & i) = "OK"
Else
    Range("BJ" & i) = "NOK"
End If

与此不同吗?这些点是什么意思?

If Range("BJ" & i) - Range("R" & i) = 0 Then
    .Range("BJ" & i) = "OK"
Else
    .Range("BJ" & i) = "NOK"
End If

1 个答案:

答案 0 :(得分:2)

Range不是语言级别的关键字:它是Excel类型库中定义的类。

但是您不会在VBA(或我知道的任何语言)中调用-您会调用成员,而成员属于对象

RangeWorksheet类的属性,它返回类型为Range的对象。

当您的宿主应用程序是Excel时,Excel库将被自动引用,并且全局范围开始包括诸如[_Global]之类的隐藏对象,其成员包括一个Range属性。

如果您不是在工作表模块中,则不合格的Range是某个隐藏的全局对象的属性,该对象隐式地处理了Worksheet当前的ActiveSheet本身隐式地属于任何Workbook对象,而它恰好是当前的ActiveWorkbook

如果您属于工作表模块,则不合格的Range成员调用暗指该工作表Range属性,因此隐式限定符为Me

这意味着不合格的Range成员调用的确切作用取决于代码所写的模块。这很糟糕,因为您希望VBA指令执行此操作说,然后说出它的作用-执行此操作的指令,无论写入哪个模块,都会做完全相同的事情。

因此,请持续满足所有Range个成员通话的资格。始终无时无刻-就像您知道始终将Option Explicit放在每个模块的顶部一样。

.Range调用(如注释中提到的其他调用)合格的:这些是​​针对With块变量(假设您的代码已编译)进行的成员调用:

With SomeSheet
    .Range("A1").Value = 42
End With

有时 符合Range(以及CellsColumnsRowsNames,...和其他条件的代码Worksheet成员调用)和有时并非如此,它们非常脆弱且容易出错。 Rubberduck can help you locate implicit ActiveSheet references

还要注意两个片段中的隐式成员调用:Range对象并不“等于”另一个Range对象-实际情况是对{{1 }} 1 ,这里是Range.Value对象的.Value在这里减去:

Range

换句话说:

If Range("BJ" & i) - Range("R" & i) = 0 Then

请注意,If ActiveSheet.Range("BJ" & i).Value - ActiveSheet.Range("R" & i).Value = 0 Then 返回一个Range.Value,如果该单元格包含任何数字类型,则将是一个Variant ...但是如果给定任何单元格错误值,它将是一个Variant/Double (例如Variant/Error)-并且您无法在#N/A上进行数学运算。考虑使用Variant/Error函数来验证值是否为错误值。


1 实际上IsError的默认成员是一个隐藏的属性,恰当地命名为Range。根据使用和参数化的方式,它会返回不同的结果。在这种情况下,为[_Default]。给定参数,它将为Range.Value