何时需要在Excel VBA中显式指定工作簿和工作表?

我写的大部分Excel代码都相当简单 – 包含在一个工作簿中。 例如,我将在Sheet1模块中具有代码,它将简单地读取:

 Private Sub DoSomethingButton_Click() 'Run subroutine in Module1 DoSomething End Sub 

然后Module1中的DoSomething子将执行我要在Sheet1上执行的操作。 当我在Sheet1引用单元格时,可以使用Cells(i, j)来表示我的内容,如果需要访问另一个表单上的内容,则只需使用Worksheets(i).Cells(j, k)

  1. 我的问题是,我是否应该一直明确指出我打算在哪张纸上工作? 如果我不这样做,我什么时候会陷入麻烦?

  2. 同样的道理:如果我只使用一个工作簿,是否需要指定ThisWorkbook ? 如果我正在使用多个工作簿,是否需要为所有工作表交互指定工作簿名称,还是仅仅更改活动工作簿/工作表,然后使用Cells(i, j)就足够了?

  3. 最后… Cells(i, j)ActiveWorksheet.Cells(i, j)之间是否有区别?

  1. 即使您在本地工作表上工作,完整引用范围参照也是一种更加整洁和良好的做法。 那么代码就可以

    • 更容易适应,
    • 更容易阅读,而且
    • 不太可能最终出现问题

    Dim ws As Worksheet
    Set ws = ActiveSheet
    ws.Cells(1, 1) = 10

    更好

    Cells(1, 1) = 10

  2. 同样,根据(1),最好使用Workbookvariables并将其直接设置为ThisWorkbook 。 我注意到,如果你有插件的代码, ThisWorkbook将引用主机插件。

  3. 不是当代码是正常的模式。 但是这里经常被问到的问题是人们在设置表外范围时有问题,在使用Cells时忘记完全限定范围。

如果您在Sheet1上并希望在Sheet2上设置对单元格的引用,那么人们通常会尝试

 Set ws = Sheets(2) Set rng1 = ws.Range(Cells(1, 1), Cells(10, 10)) 

而他们应该使用

 Set ws = Sheets(2) Set rng1 = ws.Range(ws.Cells(1, 1), ws.Cells(10, 10)) 

根据Tim Williams的评论,如果代码是在工作表模块中,那么只使用单元格而没有完全限定工作表引用将指向特定工作表(而不是ActiveSheet )。