کار با ماکرو VBA

Visual Basic for Applications (VBA) برای Microsoft Word یک زبان برنامه نویسی ساده اما قدرتمند است که می توان از آن برای گسترش عملکرد استفاده کرد. Aspose.Words API سه کلاس برای دسترسی به کد منبع پروژه VBA فراهم می کند:

  • کلاس VBAProject دسترسی به اطلاعات پروژه VBA را فراهم می کند
  • کلاس VBAModuleCollection مجموعه ماژول های پروژه VBA را برمی گرداند
  • کلاس VbaModule دسترسی به ماژول پروژه VBA را فراهم می کند
  • شمارش VbaModuleType انواع یک مدل را در یک پروژه VBA تعریف می کند. ماژول می تواند یک ماژول رویه ای، ماژول سند، ماژول کلاس یا ماژول طراح باشد

یک پروژه VBA ایجاد کنید

Aspose.Words API ویژگی VbaProject را برای دریافت یا تنظیم VbaProject در سند فراهم می کند.

مثال کد زیر نحوه ایجاد یک پروژه VBA و ماژول VBA را به همراه خصوصیات اساسی مانند نام و نوع نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
// Create a new VBA project.
VbaProject project = new VbaProject();
project.Name = "AsposeProject";
doc.VbaProject = project;
// Create a new module and specify a macro source code.
VbaModule module = new VbaModule();
module.Name = "AsposeModule";
module.Type = VbaModuleType.ProceduralModule;
module.SourceCode = "New source code";
// Add module to the VBA project.
doc.VbaProject.Modules.Add(module);
doc.Save(dataDir + "VbaProject_out.docm");

ماکروها را بخوانید

Aspose.Words همچنین قابلیت خواندن ماکروهای VBA را در اختیار کاربران قرار می دهد.

مثال کد زیر نحوه خواندن ماکروهای VBA را از سند نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "Document.dot");
if (doc.VbaProject != null)
{
foreach (VbaModule module in doc.VbaProject.Modules)
{
Console.WriteLine(module.SourceCode);
}
}

ماکروها را بنویسید یا اصلاح کنید

با استفاده از Aspose.Words، کاربران می توانند ماکروهای VBA را تغییر دهند.

مثال کد زیر نحوه اصلاح ماکروهای VBA را با استفاده از ویژگی SourceCode نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "test.docm");
VbaProject project = doc.VbaProject;
const string newSourceCode = "Test change source code";
// Choose a module, and set a new source code.
project.Modules[0].SourceCode = newSourceCode;

کلون پروژه VBA

با Aspose.Words امکان شبیه سازی پروژه های VBA نیز وجود دارد.

مثال کد زیر نحوه کلون کردن پروژه VBA را با استفاده از ویژگی Clone نشان می دهد که یک کپی از پروژه موجود ایجاد می کند:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "VbaProject_source.docm");
VbaProject project = doc.VbaProject;
Document destDoc = new Document();
// Clone the whole project.
destDoc.VbaProject = doc.VbaProject.Clone();
destDoc.Save(dataDir + "output.docm");

ماژول VBA را کلون کنید

همچنین در صورت نیاز می توانید ماژول های VBA را شبیه سازی کنید.

مثال کد زیر نحوه کلون کردن ماژول VBA را با استفاده از ویژگی Clone نشان می دهد که یک کپی از پروژه موجود ایجاد می کند:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "VbaProject_source.docm");
VbaProject project = doc.VbaProject;
Document destDoc = new Document();
destDoc.VbaProject = new VbaProject();
// Clone a single module.
VbaModule copyModule = doc.VbaProject.Modules["Module1"].Clone();
destDoc.VbaProject.Modules.Add(copyModule);
destDoc.Save(dataDir + "output.docm");

با مراجع پروژه VBA کار کنید

Aspose.Words API کلاس VbaReferenceCollection را برای کار با مراجع پروژه VBA ارائه می دهد که مجموعه ای از مراجع پروژه VBA را نشان می دهد.

مثال کد زیر نحوه حذف برخی از مراجع را از مجموعه مراجع از یک پروژه VBA نشان می دهد:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(dataDir + "VbaProject.docm");
// Find and remove the reference with some LibId path.
const string brokenPath = "brokenPath.dll";
VbaReferenceCollection references = doc.VbaProject.References;
for (int i = references.Count - 1; i >= 0; i--)
{
VbaReference reference = doc.VbaProject.References.ElementAt(i);
string path = GetLibIdPath(reference);
if (path == brokenPath)
references.RemoveAt(i);
}
doc.Save(dataDir + "NoBrokenRef.docm");
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
/// <summary>
/// Returns string representing LibId path of a specified reference.
/// </summary>
private static string GetLibIdPath(VbaReference reference)
{
switch (reference.Type)
{
case VbaReferenceType.Registered:
case VbaReferenceType.Original:
case VbaReferenceType.Control:
return GetLibIdReferencePath(reference.LibId);
case VbaReferenceType.Project:
return GetLibIdProjectPath(reference.LibId);
default:
throw new ArgumentOutOfRangeException();
}
}
/// <summary>
/// Returns path from a specified identifier of an Automation type library.
/// </summary>
/// <remarks>
/// Please see details for the syntax at [MS-OVBA], 2.1.1.8 LibidReference.
/// </remarks>
private static string GetLibIdReferencePath(string libIdReference)
{
if (libIdReference != null)
{
string[] refParts = libIdReference.Split('#');
if (refParts.Length > 3)
return refParts[3];
}
return "";
}
/// <summary>
/// Returns path from a specified identifier of an Automation type library.
/// </summary>
/// <remarks>
/// Please see details for the syntax at [MS-OVBA], 2.1.1.12 ProjectReference.
/// </remarks>
private static string GetLibIdProjectPath(string libIdProject)
{
return (libIdProject != null) ? libIdProject.Substring(3) : "";
}