我有一个例程,就是从许多工作簿中复制各种工作表,然后将这些工作表粘贴到我称为“主人”的工作表中。工作簿(包含不同工作簿中的不同工作表)。
该代码运作良好,但它也保留了对原始工作表的引用,并且使用了常规的'额外的'例如=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]的任何字符串,因为它不是一个优雅的解决方案。任何指向正确方向的人都会受到赞赏。
答案 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)
请注意,此代码未经测试。