Kopiera VBA makro UserForm DesignerStorage från mallen till mål arbetsboken

Möjliga användningsscenario

Aspose.Cells låter dig kopiera ett VBA-projekt från en Excel-fil till en annan Excel-fil. VBA-projektet består av olika typer av moduler, t.ex. dokument-, procedural- och designarmoduler. Alla moduler kan kopieras med enkel kod, men för designermodulen finns det some extra data som kallas Designer Storage som behöver komma åt eller kopieras. De följande två metoderna hanterar Designer Storage.

Kopiera VBA-makro UserForm DesignerStorage från mallen till mål arbetsboken

Se följande exempelkod. Den kopierar VBA-projektet från mallens Excel-fil till en tom arbetsbok och sparar den som utdata Excel-fil. Om du öppnar VBA-projektet inne i mallens Excel-fil ser du en Användarformulär som visas nedan. Användarformuläret består av Designer Storage, så det kommer att kopieras med användning av VbaModuleCollection.GetDesignerStorage() och VbaModuleCollection.AddDesignerStorage() metoder.

todo:image_alt_text

Följande skärmbild visar den utdata Excel-filen och dess innehåll som kopierades från mallens Excel-fil. När du klickar på knappen 1, öppnar den VBA Användarformuläret som i sig har en kommandoknapp som visar en meddelanderuta vid klick.

todo:image_alt_text

Exempelkod

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