使用 VBA 将工作表复制到新工作簿时,单元格变为 #REF 错误

Cells become #REF errors when using VBA to copy sheets into a new workbook

我正在尝试自动导出我每周生成的报告。基本上,它使用 VLOOKUP 和 INDIRECT 从一堆其他 sheet 中聚合数据。我想将摘要 sheet 作为仅值 sheet.

复制到新工作簿中

我认为可行的代码如下:

Sub ExportSSHMIL()

    Application.ScreenUpdating = False
    Application.CopyObjectsWithCells = False
    
        Sheets(Array("SSH New Starts by Site by Week", "MIL New Starts by Site by Week")).Select
        Sheets(Array("SSH New Starts by Site by Week", "MIL New Starts by Site by Week")).Copy
        
        Sheets("SSH New Starts by Site by Week").Activate
            Cells.Select
            Selection.Copy
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End Sub

但是,当上面的代码 运行 时,sheet 被“成功”复制,但是使用上述 VLOOKUP 和 INDIRECT 的所有单元格现在都是 #REF 值。

如何才能将这些 sheet 仅作为值成功复制到新工作簿中?

谢谢你任何help/advice可以给我!!

编辑: 我忘了说 sheet 还包括图表和列组,理想情况下也可以复制它们。

编辑:

问题在于使用 INDIRECT 复制公式 - 如果不出现 #REF 错误,这些公式将无法转置。您需要先 copy/paste 值,创建新工作簿,然后在不保存的情况下关闭旧工作簿。类似于:

Sub ExportSSHMIL()
    
    Application.ScreenUpdating = False
    Application.CopyObjectsWithCells = False
    
    Dim currwb As Workbook
    
    Set currwb = ThisWorkbook
    
    Sheets("SSH New Starts by Site by Week").Cells.Copy
    Sheets("SSH New Starts by Site by Week").Cells.PasteSpecial Paste:=xlPasteValues
    
    Sheets(Array("SSH New Starts by Site by Week", "MIL New Starts by Site by Week")).Copy
    
    currwb.Close False
    
End Sub

请尝试下一种方式:

    Dim sh As Worksheet, wb As Workbook, ws As Worksheet
   Set sh = ActiveSheet ' Sheets("SSH New Starts by Site by Week")
   Set wb = Workbooks.Add(xlWBATWorksheet)
   Set ws = wb.Sheets(1)
   If Not Application.CopyObjectsWithCells Then _
          Application.CopyObjectsWithCells = True
   sh.Copy 'it creates a new workbook containing the copy of the sheet...
   With ActiveWorkbook.Sheets(1).Range("A1")
        sh.UsedRange.Copy
        .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        .PasteSpecial Paste:=xlFormats
    End With
    ActiveWorkbook.Sheets(1).UsedRange.EntireColumn.AutoFit
End Sub