PowerPoint 2010 的 VBA 快速入門

摘要: 為尚未成為程式設計師的 PowerPoint 進階使用者介紹 PowerPoint 2010 中的 Visual Basic for Applications (VBA)。包括 VBA 語言概觀、如何在 PowerPoint 2010 中存取 VBA 的指示、實際 PowerPoint VBA 程式設計問題解決方案的詳細說明,以及程式設計和偵錯的提示。

前次修改時間: 2015年4月24日

社群成員圖示

本文內容
為什麼在 PowerPoint 2010 中使用 VBA?
VBA 程式設計 101
巨集與 Visual Basic 編輯器
用來移除雜亂的巨集
尋找物件
從範例學習
建立巨集
下一步是什麼?

適用於: Office 2010 | PowerPoint 2010 | VBA

發佈日期:   2009 年 11 月

提供者:  SDK Bridge 的 Ben Chinowsky

內容

  • 為什麼在 PowerPoint 2010 中使用 VBA?

  • VBA 程式設計 101

  • 巨集與 Visual Basic 編輯器

  • 用來移除雜亂的巨集

  • 尋找物件

  • 從範例學習

  • 建立巨集

  • 下一步是什麼?

為什麼在 PowerPoint 2010 中使用 VBA?

PowerPoint 2010 包含各種功能,可協助您製作有效且令人印象深刻的簡報,而且使用者介面中的大部分功能都非常淺顯易懂。不過,雖然標準 PowerPoint 使用者介面 (UI) 中有豐富的功能組合,但是您有時候可能會想要尋找更簡單的方式來執行平凡、重複的工作,或是執行 UI 似乎無法達成的某些工作。幸好像 PowerPoint 之類的 Office 應用程式有 Visual Basic for Applications (VBA),一種可讓您擴充那些應用程式的程式設計語言。

VBA 是藉由執行以 Visual Basic 撰寫的「巨集」、逐步程序來運作。學習程式設計可能看似令人生畏,但只要一點耐心和一些像本文中的範例,許多使用者都會發現,即使只學習少量的 VBA 程式碼,都會讓他們的工作更輕鬆,並且能夠讓他們在 Office 中執行他們從前認為不可能的工作。只要學會一些 VBA,要再學習就容易多了,所以有無限的可能性。

目前使用 PowerPoint VBA 最常見的理由,就是自動化重複的工作。例如,假設簡報中含有很多您想要刪除的空白文字方塊。您不需要到每個投影片尋找、選取及刪除每個空白文字方塊,只要用 PowerPoint VBA 巨集來幫您執行就可以了。

另一個使用 PowerPoint VBA 的常見理由,就是新增 PowerPoint 的功能。例如,無論您有多少投影片,都可以建立 VBA 巨集,在簡報剛好一半的時候執行,並且快顯訊息,指出您還剩多少時間可以進行簡報。

使用 PowerPoint VBA 的其他理由還有很多,而不只是執行讓 PowerPoint 與其他 Office 應用程式搭配運行的工作。例如,您可以將簡報中的所有文字放在逗點分隔值檔案 (CSV) 中,讓您能夠在 Microsoft Excel 2010 中開啟。

注意

在某些 Office 應用程式中,您可以藉由執行巨集錄製來建立 VBA 巨集。具體地說,就是您執行數個動作,而巨集錄製會加以錄製,以供您播放。PowerPoint 2010 沒有巨集錄製;撰寫 VBA 程式碼是建立巨集的唯一方式 (您還是可以在 PowerPoint 2010 中使用 Visual Basic 編輯器,以編輯在舊版 PowerPoint 中錄製或撰寫的巨集)。

本文藉由開發刪除簡報中所有空白文字方塊的巨集來介紹 PowerPoint VBA。

VBA 程式設計 101

使用程式碼讓應用程式工作

