Copier la macro VBA UserForm DesignerStorage du modèle au classeur cible
Scénarios d’utilisation possibles
Aspose.Cells vous permet de copier le projet VBA d’un fichier Excel dans un autre fichier Excel. Le projet VBA se compose de différents types de modules, à savoir Document, Procédural, Designer, etc. Tous les modules peuvent être copiés avec un code simple, mais pour le module Designer, il existe des données supplémentaires appelées Designer Storage qui doivent être consultées ou copiées. Les deux méthodes suivantes traitent de Designer Storage.
Copier la macro VBA UserForm DesignerStorage du modèle au classeur cible
Veuillez consulter l’exemple de code suivant. Il copie le projet VBA à partir dumodèle de fichier Exceldans un classeur vide et l’enregistre en tant quefichier Excel de sortie. Si vous ouvrez le projet VBA dans le fichier modèle Excel, vous verrez un formulaire utilisateur comme indiqué ci-dessous. Le formulaire utilisateur se compose de Designer Storage, il sera donc copié à l’aide deVbaModuleCollection.GetDesignerStorage() etVbaModuleCollection.AddDesignerStorage() méthodes.
La capture d’écran suivante montre le fichier Excel de sortie et son contenu qui ont été copiés à partir du fichier modèle Excel. Lorsque vous cliquez sur le bouton 1, il ouvre le formulaire utilisateur VBA qui a lui-même un bouton de commande qui affiche une boîte de message en cliquant.
Exemple de code
// 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); |