【问题标题】:VBA 1004 Error on Loop execution of MacroVBA 1004 循环执行宏时出错
【发布时间】:2017-05-12 21:09:52
【问题描述】:

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

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

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

【问题讨论】:

标签: vba excel


【解决方案1】:

您将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 变量在您的宏中的其他地方使用...

【讨论】:

  • ws.Range("A3").Copy Destination:=mainWS.Cells(y, 1) .Paste 是一种工作表方法,而不是范围方法。
  • @Jeeped - 哦,谢谢你解决这个问题,我也注意到了。
  • 好吧,我不能以原始形式投票给你,我答应给我的狗一个芝士汉堡,所以我必须去。
  • @Jeeped - 等等……我以为你狗!
  • 这是一个新问题。撤消您的编辑并创建一个新问题。在新问题中,指定您是仅需要值还是需要值和格式。如果不调用#REF,就不能转置公式!错误。另外,蝙蝠侠怎么了? (哎呀!)
【解决方案2】:

As was already stated,你不能在工作表上的一个单元格上.Select你没有首先调用.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

除了已经提供的好的答案和 cmets,您还可以大量整理代码。

  • 缩进是。只需坚持简单的缩进即可避免大量错误
  • 删除所有未使用的变量(除非您稍后使用它们并且没有向我们展示!)
  • 不要复制和粘贴,而是直接使用.Value 设置您的值。更快更好
  • 如前所述,尽可能避免使用SelectActivate。这包括ActiveSheetActiveWorkbook
  • 给你的变量起一个好的、有意义的名字,你的代码读起来就像一本极客的 VBA 小说。这样您就可以随时知道发生了什么。

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

【讨论】:

  • 我意识到我有很多事情要做!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
相关资源
最近更新 更多