您可能會以為撰寫程式碼很神秘或很難,但其基本原則是使用日常推論,且相當易學。The Office 2010 應用程式的建立方式是公開稱為「物件」的東西來接收指示。您與應用程式互動的方式是將指示傳送到應用程式中的各種物件。這些物件很多、富變化且具彈性,但有其限制。它們只能執行所設計的工作,而且只會執行您指示其執行的工作。

物件模型

程式設計物件在稱為應用程式「物件模型」的階層中,有系統地與彼此建立關係。物件模型大致反映出您在使用者介面中看到的樣貌;例如,PowerPoint 物件模式包含 Application、Presentation 和 Slide 等許多物件。物件模型是應用程式及其功能的概念對應。

屬性與方法

您可以藉由設定物件「屬性」及呼叫其「方法」來操作物件。設定屬性會變更物件的某些品質。呼叫方法會導致物件執行某些動作。例如,Slide 物件有一個 Copy 方法,會將投影片的複本放在剪貼簿上,另一個 Layout 屬性,會呈現投影片的版面配置。

集合

許多物件同時有單數和複數版本,也就是有一個簡報和多個簡報、一個投影片和多個投影片等等。複數版本即稱為「集合」。集合物件可用來對集合中的多個項目執行動作。本文亦討論如何使用 Slides 集合來移除簡報中各投影片上不想要的物件。

巨集與 Visual Basic 編輯器

現在您已經大概知道 Microsoft PowerPoint 2010 如何公開其物件模型,可能會迫不及待嘗試呼叫物件方法,以及設定物件屬性。若要這麼做,您必須在 Office 了解的地方,以 Office 了解的方式來撰寫程式碼;通常是使用 Visual Basic 編輯器。雖然是依預設安裝,但是很多使用者不知道其在功能區上啟用之前仍可使用。

開發人員索引標籤

所有 Office 2010 應用程式都會使用功能區。功能區上有一個索引標籤是 [開發人員] 索引標籤,可讓您存取 Visual Basic 編輯器和其他開發人員工具。因為依預設 Office 2010 不會顯示 [開發人員] 索引標籤,所以您必須完成下列程序來加以啟用:

啟用開發人員索引標籤

  1. 在 [檔案] 索引標籤上選擇 [選項],以開啟 [PowerPoint 選項] 對話方塊。

  2. 按一下對話方塊左側的 [自訂功能區]。

  3. 在對話方塊左側的 [由此選擇命令] 底下,選取 [常用命令]。

  4. 在對話方塊右側的 [自訂功能區] 底下,選取 [主要索引標籤],然後選取 [開發人員] 核取方塊。

  5. 按一下 [確定]。

在 PowerPoint 顯示 [開發人員] 索引標籤之後,請注意 [Visual Basic]、[巨集] 和 [巨集安全性] 按鈕在索引標籤上的位置。

圖 1. PowerPoint 2010 中的 [開發人員] 索引標籤

PowerPoint 2010 的 [開發人員] 索引標籤

安全性問題

按一下 [巨集安全性] 按鈕,以指定哪些巨集可以在什麼條件下執行。雖然惡意的巨集程式碼會嚴重損害電腦,但是防止您執行有用巨集的安全性條件會限制您的生產力。巨集安全性是相當複雜且牽涉甚廣的主題,如果您要使用 PowerPoint 巨集,應加以研究及了解。

為配合本文所需,當您開內含巨集的活頁簿時,如果在功能區與工作表之間出現 [安全性警告:已經停用巨集],可以按一下 [啟用內容] 按鈕啟用該巨集。

此外,也請注意,基於安全措施,您不能以預設的 PowerPoint 簡報格式 (.pptx) 來儲存巨集;您必須改為以特殊副檔名 .pptm 來儲存巨集。

Visual Basic 編輯器

在顯示 [開發人員] 索引標籤之後,您可以開啟 Visual Basic 編輯器,這是內建工具,可讓您用來撰寫和編輯 PowerPoint 的 VBA 程式碼。

