Kopieren des VBA Makro UserForm DesignerStorage von der Vorlage in die Zieltabelle

Mögliche Verwendungsszenarien

Aspose.Cells ermöglicht es Ihnen, das VBA-Projekt von einer Excel-Datei in eine andere Excel-Datei zu kopieren. Das VBA-Projekt besteht aus verschiedenen Arten von Modulen, d.h. Dokument, Prozedur, Designer usw. Alle Module können mit einfachem Code kopiert werden, aber für das Designermodul gibt es zusätzliche Daten namens Designer Storage, auf die zugegriffen oder kopiert werden muss. Die folgenden beiden Methoden behandeln das Designer Storage.

Kopieren Sie den VBA-Makro UserForm-DesignerStorage von der Vorlage in die Zieldatei

Bitte sehen Sie sich den folgenden Beispielscode an. Er kopiert das VBA-Projekt von der Vorlagen-Excel-Datei in eine leere Arbeitsmappe und speichert sie als die Ausgabe-Excel-Datei. Wenn Sie das VBA-Projekt in der Vorlagen-Excel-Datei öffnen, sehen Sie ein User-Formular wie unten gezeigt. Das User-Formular besteht aus dem Designer Storage, der mithilfe der VbaModuleCollection.GetDesignerStorage()- und VbaModuleCollection.AddDesignerStorage()-Methoden kopiert wird.

todo:image_alt_text

Der folgende Screenshot zeigt die Ausgabe-Excel-Datei und ihre Inhalte, die von der Vorlagen-Excel-Datei kopiert wurden. Wenn Sie auf Button 1 klicken, öffnet sich das VBA-Benutzerformular, das selbst eine Befehlsschaltfläche hat, die beim Klicken eine Meldungsfeld anzeigt.

todo:image_alt_text

Beispielcode

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