Kopiera VBA Macro UserForm DesignerStorage från mall till målarbetsbok

Möjliga användningsscenarier

Aspose.Cells låter dig kopiera VBA-projektet från en Excel-fil till en annan Excel-fil. VBA-projektet består av olika typer av moduler t.ex. Document, Procedural, Designer etc. Alla moduler kan kopieras med enkel kod men för Designer-modulen finns det lite extra data som kallas Designer Storage som måste nås eller kopieras. Följande två metoder handlar om Designer Storage.

Kopiera VBA Macro UserForm DesignerStorage från mall till målarbetsbok

Se följande exempelkod. Den kopierar VBA-projektet frånmall Excel-fili en tom arbetsbok och sparar den somutdata Excel-fil. Om du öppnar VBA-projektet inuti mallen Excel-fil, kommer du att se ett användarformulär som visas nedan. Användarformuläret består av Designer Storage, så det kommer att kopieras medVbaModuleCollection.GetDesignerStorage() ochVbaModuleCollection.AddDesignerStorage() metoder.

todo:image_alt_text

Följande skärmdump visar utdata Excel-filen och dess innehåll som kopierades från mallen Excel-fil. När du klickar på knappen 1 öppnas VBA User Form som i sig har en kommandoknapp som visar en meddelanderuta när du klickar.

todo:image_alt_text

Exempelkod

// 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);