在 Visual Basic 編輯器中建立新巨集

  1. 按一下 [開發人員] 索引標籤上的 [巨集] 按鈕。

  2. 在出現的 [巨集] 對話方塊中的 [巨集名稱] 底下,輸入 Hello。

  3. 按一下 [建立] 按鈕,以開啟 Visual Basic 編輯器,其中會有所輸入之新巨集的大綱。

VBA 是全功能的程式設計語言,具有相對應的全功能程式設計環境。本文僅審視用於程式設計入門那些工具,不包括 Visual Basic 編輯器中的大部分工具。請關閉 Visual Basic 編輯器左邊的 [屬性] 視窗,並忽略出現在程式碼上方的兩個下拉式清單。

圖 2. Visual Basic 編輯器

Visual Basic 編輯器

Visual Basic 編輯器包含下列程式碼。

Sub Hello()

End Sub

Sub 代表「副程式」,您現在可以將其定義為「巨集」。執行 Hello 巨集,就會執行從 Sub Hello() 到 End Sub 之間所有的程式碼。

現在請編輯巨集,使它像下列程式碼一樣。

Sub Hello()
   MsgBox("Hello world")
End Sub

回到 PowerPoint 中的 [開發人員] 索引標籤,再按一下 [巨集] 按鈕。在出現的清單中選取 [Hello] 巨集,然後按一下 [執行],即顯示內文為 "Hello world" 的小訊息方塊。

您剛才已在 PowerPoint 中建立及實作自訂 VBA 程式碼!按一下訊息方塊中的 [確定] 以關閉訊息,並結束執行巨集。

如果訊息方塊沒有出現,請檢查巨集安全性設定,並重新啟動 PowerPoint。

讓巨集可供存取

從 [檢視] 索引標籤也能打開 [巨集] 對話方塊,但如果您會經常用到某個巨集,使用鍵盤快速鍵或 [快速存取工具列] 按鈕加以存取,可能會更為方便。

若要在 [快速存取工具列] 上建立 [Hello] 巨集的按鈕,請遵循下列步驟:

在快速存取工具列上建立巨集的按鈕

  1. 按一下 [檔案] 索引標籤。

  2. 按一下 [選項] 以開啟 [PowerPoint 選項] 對話方塊,然後按一下 [快速存取工具列]。

  3. 在 [由此選擇命令:] 底下的清單中,選擇 [巨集]。在所出現的清單中尋找類似和 Presentation1!Hello 一樣的文字,並選取該文字。

  4. 按一下 [新增 >>] 按鈕,將巨集新增至右側清單,再按一下 [修改…] 按鈕,選擇與該巨集相關的按鈕圖像。

  5. 按一下 [確定]。您應該會在 [檔案] 索引標籤上方的 [快速存取工具列] 上看到您的新按鈕。

您現在可以隨時執行巨集,而不需使用 [開發人員] 索引標籤了,快試一下。

用來移除雜亂的巨集

有時候您已經處理一陣子的簡報中會包含您不需要的空白文字方塊。例如,您當初可能以為會用到而將其加入,但實際上卻沒有。此外,您也可能是不小心加入的。

若要移除那些空白文字方塊,您可以檢視整個簡報,並手動將其全部刪除,也可以撰寫巨集來幫您執行。巨集也會移除空白的隱藏文字方塊。

以下各節將引導您進行用來建立及實作該巨集的程序。

尋找物件

如果您想要建立新的 PowerPoint 巨集,最好是從 PowerPoint 物件模型參考開始,它是 Microsoft 開發人員網路 (MSDN) 上<PowerPoint 2007 開發人員參考>的一部分。<物件模型參考>說明可用的物件、屬性和方法,並提供許多用法範例。

圖 3. PowerPoint 物件模型參考

PowerPoint 物件模型參考

