使用 openpyxl 复制工作表时如何保留 VBA 代码?

How to keep VBA code when copying worksheet with openpyxl?

我有一个作品sheet,带有 VBA 代码(在 Excel 上,右键单击 sheet 名称并 查看代码) 我想复制到同一个工作簿上。

使用workbook.copy_worksheet()时,作品sheet中包含的VBA代码丢失。

我看过 worksheet.vba_code 属性,但它似乎只包含一些 sheets 属性,而不包含 VBA 代码。

我认为问题在于工作表本身包含任何VBA代码。它作为 blob 存储在 XLSX 包中,并且很可能包含对特定工作表的硬编码引用。不幸的是 VBA blob 没有被 OOXML 规范所涵盖,所以没有办法知道。如果您手动复制 vba_code 属性,您 可能 没问题,但不能保证 Excel 可能会抱怨该文件.

我找到的解决方法是将 VBA 代码添加到工作簿本身,该代码从 sheet 中每隔一个复制 VBA 代码。

我在工作簿的 VBA 代码中添加了这个:

Private Sub Workbook_Open()

    Dim CodeCopy As Object
    Dim CodePaste As Object
    Dim numLines As Integer
    Dim sheetNumber As Integer

    Set CodeCopy = ActiveWorkbook.VBProject.VBComponents(Worksheets(1).CodeName).CodeModule

    For sheetNumber = 2 To Worksheets.Count
        Set CodePaste = ActiveWorkbook.VBProject.VBComponents(Worksheets(sheetNumber).CodeName).CodeModule
        numLines = CodeCopy.CountOfLines

        If CodePaste.CountOfLines > 1 Then
            CodePaste.DeleteLines 1, CodePaste.CountOfLines
        End If

        CodePaste.AddFromString CodeCopy.Lines(1, numLines)
    Next
End Sub

解决方案基于this and this