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 VBA projeyi başka bir Excel dosyasına 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 Tasarımcı Deposu adında ekstra veri bulunmaktadır. Aşağıdaki iki yöntem, Tasarımcı Deposu ile ilgilidir.
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. Bu kod, şablon Excel dosyasından boş bir çalışma kitabına VBA projesini kopyalar ve onu çıktı Excel dosyası olarak kaydeder. Şablon Excel dosyasındaki VBA projesini açarsanız aşağıda gösterilen gibi bir Kullanıcı Formu göreceksiniz. Kullanıcı Formu, Tasarımcı Deposu içerir, bu nedenle VbaModuleCollection.GetDesignerStorage() ve VbaModuleCollection.AddDesignerStorage() yöntemleri kullanılarak kopyalanacaktır.
Aşağıdaki ekran görüntüsü, sonuç Excel dosyasını ve şablon Excel dosyasından kopyalanan içeriği göstermekte. Button 1’e tıkladığınızda, VBA Kullanıcı Formu’nun açıldığını ve kendisi üzerinde bir komut düğmesinin tıklanması durumunda bir ileti kutusunun gösterildiğini göreceksiniz.
Örnek Kod
// 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); |