PowerPoint 2010 的這些參考資料會在公開發佈時更新,但是<PowerPoint 2007 開發人員參考>適用於大部分 PowerPoint 2010 用途。另請注意,您也可以從<PowerPoint 2007 開發人員參考>中存取另一項重要資源—<Visual Basic for Applications 語言參考>。

若要移除簡報中的空白文字方塊,首要工作就是了解 PowerPoint 物件模型中是否有 TextBox 物件。按一下 [PowerPoint 物件模型參考],以查看 PowerPoint 中所有物件的完整清單。

沒有 TextBox 物件,但有一個叫做 TextFrame 物件的東西。TextFrame 主題指出 TextFrame 物件「代表 Shape 物件中的文字圖文框」,所以 Shape 物件可能是開始的地方。

如果您在 TextFrame 主題中再進一步向下捲動,就會看到其指出您可以「使用 HasText 屬性來判斷文字圖文框是否包含文字」,這聽起來好像是您可以用來尋找要刪除之空白文字方塊的東西。請將它記下來,然後看看您還可以找到什麼 Shapes 的相關資訊。

按一下 Shape Object 主題,然後按一下 Shape Object Members 子主題。嘗試找出您可以將 Shape 用作文字方塊的指示。方法是 Shape 可以「做」的事,但您要找的是 Shape 可以「成為」的東西,所以請向下捲動至 Properties。

請注意,Shape 物件有一個叫做 Type 的 Property;請按一下 Type 連結,以檢視代表各種 Shapes 的常數清單。在清單的眾多項目中有一個 msoTextBox (mso 字首表示這些是 Microsoft Office 類型,可用於任何 Office 應用程式,而不只是 PowerPoint)。

一直向下捲動至 Shape.Type Property 主題底部,有一個如何使用 Property 的範例。

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
        If sh.Type = msoLinkedOLEObject Then
            If sh.OLEFormat.ProgID = "Excel.Sheet" Then
                sh.LinkFormat.AutoUpdate = ppUpdateOptionManual
            End If
        End If
    Next
Next

從範例學習

Shape.Type 主題指出「本範例會循環查看使用中簡報內所有投影片上的所有圖案,並且將所有連結的 Microsoft Office Excel 工作表設為手動更新。」

本節討論程式碼如何執行該工作。

If…Then

仔細觀察使用 Type 的下列程式碼列。

        If sh.Type = msoLinkedOLEObject Then

再下面幾列 (相同縮排程度) 是下列程式碼。

        End If

這是 If…Then 陳述式的範例、最基礎的程式設計建構之一,幸運的是,也是最容易了解的建構之一。If…Then 陳述式指示 PowerPoint 執行 If 與 End If 列之間的所有項目,但必須符合 If 列中的條件。在範例中,該條件為下列程式碼。

        sh.Type = msoLinkedOLEObject

使用該程式碼做為指南,而要從簡報中刪除文字方塊之巨集的條件,則可能如同下列。

        sh.Type = msoTextBox

如需 If…Then 陳述式的詳細資訊,請參閱<VBA 語言參考>的<Visual Basic 概念主題>一節。(全名為 If…Then…Else 陳述式;Else 是這裡不需要的選用性元件。)

For Each…Next

程式碼範例也舉例說明 PowerPoint VBA 程式設計中的常見模式,尤其是當您使用 Shapes 時。明確地說,就是它會「循環查看作用中簡報中所有投影片上的所有圖案」。「循環」代表重複動作,而在這裡,這個特別的循環類型為 For Each…Next 循環。

For Each sld In ActivePresentation.Slides
    For Each sh In sld.Shapes
    Next
Next

For Each…Next 循環是另一個易於了解的程式設計基礎建構。程式碼中的這兩個循環都是以 'For Each' 這兩個字開頭,並以 'Next' 這個字結束。請注意,其中一個 For Each…Next 循環是在另一個循環中,以程式設計的術話來說,就是「巢狀」。在下列程式碼中,外面的循環會檢查簡報中的每個投影片。

For Each sld In ActivePresentation.Slides

