macros的循环执行VBA 1004错误

任何人都可以给我一个为什么我会收到以下代码1004错误的感觉?

如果不清楚,我试图循环所有不是我命名的工作表的纸张,并尝试select一个特定的范围,并将其复制并粘贴到编译的“定量表”

Dim ws As Worksheet Dim x As Integer Dim y As Integer Dim a As Integer Dim b As Integer Set ws = Worksheets("Quant Sheet") x = 1 y = 3 a = 3 b = 2 Worksheets("Quant Sheet").Activate For Each ws In ActiveWorkbook.Worksheets If (ws.Name <> "Quant Sheet") Then ws.Range("A3").Select Selection.Copy Sheets("Quant Sheet").Select Cells(y, 1).Select ActiveSheet.Paste y = y + 1 End If Next ws 

您将WS设置为Worksheets("Quant Sheet") ,然后使用相同的variablesws在循环中使用。 这可能是造成这个问题的原因。

尝试这个:

 Dim ws As Worksheet, mainWS As Worksheet Dim x As Integer, y As Integer, a As Integer, b As Integer Set mainWS = Worksheets("Quant Sheet") x = 1 y = 3 a = 3 b = 2 For Each ws In ActiveWorkbook.Worksheets If (ws.Name <> "Quant Sheet") Then ws.Range("A3").Copy Destination:=mainWS.Cells(y, 1) y = y + 1 End If Next ws 

主要是,你想避免使用。select/。 .Activate ,以确保你更直接的数据工作。

编辑:仅供参考,如果不使用y=y+1类的东西,而是使用偏移量或lastRowvariables,则可以进一步使其更具dynamic性,但这是个人偏好,因为它可以完成同样的事情。 (我还假设xabvariables在macros中的其他地方使用…

如前所述 ,您不能在工作表上select一个尚未调用的单元格。先.Activate – 这样可以解决问题,但是会让您.Activate脆弱和慢速。select并在每个地方.Activate调用。 相反,使用For Each循环迭代Worksheets集合,这样您就可以得到一个Worksheet对象来处理每个迭代:

 Sub test() Dim quantSheet As Worksheet, tempSheet as Worksheet Dim i As Integer Set quantSheet = ThisWorkbook.Worksheets("Quant Sheet") i = 3 For Each tempSheet In ThisWorkbook.Worksheets If tempSheet.Name <> quantSheet.Name Then quantSheet.Cells(i, 1).Value = tempSheet.Range("A3").Value i = i + 1 End If Next tempSheet End Sub 

除了已经提供的良好答案和评论之外,您可以将代码进行很多整理。

  • 缩进是关键 。 只要坚持简单的缩进,就可以避免大量的错误
  • 删除所有这些未使用的variables(除非您稍后使用它们,并没有向我们展示!)
  • 而不是复制和粘贴,直接使用.Value设置您的值。 它更快,更好
  • 正如已经指出的,尽可能避免SelectActivate 。 这包括ActiveSheetActiveWorkbook
  • 给你的variables好,有意义的名字和你的代码几乎会像一个令人讨厌的VBA小说阅读。 这样你就会知道发生了什么。

在Code Review Stack Exchange上发布您的工作代码以获得全面的同行评审。