Taslak ve Hedef Çalışbook Arasında VBA Makro Kullanıcı Formu Tasarımcı Depolama Alanını Kopyalama

Olası Kullanım Senaryoları

Aspose.Cells, bir Excel dosyasından diğerine VBA projesini kopyalamanıza olanak tanır. VBA projesi belge, prosedürel, tasarımcı vb. çeşitli modüllerden oluşur. Tüm modüller basit bir kodla kopyalanabilir ancak Tasarımcı modül için erişilmesi veya kopyalanması gereken biraz ekstra veri olan Tasarımcı Depolama Alanı vardır. Aşağıdaki iki yöntem Tasarımcı Depolama Alanı ile ilgilenir.

Taslak ve Hedef Çalışbook Arasında VBA Makro Kullanıcı Formu Tasarımcı Depolama Alanını Kopyalama

Lütfen aşağıdaki örnek kodu inceleyin. Taslak Excel dosyasından boş bir çalışbook’a VBA projesi kopyalar ve bunu çıktı Excel dosyası olarak kaydeder. Eğer taslak Excel dosyasının içinde VBA projesini açarsanız aşağıda gösterildiği gibi bir Kullanıcı Formu göreceksiniz. Kullanıcı Formu, kendisi VbaModuleCollection.GetDesignerStorage() ve VbaModuleCollection.AddDesignerStorage() yöntemleri kullanılarak kopyalanacaktır.

todo:image_alt_text

Aşağıdaki ekran görüntüsü, kopyalanan çıktı Excel dosyasını ve içeriğini göstermektedir. Düğme 1’e tıkladığınızda, VBA Kullanıcı Formunun içinde tıklama ile bir ileti kutusu gösterir.

todo:image_alt_text

Örnek Kod

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