excel-vba 何时使用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

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

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,那么它将永远无法保证要使用哪个工作簿。