VBA 1004循环执行宏时出错

时间:2017-05-12 21:09:52

标签: excel vba excel-vba

有人能告诉我为什么我会在以下代码中收到1004错误吗?

如果不清楚,我正在尝试循环所有不是我命名工作表的工作表并尝试选择特定范围并将其复制并粘贴到已编译的“Quant Sheet”

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

2 个答案:

答案 0 :(得分:6)

您将WS设置为Worksheets("Quant Sheet"),然后使用相同的变量ws在您的循环中使用。这可能导致了这个问题。

试试这个:

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

主要是,您希望avoid using .Select/.Activate确保您更直接地处理数据。

编辑:仅供参考,你可以通过不使用像y=y+1之类的东西来进一步提高动态,而是使用偏移量或lastRow变量,但这是个人偏好,因为它会完成同样的事情。 (我还假设xab变量在宏的其他位置使用...

答案 1 :(得分:3)

As was already stated,您无法.Select工作表中的某个单元格,而您尚未首先调用.Activate - 修复这个问题,但让你身体虚弱到处都有.Select.Activate个来电。相反,使用Worksheets循环迭代For Each集合,因此您可以获得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

除了已经提供的好答案和评论之外,您还可以充分利用代码。

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

Code Review Stack Exchange上发布您的工作代码,以便进行全面的同行评审。