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