نسخ VBA ماكرو UserForm DesignerStorage من قالب إلى المصنف الهدف

سيناريوهات الاستخدام الممكنة

يسمح لك Aspose.Cells بنسخ مشروع VBA من ملف Excel إلى ملف Excel آخر. يتكون مشروع VBA من أنواع مختلفة من الوحدات ، مثل مستند ، إجرائي ، مصمم ، إلخ. يمكن نسخ جميع الوحدات النمطية برمز بسيط ولكن بالنسبة لوحدة المصمم ، هناك بعض البيانات الإضافية التي تسمى التخزين المصمم والتي تحتاج إلى الوصول إليها أو نسخها. تتعامل الطريقتان التاليتان مع Designer Storage.

نسخ VBA ماكرو UserForm DesignerStorage من قالب إلى المصنف الهدف

يرجى الاطلاع على نموذج التعليمات البرمجية التالي. يقوم بنسخ مشروع VBA من ملفنموذج ملف Excel في مصنف فارغ ويحفظه كملفإخراج ملف Excel. إذا فتحت مشروع VBA داخل ملف Excel النموذجي ، فسترى نموذج مستخدم كما هو موضح أدناه. يتكون نموذج المستخدم من Designer Storage ، لذا سيتم نسخه باستخدامVbaModuleCollection.GetDesignerStorage ()وVbaModuleCollection.AddDesignerStorage ()أساليب.

! [todo: image_alt_text] (copy-vba-macro-userform-designerstorage-from-template-to-target-workbook_1.png)

تُظهر لقطة الشاشة التالية ملف Excel الناتج ومحتوياته التي تم نسخها من ملف Excel النموذجي. عند النقر فوق الزر 1 ، فإنه يفتح نموذج مستخدم VBA الذي يحتوي في حد ذاته على زر أمر يعرض مربع رسالة عند النقر عليه.

! [todo: image_alt_text] (copy-vba-macro-userform-designerstorage-from-template-to-target-workbook_2.png)

عينة من الرموز

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