在這裡,sld 是「變數」;也就是循環所檢查之任何投影片的預留位置。ActivePresentation 是代表作用中 PowerPoint 簡報的物件,而 Slides 是代表作用中簡報中所有投影片的集合物件。

裡面的循環則會使用下列程式碼來檢查投影片上的每個圖形。

    For Each sh In sld.Shapes

sh 是另一個變數,但其角色是要做為循環所檢查之圖形的預留位置。sld 變數和之前一樣;其代表目前的投影片,而 Shapes 是另一個集合物件,在這裡代表目前投影片上的所有 Shapes。

您不一定能夠找到執行類似您嘗試執行之作業的範例程式碼,但您通常都找得到,而<物件模型參考>是最佳的查看之處。再強調一次,請使用<物件模型參考>來了解會呼叫哪些東西,並了解其用法。如果您想要以特定方式 (例如,檢查每個 Slide 上之每個 Shape 的 Type) 來使用某個東西 (例如 Type 屬性),則最好是有別人也已經這麼做,並且已經記載在<物件模型參考>中。

建立巨集

啟動 PowerPoint,並將新簡報另存為 PowerPoint 啟用巨集的簡報 (*.pptm)。然後建立一個名為 ClutterRemover 的新巨集,並輸入下列程式碼。

For Each SlideToCheck In ActivePresentation.Slides
    For Each ShapeToCheck In SlideToCheck.Shapes
        ShapeToCheck.Delete
    Next
Next

請注意,當您在 ActivePresentation 後面輸入句點,Visual Basic 編輯器就會顯示快顯功能表,列出可用於 ActivePresentation 物件的所有屬性和方法。那是 IntelliSense 技術的範例之一;也就是說,Visual Basic 編輯器會回應其判斷您嘗試要執行的作業,並提供適當的選項清單。您可以從清單中選取選項,或是繼續輸入。

仔細觀察您剛才輸入的程式碼。您已經設定類似範例中的巢狀循環,但不是 sld 和 sh,您的變數名稱較長,可幫助提醒您嘗試在程式碼中執行的作業。有些程式設計師偏好較短的變數名稱,有些則偏好較長、較明確的名稱,以方便查看變數所代表的項目。後者讓程式碼較淺顯易懂,而且當您還在學習時,通常使用後者會比較好。

在循環中,巨集目前具有下列程式碼。

        ShapeToCheck.Delete

為什麼是 Delete,而不是 .Remove 或 .GetRidOf?因為將文字方塊從 Shape 物件中移除是一個動作,所以您會在<物件模型參考>中查看 Shape 物件,並且在方法之下查看。Cut 和 Delete 是兩種可能性,而且因為您不需要將刪除的 Shapes 放在剪貼簿上,所以自然會選擇 Delete。

先別急著新增 If…Then 陳述式。首先,請確認您知道如何刪除圖形。在程式設計中,最好不要嘗試同時做太多事。您已經需要測試巢狀 For Each 循環;如果您也嘗試同時讓 If 陳述式執行,則會增加產生無法追蹤之錯誤的風險。ShapeToCheck.Delete 列是讓循環執行您可以看到之作業,進而測試的簡單方法。一旦確認循環可運作,即可新增 If 條件,這樣就只會刪除空白文字方塊。

按一下 [儲存] 按鈕,並關閉 Visual Basic 編輯器。刪除 PowerPoint 中的預設標題投影片,並新增兩個空白投影片。在每個投影片上放四個圖形 (由於您尚未檢查類型,所以任何您想使用的圖形都可以;笑臉、閃電等)。然後執行 ClutterRemover 巨集.

錯誤

發生什麼事?每個投影片上仍有兩個圖形!再試一次,您就會看到每個投影片上只剩一個圖形,然後再試一次,最後就會全部消除。這是怎麼回事?

