【发布时间】:2018-10-04 13:12:46
【问题描述】:
我有一个带有 VBA 代码的工作表(在 Excel 上,右键单击工作表名称并查看代码),我想将它复制到同一个工作簿上。
使用 workbook.copy_worksheet() 时,工作表中包含的 VBA 代码会丢失。
我查看了 worksheet.vba_code 属性,但它似乎只包含一些工作表属性,而不包含 VBA 代码。
【问题讨论】:
我有一个带有 VBA 代码的工作表(在 Excel 上,右键单击工作表名称并查看代码),我想将它复制到同一个工作簿上。
使用 workbook.copy_worksheet() 时,工作表中包含的 VBA 代码会丢失。
我查看了 worksheet.vba_code 属性,但它似乎只包含一些工作表属性,而不包含 VBA 代码。
【问题讨论】:
我认为问题在于工作表本身确实不包含任何 VBA 代码。这在 XLSX 包中存储为 blob,并且可能包含对特定工作表的硬编码引用。不幸的是,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
【讨论】: