Копирование макроса VBA UserForm DesignerStorage из шаблона в целевую книгу

Возможные сценарии использования

Aspose.Cells для Python via .NET позволяет копировать VBA-проект из одного Excel-файла в другой. VBA-проект включает в себя различные типы модулей, такие как Документ, Процедурный, Конструктор и др. Все модули можно скопировать с помощью простого кода, но для модуля Конструктора требуется доступ к дополнительным данным, называемым Designer Storage, которые нужно получить или скопировать. Следующие два метода работают с Designer Storage.

Копирование макроса VBA UserForm DesignerStorage из шаблона в целевую книгу

Пожалуйста, ознакомьтесь со следующим образцовым кодом. Он копирует проект VBA из шаблонного файла Excel в пустую книгу и сохраняет его как выходной файл Excel. Если вы откроете проект VBA внутри шаблонного файла Excel, вы увидите пользовательскую форму, как показано ниже. Пользовательская форма состоит из хранилища дизайнера, поэтому оно будет скопировано с использованием методов VbaModuleCollection.get_designer_storage() и VbaModuleCollection.add_designer_storage().

todo:image_alt_text

На следующем снимке экрана показан выходной файл Excel и его содержимое, скопированные из шаблонного файла Excel. При нажатии на кнопку 1 открывается пользовательская форма VBA, которая сама содержит кнопку команды, показывающую сообщение при нажатии.

todo:image_alt_text

Образец кода

from aspose.cells import SaveFormat, SheetType, Workbook
from aspose.cells.vba import VbaModuleType
# For complete examples and data files, please go to https:# github.com/aspose-cells/Aspose.Cells-for-.NET
# Create empty target workbook
target = Workbook()
# Load the Excel file containing VBA-Macro Designer User Form
templateFile = Workbook(sourceDir + "sampleDesignerForm.xlsm")
# Copy all template worksheets to target workboook
for ws in templateFile.worksheets:
if ws.type == SheetType.WORKSHEET:
s = target.worksheets.add(ws.name)
s.copy(ws)
# Put message in cell A2 of the target worksheet
s.cells.get("A2").put_value("VBA Macro and User Form copied from template to target.")
# -----------------------------------------------
# Copy the VBA-Macro Designer UserForm from Template to Target
for vbaItem in templateFile.vba_project.modules:
if vbaItem.name == "ThisWorkbook":
# Copy ThisWorkbook module code
target.vba_project.modules.get("ThisWorkbook").codes = vbaItem.codes
else:
# Copy other modules code and data
print(vbaItem.name)
vbaMod = 0
sheet = target.worksheets.get_sheet_by_code_name(vbaItem.name)
if sheet == None:
vbaMod = target.vba_project.modules.add(vbaItem.type, vbaItem.name)
else:
vbaMod = target.vba_project.modules.add(sheet)
target.vba_project.modules[vbaMod].codes = vbaItem.codes
if vbaItem.type == VbaModuleType.DESIGNER:
# Get the data of the user form i.e. designer storage
designerStorage = templateFile.vba_project.modules.get_designer_storage(vbaItem.name)
# Add the designer storage to target Vba Project
target.vba_project.modules.add_designer_storage(vbaItem.name, designerStorage)
# Save the target workbook
target.save(outputDir + "outputDesignerForm.xlsm", SaveFormat.XLSM)