永远不要假设工作表

即使你的所有工作都针对单个工作表,在代码中明确指定工作表仍然是一个很好的做法。这种习惯使得以后更容易扩展代码,或者提升 SubFunction 的部分(或全部)以便在其他地方重复使用。许多开发人员习惯于(重新)在代码中使用相同的本地变量名称作为工作表,这使得重用代码变得更加直接。

例如,以下代码含糊不清 - 但有效! - 只要开发人员不激活或更改为其他工作表:

Option Explicit
Sub ShowTheTime()
    '--- displays the current time and date in cell A1 on the worksheet
    Cells(1, 1).Value = Now()  ' don't refer to Cells without a sheet reference!
End Sub

如果 Sheet1 处于活动状态,则 Sheet1 上的单元格 A1 将填充当前日期和时间。但是,如果用户出于任何原因更改了工作表,则代码将更新工作表当前处于活动状态的任何内容。目标工作表不明确。

最佳做法是始终确定代码所涉及的工作表:

Option Explicit
Sub ShowTheTime()
    '--- displays the current time and date in cell A1 on the worksheet
    Dim myWB As Workbook
    Set myWB = ThisWorkbook
    Dim timestampSH As Worksheet
    Set timestampSH = myWB.Sheets("Sheet1")
    timestampSH.Cells(1, 1).Value = Now()
End Sub

上面的代码清楚地标识了工作簿和工作表。虽然看起来有点矫枉过正,但是创建一个关于目标引用的好习惯可以避免将来的问题。