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

Python 使用openpyxl复制工作表时如何保留VBA代码?,python,excel,vba,openpyxl,Python,Excel,Vba,Openpyxl,我有一个带有VBA代码的工作表(在Excel上,右键单击工作表名称和视图代码),我希望将其复制到同一工作簿上 当使用工作簿.copy_worksheet()时,工作表中包含的VBA代码将丢失 我已经看过工作表。vba\u code属性,但它似乎只包含一些工作表属性,而不是vba代码。我认为问题在于工作表本身不包含任何vba代码。它作为blob存储在XLSX包中,可能包含对特定工作表的硬编码引用。不幸的是,OOXML规范没有涵盖VBA blob,因此没有办法知道。如果手动复制vba_code属性,

我有一个带有VBA代码的工作表(在Excel上,右键单击工作表名称和视图代码),我希望将其复制到同一工作簿上

当使用
工作簿.copy_worksheet()
时,工作表中包含的VBA代码将丢失


我已经看过
工作表。vba\u code
属性,但它似乎只包含一些工作表属性,而不是vba代码。

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

我找到的解决方法是将vba代码添加到工作簿本身,每隔一个工作簿复制一次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

基于和的解决方案。

很好。。。这就是我害怕的。。。我已经尝试手动复制属性,但没有成功。控件之类的东西还有其他依赖项。openpyxl中对这些的支持仅限于重新创建原始文件的归档结构,因此大多数更改都会破坏这一点。有些地方可以改进,但我怀疑你不需要。这也是复制工作表范围有限的原因。