使用 C++ 管理簡報中的 VBA 專案
簡介
The Aspose.Slides.Vba namespace contains classes and interfaces for working with macros and VBA code.
Note
當您將包含巨集的簡報轉換為其他檔案格式 (PDF、HTML 等) 時,Aspose.Slides 會忽略所有巨集 (巨集不會被帶入產生的檔案)。
當您向簡報加入巨集或重新儲存含有巨集的簡報時,Aspose.Slides 只會寫入巨集的位元組。
Aspose.Slides 永不執行簡報中的巨集。
加入 VBA 巨集
Aspose.Slides 提供 VbaProject 類別,讓您建立 VBA 專案 (和專案參考) 及編輯現有模組。您可以使用 IVbaProject 介面來管理簡報中嵌入的 VBA。
- 建立 Presentation 類別的實例。
- 使用 VbaProject 建構式新增一個 VBA 專案。
- 向 VbaProject 新增模組。
- 設定模組的來源程式碼。
- 新增對
的參考。 - 新增對 Microsoft Office 的參考。
- 將參考與 VBA 專案關聯。
- 儲存簡報。
以下 C++ 程式碼示範如何從頭開始為簡報加入 VBA 巨集:
// 文件目錄的路徑。
const String outPath = u"../out/AddVBAMacros_out.pptm";
// 建立 presentation 類別的實例
SharedPtr<Presentation> presentation = MakeObject<Presentation>();
// 建立新的 VBA 專案
presentation->set_VbaProject(MakeObject<VbaProject>());
// 向 VBA 專案新增空白模組
SharedPtr<IVbaModule> module = presentation->get_VbaProject()->get_Modules()->AddEmptyModule(u"Module");
// 設定模組的原始程式碼
module->set_SourceCode(u"Sub Test(oShape As Shape) MsgBox \"Test\" End Sub");
// 建立對 <stdole> 的參考
SharedPtr<VbaReferenceOleTypeLib> stdoleReference =
MakeObject<VbaReferenceOleTypeLib>(u"stdole", u"*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\\Windows\\system32\\stdole2.tlb#OLE Automation");
// 建立對 Office 的參考
SharedPtr<VbaReferenceOleTypeLib> officeReference =
MakeObject<VbaReferenceOleTypeLib>(u"Office", u"*\\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.0#0#C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL#Microsoft Office 14.0 Object Library");
// 向 VBA 專案新增參考
presentation->get_VbaProject()->get_References()->Add(stdoleReference);
presentation->get_VbaProject()->get_References()->Add(officeReference);
// 儲存簡報
presentation->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptm);
移除 VBA 巨集
使用位於 Presentation 類別下的 VbaProject 屬性,您可以移除 VBA 巨集。
- 建立 Presentation 類別的實例,並載入包含巨集的簡報。
- 取得巨集模組並將其移除。
- 儲存已修改的簡報。
以下 C++ 程式碼示範如何移除 VBA 巨集:
// 文件目錄的路徑。
const String outPath = u"../out/RemoveVBAMacros_out.pptm";
const String templatePath = u"../templates/vba.pptm";
// 載入包含巨集的簡報
SharedPtr<Presentation> presentation = MakeObject<Presentation>(templatePath);
// 取得 Vba 模組並將其移除
presentation->get_VbaProject()->get_Modules()->Remove(presentation->get_VbaProject()->get_Modules()->idx_get(0));
// 儲存簡報
presentation->Save(outPath, Aspose::Slides::Export::SaveFormat::Pptm);
擷取 VBA 巨集
- 建立 Presentation 類別的實例,並載入包含巨集的簡報。
- 檢查簡報是否包含 VBA 專案。
- 逐一遍歷 VBA 專案中的所有模組,以檢視巨集內容。
以下 C++ 程式碼示範如何從包含巨集的簡報中擷取 VBA 巨集:
// 文件目錄的路徑。
const String templatePath = u"../templates/VBA.pptm";
// 載入包含巨集的簡報
SharedPtr<Presentation> pres = MakeObject<Presentation>(templatePath);
if (pres->get_VbaProject() != NULL) // 檢查簡報是否包含 VBA 專案
{
//for (SharedPtr<IVbaModule> module : pres->get_VbaProject()->get_Modules())
for (int i = 0; i < pres->get_VbaProject()->get_Modules()->get_Count(); i++)
{
SharedPtr<IVbaModule> module = pres->get_VbaProject()->get_Modules()->idx_get(i);
System::Console::WriteLine(module->get_Name());
System::Console::WriteLine(module->get_SourceCode());
}
}
檢查 VBA 專案是否有設定密碼保護
使用 IVbaProject::get_IsPasswordProtected 屬性,您可以判斷專案的屬性是否受到密碼保護。
- 建立 Presentation 類別的實例,並載入包含巨集的簡報。
- 檢查簡報是否包含 VBA 專案。
- 檢查 VBA 專案是否受到密碼保護,以檢視其屬性。
auto presentation = MakeObject<Presentation>(u"VBA.pptm");
if (presentation->get_VbaProject() != nullptr) // 檢查簡報是否包含 VBA 專案。
{
if (presentation->get_VbaProject()->get_IsPasswordProtected())
{
Console::WriteLine(u"The VBA Project '{0}' is protected by password to view project properties.", presentation->get_VbaProject()->get_Name());
}
}
presentation->Dispose();
常見問題
如果我將簡報儲存為 PPTX,巨集會發生什麼事?
巨集會被移除,因為 PPTX 不支援 VBA。若要保留巨集,請選擇 PPTM、PPSM 或 POTM。
Aspose.Slides 能在簡報內執行巨集以,例如重新整理資料嗎?
不能。此函式庫永不執行 VBA 程式碼;執行只能在 PowerPoint 中,且需符合相應的安全設定。
是否支援與 VBA 程式碼連結的 ActiveX 控制項?
支援,您可以存取現有的 ActiveX controls、修改其屬性,並將其移除。這在巨集與 ActiveX 互動時非常有用。