使用 PHP 管理簡報中的 VBA 專案

簡介

Aspose.Slides API 包含用於處理巨集和 VBA 程式碼的類別。

新增 VBA 巨集

Aspose.Slides 提供 VbaProject 類別,讓您建立 VBA 專案(以及專案參考)並編輯現有模組。您可以使用 VbaProject 類別來管理嵌入於簡報中的 VBA。

  1. 建立 Presentation 類別的實例。
  2. 使用 VbaProject 建構函式來新增 VBA 專案。
  3. 將模組新增至 VbaProject。
  4. 設定模組的來源程式碼。
  5. 加入對 的參考。
  6. 加入對 Microsoft Office 的參考。
  7. 將參考與 VBA 專案關聯。
  8. 儲存簡報。

以下 PHP 程式碼示範如何從零開始將 VBA 巨集新增至簡報:

  # 建立簡報類別的實例
  $pres = new Presentation();
  try {
    # 建立新的 VBA 專案
    $pres->setVbaProject(new VbaProject());
    # 向 VBA 專案新增空白模組
    $module = $pres->getVbaProject()->getModules()->addEmptyModule("Module");
    # 設定模組來源程式碼
    $module->setSourceCode("Sub Test(oShape As Shape)MsgBox Test End Sub");
    # 建立對 <stdole> 的參考
    $stdoleReference = new VbaReferenceOleTypeLib("stdole", "*\\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\\Windows\\system32\\stdole2.tlb#OLE Automation");
    # 建立對 Office 的參考
    $officeReference = new VbaReferenceOleTypeLib("Office", "*\\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 專案
    $pres->getVbaProject()->getReferences()->add($stdoleReference);
    $pres->getVbaProject()->getReferences()->add($officeReference);
    # 儲存簡報
    $pres->save("test.pptm", SaveFormat::Pptm);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

移除 VBA 巨集

透過 Presentation 類別下的 VbaProject 屬性,您可以移除 VBA 巨集。

  1. 建立 Presentation 類別的實例,並載入包含巨集的簡報。
  2. 存取 Macro 模組並將其移除。
  3. 儲存已修改的簡報。
  # 載入包含巨集的簡報
  $pres = new Presentation("VBA.pptm");
  try {
    # 取得 Vba 模組並將其移除
    $pres->getVbaProject()->getModules()->remove($pres->getVbaProject()->getModules()->get_Item(0));
    # 儲存簡報
    $pres->save("test.pptm", SaveFormat::Pptm);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

擷取 VBA 巨集

  1. 建立 Presentation 類別的實例,並載入包含巨集的簡報。
  2. 檢查簡報是否包含 VBA 專案。
  3. 遍歷 VBA 專案中所有模組以檢視巨集。

以下 PHP 程式碼示範如何從包含巨集的簡報中擷取 VBA 巨集:

  # 載入包含巨集的簡報
  $pres = new Presentation("VBA.pptm");
  try {
    # 檢查簡報是否包含 VBA 專案
    if (!java_is_null($pres->getVbaProject())) {
      foreach($pres->getVbaProject()->getModules() as $module) {
        echo($module->getName());
        echo($module->getSourceCode());
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

檢查 VBA 專案是否受密碼保護

使用 VbaProject::isPasswordProtected 方法,您可以判斷專案的屬性是否受密碼保護。

  1. 建立 Presentation 類別的實例,並載入包含巨集的簡報。
  2. 檢查簡報是否包含 VBA project
  3. 檢查 VBA 專案是否受密碼保護以查看其屬性。
$presentation = new Presentation("VBA.pptm");
try {
    if ($presentation->getVbaProject() != null) { // 檢查簡報是否包含 VBA 專案。
        if ($presentation->getVbaProject()->isPasswordProtected()) {
            printf("The VBA Project '%s' is protected by password to view project properties.", 
                    $presentation->getVbaProject()->getName());
        }
    }
} finally {
    $presentation->dispose();
}

常見問題

當我將簡報儲存為 PPTX 時,會發生什麼事?

巨集將會被移除,因為 PPTX 不支援 VBA。若要保留巨集,請選擇 PPTM、PPSM 或 POTM。

Aspose.Slides 能在簡報中執行巨集,例如重新整理資料嗎?

不能。此函式庫永遠不會執行 VBA 程式碼;執行僅能在 PowerPoint 中、且具備適當的安全設定時才可能。

是否支援與連結到 VBA 程式碼的 ActiveX 控制項互動?

是的,您可以存取現有的 ActiveX 控制項、修改其屬性並將其移除。當巨集與 ActiveX 互動時,這非常有用。