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