العمل مع وحدات ماكرو VBA

Visual Basic for Applications (VBA) for 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) : "";
}