Python 使用openpyxl复制工作表时如何保留VBA代码?
我有一个带有VBA代码的工作表(在Excel上,右键单击工作表名称和视图代码),我希望将其复制到同一工作簿上 当使用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属性,
工作簿.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中对这些的支持仅限于重新创建原始文件的归档结构,因此大多数更改都会破坏这一点。有些地方可以改进,但我怀疑你不需要。这也是复制工作表范围有限的原因。