没有原始工作簿参考的Excel VBA复制表

时间:2014-06-20 13:32:45

标签: excel vba reference copy worksheet

我有一个例程,就是从许多工作簿中复制各种工作表,然后将这些工作表粘贴到我称为“主人”的工作表中。工作簿(包含不同工作簿中的不同工作表)。

该代码运作良好,但它也保留了对原始工作表的引用,并且使用了常规的'额外的'例如=SUM([Book1]Sheet1!C13:G13)(为了使示例简单)。

我正在复制的工作表需要以完全相同的格式复制,我使用以下命令:

Dim WS_Count As Integer
WS_Count = wb.Worksheets.Count
For c = 1 To WS_Count
    If wb.Sheets(c).Name <> "TEST" Then
        wb.Sheets(c).Copy Before:=master.Worksheets(master.Sheets.Count)
    End If
Next

复制和合并文档非常有效,但是我也在从工作簿中复制一些摘要表,这些摘要表包含对表单的内部引用,我在没有原始工作簿参考[Book1]的情况下遇到复制困难。我正在处理主工作簿时,我不知道工作簿的文件名,因为有许多源工作簿文档。

我的问题是,有没有办法复制具有所有格式的工作表而不复制单元格工作簿参考?

我还尝试了粘贴/粘贴特殊的所有变体,但这会丢失工作表格式或仍然保留其他工作簿参考。

我希望避免查找和替换包含[... .xls]的任何字符串,因为它不是一个优雅的解决方案。任何指向正确方向的人都会受到赞赏。

1 个答案:

答案 0 :(得分:5)

如果您一次复制所有工作表,公式参考将指向复制的工作表而不是源工作表。您将获得与使用Shift在以下代码的帮助下选择多个工作表相同的功能:

wb.Worksheets(Array("Sheet1", "Sheet2")).Copy Before:=master.Worksheets(master.Worksheets.Count)

因此,如果您的工作表名称已修复,则可以替换Array()函数调用内部,否则您需要在For c = 1 To WS_Count循环内创建一个合适的数组,然后调用一次复制代码:

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 = 1

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) As String ' Strip of superfluous empty array entries (i.e. TEST sheets
wb.Worksheets(ws).Copy Before:=master.Worksheets(master.Worksheets.Count)

请注意,此代码未经测试。