【问题标题】:How to keep VBA code when copying worksheet with openpyxl?使用openpyxl复制工作表时如何保留VBA代码?
【发布时间】:2018-10-04 13:12:46
【问题描述】:

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

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

我查看了 worksheet.vba_code 属性,但它似乎只包含一些工作表属性,而不包含 VBA 代码。

【问题讨论】:

    标签: python excel vba openpyxl


    【解决方案1】:

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

    【讨论】:

    • 嗯...这就是我担心的...我已经尝试手动复制该属性,但它不起作用。
    • 控件之类的东西还有其他依赖项。 openpyxl 中对这些的支持仅限于重新创建原始文件的存档结构,因此大多数更改都会破坏这一点。其中一些可以改进,但我怀疑不是你需要的。这也是 copy_worksheet 范围有限的原因。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      相关资源
      最近更新 更多