何时使用 ActiveWorkbook 和 ThisWorkbook

这是一个 VBA 最佳实践,总是指定你的 VBA 代码引用哪个工作簿。如果省略此规范,则 VBA 假定代码指向当前活动的工作簿(ActiveWorkbook)。

'--- the currently active workbook (and worksheet) is implied
Range("A1").value = 3.1415
Cells(1, 1).value = 3.1415

但是,当多个工作簿同时打开时 - 特别是当 VBA 代码从 Excel 加载项运行时 - 对 ActiveWorkbook 的引用可能会混淆或误导。例如,带有 UDF 的加载项检查一天中的时间并将其与存储在其中一个加载项工作表(通常用户不易看到)上的值进行比较,必须明确标识哪个工作簿是被引用。在我们的示例中,我们的开放(和活动)工作簿在单元格 A1 =EarlyOrLate() 中有一个公式,并且没有为该活动工作簿编写任何 VBA。在我们的插件中,我们有以下用户定义函数(UDF):

Public Function EarlyOrLate() As String
    If Hour(Now) > ThisWorkbook.Sheets("WatchTime").Range("A1") Then
        EarlyOrLate = "It's Late!"
    Else
        EarlyOrLate = "It's Early!"
    End If
End Function

UDF 的代码已编写并存储在已安装的 Excel 加载项中。它使用存储在名为 WatchTime 的加载项中的工作表上的数据。如果 UDF 使用了 ActiveWorkbook 而不是 ThisWorkbook,那么它永远无法保证哪个工作簿是预期的。