我同意 pnuts,你在尝试什么并不明显。下面是各种例子。我希望可以根据您的要求进行调整。我使用了许多替代方法来识别工作表和范围,而无需解释语法。一旦您知道存在某种语法,您就可以在 VB 帮助或 Internet 上查找它。但是,如果您需要进一步的解释,我很乐意添加它。
第 1 点
您已经使用了 Worksheets(1) 和 Worksheet("Sheet2")。我的建议是:保持一致。
从一个新工作簿开始,我将工作表重命名为:“Sheet1”为 Sheet2”,“Sheet2”为“Sheet3”,“Sheet3”为“Sheet1”。然后我将最后一个选项卡移动到第一个位置。我放置了“A” , "B" 和 "C" 在三个工作表的单元格 A1 中。在即时窗口中,我以三种不同的方式访问工作表 1并得到三个不同的工作表:
? Worksheets(1).Cells(1,1).Value
C
? Worksheets("Sheet1").Cells(1,1).Value
A
? Sheet1.cells(1,1).value
B
好的,您在实践中不太可能遇到这样的事情。但是,如果您将“Sheet1”重命名为“xyz”,它仍然是 Worksheets(1) 和 Sheet1。但是,如果您随后添加另一个工作表并移动到最后一个选项卡,它将是“Sheet1”或 Sheet4 或 Worksheets(4)。
我不记得我曾经将工作表称为 Worksheets(1) 或 Sheet1。
如果我需要循环浏览工作表,我会写如下内容:
Option Explicit
Sub Demo1()
Dim InxWsht As Long
For InxWsht = 1 To Worksheets.Count
Debug.Print "Cell A1 of worksheet """ & Worksheets(InxWsht).Name & _
""" is " & Worksheets(InxWsht).Range("A1").Value
Next
End Sub
将以下内容输出到即时窗口:
Cell A1 of worksheet "Sheet3" is C
Cell A1 of worksheet "Sheet1" is A
Cell A1 of worksheet "Sheet2" is B
通常我会使用 Worksheets("Master") 因为“Master”是用户知道的名字。
第 2 点
你写ThisWorkbook.Worksheets(1)
但不再使用ThisWorkbook
。如果您的宏正在处理多个工作簿,请ThisWorkbook
标识包含该宏的工作簿。
我复制了我的工作簿并打开了两个版本。我使用Alt+F8运行宏并得到:

也就是说,用户可以从任何打开的工作簿运行宏。如果您认为您的用户将从不同的工作簿运行您的宏,那么您确实需要绝对清楚哪个工作簿处于活动状态。
在上面的宏 Demo1() 中,我使用了Worksheets.Count
and Worksheets(InxWsht)
。这些是指活动的工作簿。如果您需要关注多个工作簿,请编写如下内容:
Sub Demo2()
Dim InxWsht As Long
Debug.Print "Active workbook: " & ActiveWorkbook.Name
Debug.Print "ThisWorkbook: " & ThisWorkbook.Name
With ThisWorkbook
For InxWsht = 1 To .Worksheets.Count
With .Worksheets(InxWsht)
Debug.Print "Cell A1 of worksheet """ & .Name & _
""" is " & .Range("A1").Value
End With
Next
End With
End Sub
它将以下内容输出到即时窗口:
Active workbook: Book1.xls
ThisWorkbook: Book2.xls
Cell A1 of worksheet "Sheet3" is C
Cell A1 of worksheet "Sheet1" is A
Cell A1 of worksheet "Sheet2" is B
前面的句点.Worksheets.Count
表示.Worksheets(InxWsht)
它们在With
语句中标识的对象内。请注意,您可以嵌套With
语句并注意Debug.Print
Demo2() 中的语句比 Demo1() 中的语句更简洁。 With
语句对于整理代码非常有用。
我的观点又是:保持一致。如果您需要担心多个工作簿,那么您需要为每个语句担心它们,而不仅仅是一个语句。
第 3 点
避免选择工作表或范围,因为它很慢并且可能会造成混淆。我用过Range.Copy
它的效果相同Copy
,ActiveSheet.Paste
但更快更整洁。
我用各种值和格式填充了 Worksheets("Sheet1").Range(C2:C10) :

我将范围“测试”定义为 Worksheets(“Sheet2”).Range(D3:G3)。我运行了宏 Demo3(),它将以下内容输出到即时窗口:
Sheet2
$D$3:$G$3
Range "Test" is: Worksheets("Sheet2").Range(.Cells(3,4),.Cells(3,7))
并将 Worksheets("Sheet2") 设置为:

宏 Demo3() 中有很多内容,但我相信如果你慢慢研究它,你会看到每个语句的效果可能不是你所期望的。希望这可以帮助。
Sub Demo3()
Dim ColDestLeft As Long
Dim ColDestRight As Long
Dim RowDestTop As Long
Dim RowDestBot As Long
' Note: ranges are not just cells; they also identify the worksheet
Debug.Print Range("Test").Worksheet.Name
Debug.Print Range("Test").Address
RowDestTop = Range("Test").Row
RowDestBot = Range("Test").Row + Range("Test").Rows.Count - 1
ColDestLeft = Range("Test").Column
ColDestRight = Range("Test").Column + Range("Test").Columns.Count - 1
Debug.Print "Range ""Test"" is: Worksheets(""" & _
Range("Test").Worksheet.Name & """).Range(.Cells(" & _
RowDestTop & "," & ColDestLeft; "),.Cells(" & RowDestBot & _
"," & ColDestRight; "))"
Worksheets("Sheet1").Range("C2:C10").Copy Destination:=Range("Test")
Worksheets("Sheet1").Range("C2:C10").Copy _
Destination:=Range("Test").Offset(9, 4)
Worksheets("Sheet1").Range("C2:C10").Copy Destination:= _
Worksheets("Sheet2").Cells(RowDestTop + 10, ColDestLeft)
End Sub