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
类的东西,而是使用偏移量或lastRow
variables,则可以进一步使其更具dynamic性,但这是个人偏好,因为它可以完成同样的事情。 (我还假设x
, a
和b
variables在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
设置您的值。 它更快,更好 - 正如已经指出的,尽可能避免
Select
和Activate
。 这包括ActiveSheet
和ActiveWorkbook
- 给你的variables好,有意义的名字和你的代码几乎会像一个令人讨厌的VBA小说阅读。 这样你就会知道发生了什么。
在Code Review Stack Exchange上发布您的工作代码以获得全面的同行评审。