有人可以解释一下为什么吗
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
答案 0 :(得分:2)
Range
不是语言级别的关键字:它是Excel
类型库中定义的类。
但是您不会在VBA(或我知道的任何语言)中调用类-您会调用成员,而成员属于对象
Range
是Worksheet
类的属性,它返回类型为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
(以及Cells
,Columns
,Rows
,Names
,...和其他条件的代码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
。