Copiar el Diseñador de Almacenamiento de Macros VBA de la Plantilla al Libro de Trabajo Destino

Escenarios de uso posibles

Aspose.Cells le permite copiar el proyecto VBA de un archivo de Excel a otro archivo de Excel. El proyecto VBA consta de varios tipos de módulos, es decir, Documento, Procedural, Diseñador, etc. Todos los módulos se pueden copiar con un código simple, pero para el módulo Diseñador, hay algunos datos adicionales denominados Almacenamiento del Diseñador que deben ser accedidos o copiados. Los siguientes dos métodos se ocupan del Almacenamiento del Diseñador.

Copiar el diseñador de almacenamiento de formularios de usuario Macro de VBA de la plantilla al libro de Excel de destino

Consulte el siguiente código de ejemplo. Copia el proyecto VBA del archivo de Excel de plantilla a un libro de trabajo vacío y lo guarda como el archivo de Excel de salida. Si abre el proyecto VBA dentro del archivo de Excel de plantilla, verá un cuadro de usuario como se muestra a continuación. El formulario de usuario consta de Almacenamiento del Diseñador, por lo que se copiará utilizando los métodos VbaModuleCollection.GetDesignerStorage() y VbaModuleCollection.AddDesignerStorage().

todo:image_alt_text

La siguiente captura de pantalla muestra el archivo de Excel de salida y su contenido que se copiaron del archivo de Excel de plantilla. Cuando hace clic en el Botón 1, se abre el Formulario de usuario VBA que a su vez tiene un botón de comando que muestra un cuadro de mensajes al hacer clic.

todo:image_alt_text

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