【问题标题】:Why is this macro copying multiple times?为什么这个宏会复制多次?
【发布时间】:2014-11-13 19:33:22
【问题描述】:

我找到了这个宏,它完成了我需要它做的事情,但是每当它被激活时,它似乎会多次复制/粘贴数据。我的主列表应该只有 75 行左右,而当它运行时,它会以 268 行结束。为什么要这样做?另外,有没有办法编辑它,所以如果工作表在“A1”之后没有数据,它不会复制该工作表?

Option Explicit

Private Sub Worksheet_Activate()

'Merge all sheets in a workbook into one summary sheet (stacked)
Dim cs As Worksheet, ws As Worksheet, LR As Long, NR As Long

Application.ScreenUpdating = False

Set cs = Sheets("Master List")
cs.Activate
Range("A2:F" & Rows.Count).ClearContents

For Each ws In Worksheets
    If ws.Name <> "Master List" Then
        NR = cs.Range("A" & Rows.Count).End(xlUp).Row + 1
        LR = ws.Range("A" & Rows.Count).End(xlUp).Row
        ws.Range("A2:F" & LR).copy cs.Range("A" & NR)
    End If
Next ws

Application.ScreenUpdating = True

End Sub

【问题讨论】:

  • 要跳过单元格 A1 中没有数据的 WS,将条件更改为:If ws.Name &lt;&gt; "Master List" And isempty(ws.Range("A1")) = False Then

标签: excel vba


【解决方案1】:

您在工作簿的 Private Sub Worksheet_Activate() 事件中有此内容。如果这被写入“主列表”工作表的代码中,那么像使用cs.activate 行一样激活工作表将再次触发宏……当前正在运行的宏。很难说为什么这只会创建 268 而不是无限的,或者是双倍的……这很难说,可能取决于 excel 的工作速度,它是单线程或 Excel 和 VBA 的其他一些深层次的黑暗之谜。

代替

cs.activate
range("a2:f" & rows.count).clearcontents

试试

cs.range("a2.f" & rows.count).clearcontents

如果你发现自己在你的 vba 代码中写了 .activate.select,那么你可能做的不太好。

【讨论】:

  • 感谢您的快速回复!我做了你建议的编辑,但最终结果是一样的。它似乎也没有按顺序重复。我将创建一个全新的工作簿,看看是否会发生同样的事情。编辑:我想我想通了,工作表在 VBA 列表上都是乱序的,只是要将所有数据复制到一个新的工作簿,工作表按顺序排列。
  • 工作表的顺序应该没有区别。代码要么循环遍历每张工作表并获取其数据,要么不获取。编辑:我认为按顺序排列对您的需求很重要。我的错。
  • 跟进:同样的事情,它会先复制工作表 1,然后复制工作表 3,然后再复制回 1...我不关心主工作表上数据的顺序,因为可以过滤,它是只是数据被重复了
  • 只是为了确定,在我试图弄清楚这一点之前,你肯定会删除cs.activate 行。您可以确认那里没有其他activeselect 代码吗?其他工作表中是否还有其他代码由worksheet_activate 或任何其他类似类型的事件触发?
  • @JNevill 很奇怪,我使用了确切的代码,将代码添加到“主列表”表的代码中并按预期工作。没有欺骗。
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 2016-07-02
  • 2023-03-15
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
相关资源
最近更新 更多