Copier le UserForm DesignerStorage du macro VBA du modèle vers le 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 tels que Document, Procédural, Designer, etc. Tous les modules peuvent être copiés avec un code simple, mais pour le module Designer, il y a des données supplémentaires appelées Designer Storage qui doivent être accédées ou copiées. Les deux méthodes suivantes traitent de Designer Storage.

Copier le stockage de concepteur de formulaire utilisateur de macro VBA du modèle vers le classeur cible

Veuillez consulter le code d’exemple suivant. Il copie le projet VBA du fichier Excel de modèle dans un classeur vide et l’enregistre sous le nom de fichier Excel de sortie. Si vous ouvrez le projet VBA à l’intérieur du fichier Excel de modèle, vous verrez un formulaire utilisateur comme indiqué ci-dessous. Le formulaire utilisateur se compose d’un stockage de concepteur, donc il sera copié à l’aide des méthodes VbaModuleCollection.GetDesignerStorage() et VbaModuleCollection.AddDesignerStorage().

todo:image_alt_text

La capture d’écran suivante montre le fichier Excel de sortie et son contenu qui ont été copiés à partir du fichier Excel modèle. Lorsque vous cliquez sur le Bouton 1, il ouvre le formulaire utilisateur VBA qui contient lui-même un bouton de commande qui affiche une boîte de message lorsque vous cliquez dessus.

todo:image_alt_text

Code d’exemple

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