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

Escenarios de uso posibles

Aspose.Cells te permite copiar un 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 llamados Almacenamiento de Diseñador que deben ser accedidos o copiados. Los siguientes dos métodos tratan con el Almacenamiento de Diseñador.

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

Por favor ve el siguiente código de muestra. Copia el proyecto VBA del archivo de Excel de plantilla en un libro vacío y lo guarda como el archivo de Excel de salida. Si abres el proyecto VBA dentro del archivo de Excel de plantilla, verás un Formulario de Usuario como se muestra a continuación. El Formulario de Usuario consta de Almacenamiento de Diseñador, así que se copiará usando 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 sus contenidos que fueron copiados del archivo de Excel de plantilla. Cuando haces 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.

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-.NET
//Create empty target workbook
Workbook target = new Workbook();
//Load the Excel file containing VBA-Macro Designer User Form
Workbook templateFile = new Workbook(sourceDir + "sampleDesignerForm.xlsm");
//Copy all template worksheets to target workboook
foreach (Worksheet ws in templateFile.Worksheets)
{
if (ws.Type == SheetType.Worksheet)
{
Worksheet s = target.Worksheets.Add(ws.Name);
s.Copy(ws);
//Put message in cell A2 of the target worksheet
s.Cells["A2"].PutValue("VBA Macro and User Form copied from template to target.");
}
}//foreach
//-----------------------------------------------
//Copy the VBA-Macro Designer UserForm from Template to Target
foreach (VbaModule vbaItem in templateFile.VbaProject.Modules)
{
if (vbaItem.Name == "ThisWorkbook")
{
//Copy ThisWorkbook module code
target.VbaProject.Modules["ThisWorkbook"].Codes = vbaItem.Codes;
}
else
{
//Copy other modules code and data
System.Diagnostics.Debug.Print(vbaItem.Name);
int vbaMod = 0;
Worksheet sheet = target.Worksheets.GetSheetByCodeName(vbaItem.Name);
if (sheet == null)
{
vbaMod = target.VbaProject.Modules.Add(vbaItem.Type, vbaItem.Name);
}
else
{
vbaMod = target.VbaProject.Modules.Add(sheet);
}
target.VbaProject.Modules[vbaMod].Codes = vbaItem.Codes;
if ((vbaItem.Type == VbaModuleType.Designer))
{
//Get the data of the user form i.e. designer storage
byte[] designerStorage = templateFile.VbaProject.Modules.GetDesignerStorage(vbaItem.Name);
//Add the designer storage to target Vba Project
target.VbaProject.Modules.AddDesignerStorage(vbaItem.Name, designerStorage);
}
}
}//foreach
//Save the target workbook
target.Save(outputDir + "outputDesignerForm.xlsm", SaveFormat.Xlsm);