2014-11-13 151 views
0

我发现这个宏,它做我需要它做但是每当它被激活它似乎复制/粘贴数据多次。我的主列表应该只有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 
+1

要跳过一个WS,在单元格A1中没有数据,将条件更改为:如果ws.Name <>“Master List”和isempty(ws.Range(“A1”))= False Then' – DyRuss

回答

0

您在工作簿的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,你可能做一些不那么大。

+0

你快速回复!我做了你的建议编辑,但最终的结果是一样的。它也似乎没有按顺序复制。我要创建一个全新的工作簿,看看是否会发生同样的情况。编辑:我想我找到了,VBA列表上的所有表都是乱序只要按顺序将所有数据复制到新的工作簿中。 –

+0

床单的顺序应该没有区别。代码要么循环遍历每一张表,要么抓取它的数据,要么不是。编辑:我看到这是为了您的需求是重要的。我的错。 – JNevill

+0

跟进:同样的事情,它会复制工作表1然后回到1 ...我不关心主工作表上数据的顺序,因为它可以被过滤,只是数据被复制 –