资格参考

当提到 worksheetrangecells 时,完全限定参考是很重要的。

例如:

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")