何时需要在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)
。
-
我的问题是,我是否应该一直明确指出我打算在哪张纸上工作? 如果我不这样做,我什么时候会陷入麻烦?
-
同样的道理:如果我只使用一个工作簿,是否需要指定
ThisWorkbook
? 如果我正在使用多个工作簿,是否需要为所有工作表交互指定工作簿名称,还是仅仅更改活动工作簿/工作表,然后使用Cells(i, j)
就足够了? -
最后…
Cells(i, j)
和ActiveWorksheet.Cells(i, j)
之间是否有区别?
-
即使您在本地工作表上工作,完整引用范围参照也是一种更加整洁和良好的做法。 那么代码就可以
- 更容易适应,
- 更容易阅读,而且
- 不太可能最终出现问题
码
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Cells(1, 1) = 10
更好
Cells(1, 1) = 10
-
同样,根据(1),最好使用
Workbook
variables并将其直接设置为ThisWorkbook
。 我注意到,如果你有插件的代码,ThisWorkbook
将引用主机插件。 -
不是当代码是正常的模式。 但是这里经常被问到的问题是人们在设置表外范围时有问题,在使用
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 )。