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