没有原始工作簿引用的 Excel VBA 复制表

标签 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],我在复制时遇到了困难。我在处理主工作簿时不知道工作簿的文件名,因为有很多源工作簿文档。

我的问题是,有没有办法在不复制单元格工作簿引用的情况下复制具有所有格式的工作表?

我也尝试了 Paste/Paste Special 的所有变体,但是这要么会丢失工作表格式,要么仍然保留其他工作簿引用。

我希望避免查找和替换任何包含 [... .xls] 的字符串,因为它不是一个优雅的解决方案。任何正确方向的指针将不胜感激。

最佳答案

如果一次复制所有工作表,公式引用将指向复制的工作表而不是源工作表。借助以下代码,您将获得与使用 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)

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

关于没有原始工作簿引用的 Excel VBA 复制表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328526/

相关文章:

vba - 在 VBA 中复制数组引用

excel - 如何查找另一个工作簿的最后一列

python - Python包中的相对文件路径

excel - 如何在模块中声明公共(public)变量并访问工作表对象中的变量?

vba - 从VBA读取注册表子项

c++ - std::map 是否从其 const 引用创建对象的新非 const 拷贝

c++ - 传递对 C++ 构造函数的引用

excel - 单元格中的值以匹配我拥有的列表并对其下的每个单元格进行匹配(标题不好)

excel - 了解二进制 xls 文件格式

excel - 如何使用vba将一个word文档的内容复制到另一个word文档的末尾?