テンプレートから対象のブックへVBAマクロのUserForm DesignerStorageをコピー
可能な使用シナリオ
Aspose.Cellsを使用して、1つのExcelファイルから別のExcelファイルにVBAプロジェクトをコピーできます。VBAプロジェクトにはドキュメント、手続き、デザイナーなどのさまざまなタイプのモジュールが含まれています。すべてのモジュールは簡単なコードでコピーできますが、デザイナーモジュールの場合はアクセスまたはコピーする必要のある追加データがあります。
テンプレートからターゲットワークブックへのVBAマクロUserForm DesignerStorageのコピー
以下のサンプルコードを参照してください。 これは、テンプレートExcelファイル からVBAプロジェクトを空のブックにコピーし、それを 出力Excelファイル として保存します。 テンプレートExcelファイル内のVBAプロジェクトを開くと、以下のようにユーザーフォームが表示されます。 ユーザーフォームにはデザイナーが含まれていますので、 VbaModuleCollection.GetDesignerStorage() メソッドおよび VbaModuleCollection.AddDesignerStorage() メソッドを使用してコピーされます。
以下のスクリーンショットは、テンプレートExcelファイルからコピーされた出力Excelファイルとその内容を示しています。 Button 1をクリックすると、VBAユーザーフォームが開き、そこにはさらにメッセージボックスが表示されます。
サンプルコード
// 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); |