Как сохранить код VBA при копировании листа с помощью openpyxl? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть лист с кодом VBA (в Excel щелкните правой кнопкой мыши имя листа и Просмотреть код ), который я хотел бы скопировать в ту же книгу.

При использованииworkbook.copy_worksheet(), код VBA, содержащийся в листе, потерян.

Я посмотрел на свойство worksheet.vba_code, но, похоже, оно содержит только некоторые свойства листов, а не код VBA.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Обходной путь, который я нашел, заключался в добавлении кода 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

Решение основано на этом и этом .

0 голосов
/ 04 октября 2018

Я думаю, что проблема будет в том, что сами таблицы не содержат какой-либо код VBA.Это хранится в виде большого двоичного объекта в пакете XLSX и может содержать жестко запрограммированные ссылки на конкретные рабочие листы.К сожалению, двоичные объекты VBA не охватываются спецификацией OOXML, поэтому узнать об этом невозможно.Вы могли бы быть в порядке, если вы копируете свойство vba_code вручную, но нет никаких гарантий, и вполне вероятно, что Excel будет жаловаться на файл.

...