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

时间:2018-10-04 13:12:47

标签: python excel vba openpyxl

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

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

我看过worksheet.vba_code属性,但它似乎仅包含某些工作表属性,而不包含VBA代码。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我发现的解决方法是将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

基于thisthis的解决方案。