使用 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。
我有一个作品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。