Копирование макроса 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().
На следующем снимке экрана показан выходной файл Excel и его содержимое, скопированные из шаблонного файла Excel. При нажатии на кнопку 1 открывается пользовательская форма VBA, которая сама содержит кнопку команды, показывающую сообщение при нажатии.
Образец кода
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) |