Copie VBA Macro UserForm DesignerStorage de la plantilla al libro de trabajo de destino
Posibles escenarios de uso
Aspose.Cells le permite copiar el proyecto VBA de un archivo de Excel a otro archivo de Excel. El proyecto de VBA consta de varios tipos de módulos, es decir, documento, procedimiento, diseñador, etc. Todos los módulos se pueden copiar con un código simple, pero para el módulo de diseñador, hay algunos datos adicionales llamados almacenamiento de diseñador a los que se debe acceder o copiar. Los dos métodos siguientes se ocupan de Designer Storage.
Copie VBA Macro UserForm DesignerStorage de la plantilla al libro de trabajo de destino
Consulte el siguiente código de ejemplo. Copia el proyecto VBA delplantilla de archivo de Excelen un libro de trabajo vacío y lo guarda como elarchivo de salida de Excel. Si abre el proyecto de VBA dentro del archivo de plantilla de Excel, verá un formulario de usuario como se muestra a continuación. El formulario de usuario consta de Designer Storage, por lo que se copiará utilizandoVbaModuleCollection.GetDesignerStorage() yVbaModuleCollection.AddDesignerStorage() métodos.
La siguiente captura de pantalla muestra el archivo de salida de Excel y su contenido, que se copiaron del archivo de plantilla de Excel. Cuando hace clic en el botón 1, se abre el formulario de usuario de VBA, que a su vez tiene un botón de comando que muestra un cuadro de mensaje al hacer clic.
Código de muestra
// 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); |