VBA Excel复制工作簿到另一个工作簿时出现问题——在特定文件上复制时应用程序挂起

4

我有一个问题,实话实说让我很困惑。

我正在复制一个“主”工作簿中的一组工作簿(复制所有工作表)。 有两种方法可以使用,要么通过复制每个工作簿中的每个工作表来逐个复制到主工作簿中,或者将整个工作簿复制并放置在主工作簿中。 我正在使用第二种方法,使用数组丢弃不需要的工作表。

Dim ws() As String ' declare string array
ReDim ws(wb.Worksheets.Count) As String ' set size dynamically
Dim counter As Long ' running counter for ws array
counter = 0
For c = 1 to WS_Count
If wb.Worksheets(c).Name <> "TEST" Then
    ws(counter) = wb.Worksheets(c).Name
    counter = counter + 1
End If
Next

ReDim Preserve ws(counter-1) As String wb.Worksheets(ws).Copy Before:=master.Worksheets(master.Worksheets.Count)

我尝试过两种方法,对于某些文件都能很好地工作:

1)第一种方法存在问题,因为它会保留对原始文件的引用,所以我改用了第二种方法,绕过了这个问题,因为不会保留任何引用。

2)第二种方法在某些文件中会导致某种无限循环。有趣的是,如果我改变它们合并的顺序,命令就不会卡住,在另外约50个工作簿的情况下,代码似乎可以正常工作。(请注意,这个问题不会发生在方法1上,但由于文件链接已被丢弃,因此该方法已被放弃)

它被卡住的那行代码(没有错误)是

wb.Worksheets(ws).Copy Before:=master.Worksheets(master.Worksheets.Count)

有人遇到过文件不想合并的问题吗?我是否达到了某个限制?我很迷茫,因为在使用26个不同的工作簿时,我的整个代码成功创建了一个包含896个工作表的主工作簿。在这个被卡住的集合中,我正在将一个包含164个文件的工作表文件与一个新的包含164个文件的工作表合并。 我使用的是Office Professional Plus 2010。

我目前正在隐藏警报,但我相信我收到了一个消息,询问我是否要等待应用程序。

能否有人指点我正确的方向?


我有一个初始的ReDim,它正在执行您所说的操作,但是我随后会删除空白条目(即测试页面)。计数器正在跟踪需要复制的页面,例如忽略名为“TEST”的页面。 - Erika
1
这是很多工作表,如果使用了太多内存,我不会感到惊讶。另外,在第一个方法中(我认为你没有展示),你可以通过将目标工作簿链接回自身来替换源链接来解决链接问题。 - brettdj
抱歉,当然,在计数器上。这是我粗心阅读的结果。 - Doug Glancy
虽然我不知道这是否能解决你的直接问题,但使用字典或集合对象比使用数组要容易得多。工作表已经有唯一的名称(至少在它们自己的工作簿中),并且从这些数据类型添加/删除项比从数组中添加/删除项要容易得多。 - David Zemens
1
@MP24 dictionary.Keys()dictionary.Values() 都会返回一个数组 :) 但是,是的,工作表的数量似乎是这里的问题。 - David Zemens
显示剩余3条评论
1个回答

0

由于您正在跳过“测试”页面,是否尝试从最后一页开始并向后步进-1?

For c = WS_Count to 1 

    If wb.Worksheets(c).Name <> "TEST" Then
        ws(counter) = wb.Worksheets(c).Name
        counter = counter - 1
    End If
Next c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接