問題出在您每次刪除項目時,集合就會重新編碼。試想如果您循環查看項目集合,並刪除第一個項目。該循環從項目 #1 開始,而您將它刪除了。現在本來是項目 #2 的項目變成項目 #1,本來是項目 #3 的項目變成項目 #2,以此類推。當循環移至新的項目 #2 時,其實已經跳過本來的項目 #2。

<物件模型參考>中的範例程式碼沒有這個問題,因為它不是刪除循環所檢查的項目。這裡的問題說明了範例程式碼的一個重點,就是要找到「類似」您所需的程式碼很容易,但不要預期它「完全」就是您需要的。測試並準備變更非您預期的部分。

錯誤修復

您可以用倒數而非正數的方式來防止程式碼跳過項目。例如,假設您將四個項目中的 #3 刪除。雖然 #4 仍會重新編碼為 #3,但這樣沒關係,因為如果您的循環是倒數而非正數,該循環就會移至 #2 而非 #4。

若要建立倒數的循環,您需要稍微不同的程式設計建構,其名為 For…Next 循環。集合的每個成員都有一個編號,其稱為索引。在 For Each…Next 循環中會檢查集合的每個成員,並讓 VBA 處理索引,For…Next 循環會明確地指定索引。這個更嚴格的控制項正是您需要修復的錯誤。

在 Visual Basic 編輯器中開啟 ClutterRemover 巨集,並將程式碼變更如下。

For Each SlideToCheck In ActivePresentation.Slides
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
        SlideToCheck.Shapes(ShapeIndex).Delete
    Next
Next

請注意,第二列不再有下列 For Each 程式碼。

    For Each ShapeToCheck In SlideToCheck.Shapes

其改為使用下列 For…Next 程式碼。

    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1

新的程式碼明確地指定如何循環查看 Shapes 集合的成員。ShapeIndex 是包含目前索引的變數;也就是循環目前檢查的 Shape 編號。SlideToCheck.Shapes.Count 指定 Shapes 集合所擁有的成員總數;循環會從這個編號倒數至編號 1。"To 1" 指示 VBA 一直數到集合的第一個成員,而 "Step -1" 則指示 VBA 倒數而非正數。

新的 ShapeIndex 變數會取代先前的 ShapeToCheck 變數,以參照循環中的 Shapes。這表示下列程式碼不見了。

        ShapeToCheck.Delete

它被新的第三列程式碼取代了。

        SlideToCheck.Shapes(ShapeIndex).Delete

程式碼使用 ShapeIndex 變數來將 SlideToCheck.Shapes 集合編製索引,並且像之前一樣使用 Delete 方法。

外部 For Each 循環中的程式碼還是一樣,因為您並沒有刪除任何投影片。如果您刪除了投影片,也可以使用在外部循環中倒數的 For 循環。

再設定一次測試,並執行新版巨集。這次巨集應該會刪除第一次嘗試中的所有 Shapes。

良好的程式設計作法

VBA 中有兩個非必要,但強烈建議您使用的項目,那就是註解和變數宣告。

以單引號開頭的任一列程式碼就是註解,它不會影響巨集的作業。註解的主要用途如下:

  1. 讓程式碼更易於了解,不只是針對您,而是針對之後可能必須修改程式碼的任何其他人。

  2. 暫時停用某列程式碼 (即所謂的「標示為註解」)。

以下是目前已新增一些註解的巨集。

' Visit each slide
For Each SlideToCheck In ActivePresentation.Slides
    ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
        ' Delete all shapes
        SlideToCheck.Shapes(ShapeIndex).Delete
    Next
Next

在巨集開頭新增「變數宣告」也是很好的想法。變數宣告可指定變數代表的實體種類。變數宣告並不是 VBA 中的必要項目,但是使用變數宣告可以更容易持續追蹤您的變數,並找到程式碼中的錯誤。

Dim SlideToCheck As Slide
Dim ShapeIndex As Integer

