Làm việc với Macro VBA

Visual Basic cho Ứng dụng (VBA) cho Microsoft Word là ngôn ngữ lập trình đơn giản nhưng mạnh mẽ có thể được sử dụng để mở rộng chức năng. Aspose.Words API cung cấp ba lớp để có quyền truy cập vào mã nguồn dự án VBA:

  • Lớp VBAProject cung cấp quyền truy cập vào thông tin dự án VBA
  • Lớp VBAModuleCollection trả về tập hợp các module dự án VBA
  • Lớp VbaModule cung cấp quyền truy cập vào mô-đun dự án VBA
  • Bảng liệt kê VbaModuleType xác định các loại mô hình trong dự án VBA. Mô-đun này có thể là mô-đun thủ tục, mô-đun tài liệu, mô-đun lớp hoặc mô-đun thiết kế

Tạo một dự án VBA

Aspose.Words API cung cấp thuộc tính VbaProject để lấy hoặc đặt VbaProject trong tài liệu.

Ví dụ mã sau đây minh họa cách tạo dự án VBA và Mô-đun VBA cùng với các thuộc tính cơ bản, ví dụ như Tên và Loại:

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

Đọc macro

Aspose.Words cũng cung cấp cho người dùng khả năng đọc macro VBA.

Ví dụ mã sau đây cho thấy cách đọc Macro VBA từ tài liệu:

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

Viết hoặc sửa đổi macro

Sử dụng Aspose.Words, người dùng có thể sửa đổi macro VBA.

Ví dụ mã sau đây cho thấy cách sửa đổi Macro VBA bằng thuộc tính 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;

Dự án VBA sao chép

Với Aspose.Words cũng có thể sao chép các dự án VBA.

Ví dụ về mã sau đây cho thấy cách sao chép Dự án VBA bằng thuộc tính Clone để tạo bản sao của dự án hiện có:

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

Sao chép mô-đun VBA

Bạn cũng có thể sao chép các mô-đun VBA nếu cần.

Ví dụ về mã sau đây cho thấy cách sao chép Mô-đun VBA bằng thuộc tính Clone để tạo bản sao của dự án hiện có:

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

Làm việc với Tài liệu tham khảo dự án VBA

Aspose.Words API cung cấp lớp VbaReferenceCollection để làm việc với Tham chiếu dự án VBA thể hiện một tập hợp các tham chiếu dự án VBA.

Ví dụ về mã sau đây cho biết cách xóa một số tham chiếu khỏi bộ sưu tập các tham chiếu khỏi dự án 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) : "";
}