资格参考
当提到 worksheet
,range
或 cells
时,完全限定参考是很重要的。
例如:
ThisWorkbook.Worksheets("Sheet1").Range(Cells(1, 2), Cells(2, 3)).Copy
不完全限定:Cells
引用没有与之关联的工作簿和工作表。没有明确的引用,Cells 默认引用 ActiveSheet
。因此,如果 Sheet1
以外的工作表是当前的 ActiveSheet
,则此代码将失败(产生不正确的结果)。
解决此问题的最简单方法是使用 With
语句,如下所示:
With ThisWorkbook.Worksheets("Sheet1")
.Range(.Cells(1, 2), .Cells(2, 3)).Copy
End With
或者,你可以使用 Worksheet 变量。 (如果你的代码需要引用多个工作表,这很可能是首选方法,例如将数据从一个工作表复制到另一个工作表。)
Dim ws1 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
ws1.Range(ws1.Cells(1, 2), ws1.Cells(2, 3)).Copy
另一个常见问题是在不限定工作簿的情况下引用 Worksheets 集合。例如:
Worksheets("Sheet1").Copy
工作表 Sheet1
不完全合格,缺少工作簿。如果代码中引用了多个工作簿,则可能会失败。而是使用以下之一:
ThisWorkbook.Worksheets("Sheet1") '<--ThisWorkbook refers to the workbook containing
'the running VBA code
Workbooks("Book1").Worksheets("Sheet1") '<--Where Book1 is the workbook containing Sheet1
但是,请避免使用以下内容:
ActiveWorkbook.Worksheets("Sheet1") '<--Valid, but if another workbook is activated
'the reference will be changed
同样,对于 range
对象,如果没有明确限定,range
将引用当前活动的工作表:
Range("a1")
是相同的:
ActiveSheet.Range("a1")