Dim 是 "Dimension" 的縮寫,而 Slide 和 Integer 是這些特定變數所代表的資料類型。請注意,在您輸入 As 之後,Visual Basic 編輯器會顯示快顯功能表,列出所有可用的資料類型。這是 IntelliSense 技術的另一個範例;也就是說,Visual Basic 編輯器會回應其判斷您嘗試要執行的作業,並提供適當的選項清單。您可以選擇清單中的選項,或繼續輸入內容。另請注意,如果您以物件類型 (如 Slide) 來宣告變數,當您之後在巨集中使用物件變數時,IntelliSense 會顯示與該物件相關聯的適當屬性和方法清單。

建構 If 條件

若要完成 ClutterRemover 巨集,最後一項工作是了解如何只刪除空白文字方塊,而不要刪除所有 Shapes。Shape 必須符合兩個條件才能被刪除:它必須是文字方塊,而且必須是空的。

如本文前面所討論的,您可以使用 .Type 屬性來判斷 Shape 是否為文字方塊。該資訊會提供您下列程式碼。

SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox

同一討論中也有提到您可以使用 TextFrame 物件的 .HasText 屬性來檢查文字。

SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

因為您希望唯有當 Shape 的文字圖文框「沒有」包含文字時,才符合 If 條件,所以請新增 Not 關鍵字至程式碼。

Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

現在請使用 And 關鍵字,將這兩個條件合而為一 (如需 Not、And 和其他邏輯運算子的詳細資訊,請參閱<VBA 語言參考>)。

SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText

底線字元可讓程式碼的邏輯列在 Visual Basic 編輯器中擴充至多個實際列。

最後,在邏輯列開頭加上 If,在結尾加上 Then,並加上註解來說明該程式碼。

' If the shape IS a text box and DOES NOT have text
If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText Then

將全部放在一起

完成的巨集應該如同下列程式碼。

Dim SlideToCheck As Slide
Dim ShapeIndex As Integer
' Visit each slide
For Each SlideToCheck In ActivePresentation.Slides
    ' On each slide, count down through the shapes
    For ShapeIndex = SlideToCheck.Shapes.Count To 1 Step -1
    ' If the shape IS a text box and DOES NOT have text
    If SlideToCheck.Shapes(ShapeIndex).Type = msoTextBox And _
    Not SlideToCheck.Shapes(ShapeIndex).TextFrame.HasText Then
        ' Delete the shape
        SlideToCheck.Shapes(ShapeIndex).Delete
    End If
    Next
Next

刪除簡報中的所有投影片,然後插入標題投影片,以及兩個空白投影片。在這兩個空白投影片上各插入四個文字方塊;賦予文字方塊可顯示的外框或填滿。然後輸入部分 (非全部) 文字方塊。執行巨集。空白文字方塊應該會消失,只留下非空白的文字方塊,以及標題投影片上的空白預留位置方塊。

巨集會對任何數量的投影片上之任何數量的文字方塊執行其工作。

下一步是什麼?

您可能會發現本文中的資訊結合某些實驗,再加上您用寶貴的時間來研究<物件模型參考>和<VBA 語言參考>之後,可提供您足夠的資訊來完成激發您開始學習 VBA 的任何工作。若是如此,那真是太棒了!如果不是這樣,最好的下一步就是擴大您了解 VBA 的範圍。

進一步了解 VBA 的方式之一,就是研究工作中程式碼。除了<物件模型參考>和<VBA 語言參考>中的範例之外,各種線上來源也有非常大量的 PowerPoint VBA 程式碼可供使用,包括 MSDN 中的文章、專研 PowerPoint 之 Microsoft 最有價值專家 (MVP) 所維護的網站,以及您可以快速搜尋網路來取得的其他來源。

那些資源中的程式碼可幫助您解決眼前的編碼問題,並針對您曾未想過的專案提供想法。

如果您喜歡追求較系統化的 VBA 研究,有幾本關於 VBA 的好書,那些書在網路上也有幾個很好的評論,可以幫助您決定最適合您學習風格的書籍。