Скопируйте VBA Macro UserForm DesignerStorage из шаблона в целевую книгу
Возможные сценарии использования
Aspose.Cells позволяет копировать проект VBA из одного файла Excel в другой файл Excel. Проект VBA состоит из различных типов модулей, т. е. документов, процедурных, конструкторов и т. д. Все модули можно скопировать с помощью простого кода, но для модуля конструктора есть некоторые дополнительные данные, называемые хранилищем конструктора, к которым необходимо получить доступ или скопировать. Следующие два метода относятся к Designer Storage.
Скопируйте VBA Macro UserForm DesignerStorage из шаблона в целевую книгу
См. следующий пример кода. Он копирует проект VBA изшаблон файла Excelв пустую книгу и сохраняет ее каквыходной файл Excel. Если вы откроете проект VBA внутри файла шаблона Excel, вы увидите форму пользователя, как показано ниже. Пользовательская форма состоит из Designer Storage, поэтому она будет скопирована с помощьюVbaModuleCollection.GetDesignerStorage() иVbaModuleCollection.AddDesignerStorage() методы.
На следующем снимке экрана показан выходной файл Excel и его содержимое, скопированное из файла шаблона Excel. Когда вы нажимаете кнопку 1, она открывает форму пользователя VBA, которая сама имеет командную кнопку, которая показывает окно сообщения при нажатии.
Образец кода
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
//Create empty target workbook | |
Workbook target = new Workbook(); | |
//Load the Excel file containing VBA-Macro Designer User Form | |
Workbook templateFile = new Workbook(srcDir + "sampleDesignerForm.xlsm"); | |
//Copy all template worksheets to target workboook | |
int sheetCount = templateFile.getWorksheets().getCount(); | |
for(int idx=0; idx<sheetCount; idx++) | |
{ | |
Worksheet ws = templateFile.getWorksheets().get(idx); | |
if (ws.getType() == SheetType.WORKSHEET) | |
{ | |
Worksheet s = target.getWorksheets().add(ws.getName()); | |
s.copy(ws); | |
//Put message in cell A2 of the target worksheet | |
s.getCells().get("A2").putValue("VBA Macro and User Form copied from template to target."); | |
} | |
}//for | |
//----------------------------------------------- | |
//Copy the VBA-Macro Designer UserForm from Template to Target | |
int modCount = templateFile.getWorksheets().getCount(); | |
for(int idx=0; idx<modCount; idx++) | |
{ | |
VbaModule vbaItem = templateFile.getVbaProject().getModules().get(idx); | |
if (vbaItem.getName().equals("ThisWorkbook")) | |
{ | |
//Copy ThisWorkbook module code | |
target.getVbaProject().getModules().get("ThisWorkbook").setCodes(vbaItem.getCodes()); | |
} | |
else | |
{ | |
//Copy other modules code and data | |
System.out.println(vbaItem.getName()); | |
int vbaMod = 0; | |
Worksheet sheet = target.getWorksheets().getSheetByCodeName(vbaItem.getName()); | |
if (sheet == null) | |
{ | |
vbaMod = target.getVbaProject().getModules().add(vbaItem.getType(), vbaItem.getName()); | |
} | |
else | |
{ | |
vbaMod = target.getVbaProject().getModules().add(sheet); | |
} | |
target.getVbaProject().getModules().get(vbaMod).setCodes(vbaItem.getCodes()); | |
if ((vbaItem.getType() == VbaModuleType.DESIGNER)) | |
{ | |
//Get the data of the user form i.e. designer storage | |
byte[] designerStorage = templateFile.getVbaProject().getModules().getDesignerStorage(vbaItem.getName()); | |
//Add the designer storage to target Vba Project | |
target.getVbaProject().getModules().addDesignerStorage(vbaItem.getName(), designerStorage); | |
} | |
}//else | |
}//for | |
//Save the target workbook | |
target.save(outDir + "outputDesignerForm.xlsm", SaveFormat.XLSM); |