摘要:向程序員以外的人員介紹一些使用 Visual Basic for Applications (VBA) 編程來擴展 Microsoft Office 2010 的基本方法。包括 VBA 語言概述、有關如何在不同的 Office 2010 應用程序中訪問 VBA 的一些關鍵的詳細信息、簡單編程示例以及一些應用程序示例。(13 個打印頁)

社區成員圖標 Kingfisher Computer Consulting 的 Tim Burnett

2009 年 11 月

適用范圍:Microsoft Word 2010、Microsoft Outlook 2010、Microsoft Access 2010、Microsoft Excel 2010、Microsoft PowerPoint 2010、Microsoft Publisher 2010

內容

Office 2010 中的 VBA 編程

您是否面臨從 Word 2010 中重復清除 50 個表的難題?您是否希望特定文檔在打開時提示用戶進行輸入?您是否不清楚如何將 Microsoft Outlook 2010 中的聯系人高效地導入 Microsoft Excel 2010 電子表格?

可以使用 Office 2010 的 VBA(一種可用于擴展 Office 2010 應用程序的簡單且強大的編程語言)來執行這些任務并完成許多其他任務。

本文適用于有如下特點的有經驗 Office 用戶:希望了解有關 VBA 的信息,還希望深入了解編程對他們自定義 Office 2010 有何幫助。

Office 2010 應用程序套件包含一組豐富的功能,并包括用于創作和處理文檔、電子郵件、數據庫、表單、電子表格和演示文稿以及對其設置格式的許多不同方法。Office 2010 中 VBA 編程的強大功能是:幾乎所有可以使用鼠標、鍵盤或對話框執行的操作都可以使用 VBA 來執行。另外,如果可以使用 VBA 執行一次操作,則可以輕松執行一百次這樣的操作。(事實上,自動執行重復任務是 Office 中 VBA 的最常見用法之一。)

除了可通過編寫 VBA 腳本來加速執行日常任務外,還可以使用 VBA 為 Office 2010 應用程序添加新功能,或以特定于您的業務需要的方式來提示文檔用戶并與之交互。例如,可以編寫一些 VBA 代碼,使其在用戶首次嘗試保存文檔時顯示一個彈出消息,提醒用戶將文檔保存到特定網絡驅動器上。

本文探討充分利用 VBA 編程功能的一些主要原因,并介紹 VBA 語言和可用于處理解決方案的現成工具。最后,本文包括一些提示和方法以避免一些常見編程錯誤。

何時使用 VBA 及使用原因

考慮使用 Office 2010 中的 VBA 編程功能有三個主要原因。

自動化和重復

在重復處理格式設置或更正問題時,VBA 有效且高效。例如,您是否曾經在 Word 中更改每頁頂部的段落樣式?您是否曾經必須重新設置從 Excel 粘貼到 Word 文檔或 Outlook 電子郵件中的多個表的格式?您是否曾經必須在多個 Outlook 聯系人中進行統一更改?

如果必須更改 10 次或 20 次以上,則可能值得使用 VBA 來自動執行更改操作。如果必須更改數百次,則肯定值得考慮。幾乎所有您可以手動執行的格式設置或編輯更改都可以使用 VBA 執行。

用戶交互擴展

有時,您希望鼓勵或強迫用戶以不屬于標準應用程序的特定方式與 Office 2010 應用程序或文檔進行交互。例如,您可能希望在用戶打開、保存或打印文檔時,提示用戶采取一些特定操作。

Office 2010 應用程序之間的交互

您是否需要將 Outlook 2010 中的所有聯系人復制到 Word 2010 中,然后以某種特定方式設置其格式?或者,您是否需要將數據從 Excel 2010 移動到一組 PowerPoint 2010 幻燈片中?有時,簡單的復制和粘貼操作并沒有按預期方式執行,或執行得太慢。您可以使用 VBA 編程同時處理兩個或更多個 Office 2010 應用程序的詳細信息,然后基于一個應用程序中的內容修改另一個應用程序中的內容。

換另一種方式執行任務

VBA 編程是一種功能強大的解決方案,但并不總是最佳方法。有時候使用其他途徑來實現目標更合適。

關鍵問題在于是否有更簡單的方法。在開始 VBA 項目之前,應考慮內置工具和標準功能。例如,如果有耗時的編輯或布局任務,請考慮使用樣式或加速鍵來解決此問題。是否可以執行一次任務然后使用 Ctrl+Y(重做)來重復該任務?是否可以使用正確格式或模板創建新文檔,然后將內容復制到該新文檔中?

Office 2010 應用程序的功能很強大,其中可能已經包含您需要的解決方案。應花些時間了解有關 Office 2010 的更多信息,然后再轉到編程過程。

在開始 VBA 項目之前,應確保您有時間使用 VBA。編程需要花費精力且過程可能無法預知。尤其對于初學者,如果沒有時間仔細研究,則切勿依賴編程。當工期迫近時嘗試編寫“快速腳本”來解決問題會造成極大壓力。如果您的時間很緊,則可能需要使用傳統方法,即使這些方法單調又重復。

VBA 編程 101

通過代碼使應用程序執行操作

您可能認為編寫代碼是一項神秘而又復雜的工作,但基本原則是使用日常推理,并且非常易于訪問。Office 2010 應用程序的創建方式如下:公開可以接收指令的對象,方法類似于為電話設計可用于與之交互的按鍵。按下按鍵時,電話會識別指令并按照撥號順序包括對應的號碼。在編程時,您是通過向應用程序中的各個對象發送指令來與應用程序交互的。這些對象是可擴展的,但存在相應限制。它們只能執行為其設計的操作,并且只按照您的指示執行操作。

例如,考慮用戶在 Word 2010 中打開一個文檔,進行一些更改,保存并關閉該文檔。在 VBA 編程中,Word 2010 會公開一個 Document 對象。通過使用 VBA 代碼,您可以指示 Document 對象執行打開、保存或關閉之類的操作。

下面一節討論如何組織和描述對象。

對象模型

開發人員在層次結構中組織編程對象,該層次結構稱為應用程序的對象模型。例如,Word 具有頂級 Application 對象,它包含 Document 對象。Document 對象包含 Paragraph 對象,等等。對象模型粗略反映了您在用戶界面中看到的內容。它們是應用程序及其功能的概念圖。

對象的定義稱為,因此您可能會看到互換使用這兩個術語的情況。從技術上講,類是用于創建或實例化 某個對象的說明或模板。

創建對象后,可通過設置其屬性 和調用其方法 來處理該對象。如果您認為對象是一個名詞,則屬性是描述該名詞的形容詞,方法是為名詞賦予行動的動詞。更改屬性會更改對象的外觀或行為的某些性質。調用對象的一個方法可使對象執行某項操作。

本文中的 VBA 代碼對打開的 Office 2010 應用程序運行,其中代碼處理的許多對象已在運行;例如,Application 本身、Excel 2010 中的 Worksheet、Word 2010 中的 Document、PowerPoint 2010 中的 Presentation、Outlook 2010 中的 Explorer 和 Folder 對象。在您了解對象模型的基本布局和 Application 的一些允許訪問其當前狀態的關鍵屬性之后,即可開始使用 Office 中的 VBA 來擴展和處理該 Office 2010 應用程序。

方法

例如,在 Word 中,可以通過使用 Application 對象的 ActiveDocument 屬性,來更改屬性并調用當前 Word 文檔的方法。此 ActiveDocument 屬性返回對 Word 應用程序中當前活動的 Document 對象的引用。“返回引用”的意思是“允許您訪問”。

下面的代碼完全按照它所表達的含義運行;即,保存應用程序中的活動文檔。

Application.ActiveDocument.Save 

從左向右閱讀代碼,“在此 Application 中,ActiveDocument 引用了 Document,調用 Save 方法”。了解 Save 是形式最簡單的方法;它不需要您提供任何詳細指令。您指示 Document 對象執行 Save,它不需要您提供任何其他輸入。

如果方法需要詳細信息,這些詳細信息稱為參數。下面的代碼運行 SaveAs 方法,該方法需要文件的新名稱。

Application.ActiveDocument.SaveAs ("New Document Name.docx") 

方法名稱后面的小括號內列出的值是參數。此處,文件的新名稱是 SaveAs 方法的參數。

屬性

可使用相同的語法來設置用于讀取屬性的屬性。下面的代碼執行一種方法來選擇 Excel 2010 中的單元格 A1,然后設置屬性來在該單元格中放置內容。

    Application.ActiveSheet.Range("A1").Select     Application.Selection.Value = "Hello World" 

VBA 編程中的第一個難題是了解每個 Office 2010 應用程序的對象模型并了解對象、方法和屬性語法。所有 Office 2010 應用程序中的對象模型均類似,但每個對象模型又特定于文檔種類和它處理的對象。

代碼段的第一行中是 Excel 2010 對象 Application,然后是 ActiveSheet,它提供對活動工作表的訪問權。這之后是不太熟悉的術語 Range,它的意思是“以此方式定義單元格區域”。代碼指示 Range 創建本身,只使用 A1 作為定義的單元格集。換句話說,代碼的第一行定義對象 Range,并對其運行方法來選擇它。結果將自動存儲在 Application 的另一個名為 Selection 的屬性中。

代碼的第二行將 Selection 的 Value 屬性設置為文本“Hello World”,并且該值顯示在單元格 A1 中。

您編寫的最簡單的 VBA 代碼可能只是獲取對 Office 應用程序中您要處理的對象的訪問權并設置屬性。例如,您可以在 VBA 腳本中獲取對 Word 中表中各行的訪問權并更改其格式。這聽起來很簡單,但這會非常有用;在編寫該代碼后,您可以利用編程的所有功能在若干個表或文檔中進行此類相同更改,或根據某個邏輯或條件進行更改。對于計算機來說,進行 1000 次更改與進行 10 次更改沒有任何區別,因此對于較大文檔和問題,這具有規模經濟,并且這是 VBA 的真正卓越之處,并可以節省您的時間。

宏和 Visual Basic 編輯器

既然您已對 Office 2010 應用程序如何公開其對象模型有所了解,那么可能迫不及待地希望嘗試調用對象方法、設置對象屬性以及響應對象事件。為此,您必須在某個位置以 Office 可以理解的方式編寫代碼;通常使用的是 Visual Basic 編輯器。盡管該編輯器是在默認情況下安裝的,但在功能區中啟用該編輯器之前,許多用戶都不知道該編輯器的存在。

打開“開發工具”選項卡

所有 Office 2010 應用程序都使用功能區。該功能區中有一個“開發工具”選項卡,在此可以訪問 Visual Basic 編輯器和其他開發人員工具。由于 Office 2010 在默認情況下不顯示“開發工具”選項卡,因此必須使用以下過程啟用該選項卡:

啟用“開發工具”選項卡

  1. 在“文件”選項卡上,選擇“選項”以打開“選項”對話框。

  2. 單擊該對話框左側的“自定義功能區”

  3. 在該對話框左側的“從下列位置選擇命令”下,選擇“常用命令”

  4. 在該對話框右側的“自定義功能區”下,從下拉列表框中選擇“主選項卡”,然后選中“開發工具”復選框。

  5. 單擊“確定”。

Ee814735.note(zh-cn,office.14).gif注釋:

在 Office 2007 中,顯示“開發工具”選項卡的方法是單擊 Office 按鈕,單擊“選項”,然后在“選項”對話框的“常用”類別中選中“在功能區顯示‘開發工具’選項卡”復選框

啟用“開發工具”選項卡后,可以輕松找到“Visual Basic”和“宏”按鈕。



圖 1. “開發工具”選項卡上的按鈕

“開發人員”選項卡上的按鈕

安全問題

為確保 Office 2010 用戶免遭病毒和危險宏代碼的危害,不能將宏代碼保存在使用標準文件擴展名的標準 Office 2010 文檔中。必須將代碼保存在使用特殊擴展名的文件中。例如,不能將宏保存在擴展名為 .docx 的標準 Word 2010 文檔中;而是必須使用擴展名為 .docm 且啟用了宏的特殊 Word 2010 文檔。

打開 .docm 文件時,Office 2010 安全功能可能仍會阻止文檔中的宏運行,并通知您,也可能不通知您。檢查所有 Office 2010 應用程序中信任中心中的設置和選項。默認設置禁止宏運行,但通知您已禁用宏并提供為該文檔重新啟用宏的選項。

可以通過創建“受信任位置”、“受信任的文檔”或“受信任的發布者”來指定可以運行宏的特定文件夾。最好選擇使用“受信任的發布者”,它適用于您分發的數字簽名文檔。有關特定 Office 2010 應用程序中安全設置的詳細信息,請打開“選項”對話框,單擊“信任中心”,然后單擊“信任中心設置”

Ee814735.note(zh-cn,office.14).gif注釋:

一些 Office 2010 應用程序(如 Outlook 2010)默認情況下會將宏保存在您的本地計算機上的主模板中。雖然在您運行自己的宏時,該策略會減少您自己的計算機上的本地安全問題,但如果您要分發自己的宏,則需要部署策略。

錄制宏

在單擊“開發工具”選項卡上的“宏”按鈕時,會打開“宏”對話框,該對話框允許您訪問您可從特定文檔或應用程序訪問的 VBA 子例程或宏。“Visual Basic”按鈕可打開 Visual Basic 編輯器,可在其中創建和編輯 VBA 代碼。

Word 2010 和 Excel 2010 中“開發工具”選項卡上的另一個按鈕是“錄制宏”按鈕,它自動生成可重現您在應用程序中執行的操作的 VBA 代碼。“錄制宏”是一個非常棒的工具,可通過它了解有關 VBA 的更多信息。閱讀生成的代碼可使您深入了解 VBA,并在您作為用戶了解 Office 2010 和作為程序員了解該軟件之間架起穩固橋梁。唯一需要指出的是生成的代碼可能令人迷惑,因為宏編輯器必須對您的意圖進行一些假定,而這些假定不一定準確。

錄制宏

  1. 打開一個 Excel 2010 新工作簿,然后單擊功能區中的“開發工具”選項卡。單擊“錄制宏”并接受“錄制宏”對話框中的所有默認設置,包括將 Macro1 作為宏名稱,將當前工作簿作為保存位置。

  2. 單擊“確定”開始錄制宏。請注意按鈕文本如何變為“停止錄制”。在完成要錄制的操作后單擊該按鈕。

  3. 單擊單元格 B1,然后鍵入程序員的第一個經典字符串:Hello World。停止鍵入并查看“停止錄制”按鈕;它將灰顯,因為 Excel 2010 正在等待您完成在該單元格中鍵入值的操作。

  4. 單擊單元格 B2 以完成單元格 B1 中的操作,然后單擊“停止錄制”。

  5. 單擊“開發工具”選項卡上的“宏”,選擇“Macro1”(如果未選擇它),然后單擊“編輯”在 Visual Basic 編輯器中查看 Macro1 的代碼。



圖 2. Visual Basic 編輯器中的宏代碼

Visual Basic Editor 中的宏代碼

查看代碼

您創建的宏應類似于下面的代碼。

Sub Macro1() ' ' Macro1 Macro ' '     Range("B1").Select     ActiveCell.FormulaR1C1 = "Hello World"     Range("B2").Select End Sub 

了解與前面的選擇單元格 A1 中的文本的代碼段的相似之處和不同之處。在此代碼中,選擇了單元格 B1,然后將字符串 "Hello World" 應用于已激活的單元格。文本兩邊的引號指定相對于數值的字符串值。

是否還記得如何單擊單元格 B2 以再次顯示“停止錄制”按鈕?該操作也顯示為一行代碼。宏錄制器錄制每一次鍵擊。

以撇號開頭并由編輯器標為綠色的代碼行是說明代碼或提醒您和其他程序員代碼用途的注釋。VBA 忽略以單引號開頭的任何行或行的一部分。在代碼中編寫清楚的相應注釋非常重要,但該討論不在本文范圍內。本文后面對此代碼的引用不包括這四個注釋行。

當宏錄制器生成代碼時,它使用復雜的算法來確定您需要的方法和屬性。如果您無法識別給定屬性,有許多資源可幫助您。例如,在您錄制的宏中,宏錄制器生成了引用 ForumulaR1C1 屬性的代碼。不確定這是什么意思?

Ee814735.Tip(zh-cn,office.14).gif提示:

請注意,您應知道 Application 對象隱含在所有 VBA 宏中。您錄制的代碼的每行的開頭都是Application.。

使用開發工具幫助

在錄制的宏中選擇 ForumulaR1C1,然后按 F1。幫助系統將運行快速搜索,并確定相應主題位于 Excel 2010“幫助”的 Excel 2010“開發工具”部分,然后列出 FormulaR1C1 屬性。您可以單擊鏈接來了解有關該屬性的更多信息,但在執行此操作之前,要知道 Excel 對象模型引用鏈接位于窗口底部附近。單擊該鏈接以查看 Excel 2010 在其對象模型中用于描述工作表及其組件的對象的長列表。單擊其中任一對象可查看應用于該特定對象的屬性和方法,以及對其他相關選項的交叉引用。許多“幫助”條目還包含可幫助您的簡短代碼示例。例如,您可以訪問 Borders 對象中的鏈接來了解如何在 VBA 中設置邊框。

Worksheets(1).Range("A1").Borders.LineStyle = xlDouble 

編輯代碼

邊框代碼看起來與錄制的宏不同。對象模型令人迷惑的一點是可使用多種方法處理任何給定對象(在本例中為單元格 A1)。

有時,學習編程的最好方法是對某些運行代碼進行微小更改,然后查看結果。立即嘗試。在 Visual Basic 編輯器中打開 Macro1,對代碼進行以下更改。

Sub Macro1()     Worksheets(1).Range("A1").Value = "Wow!"     Worksheets(1).Range("A1").Borders.LineStyle = xlDouble End Sub 
Ee814735.Tip(zh-cn,office.14).gif提示:

在處理代碼時盡可能地使用復制和粘貼操作,以避免鍵入錯誤。

您無需保存代碼即可進行嘗試,返回到 Excel 2010 文檔,單擊“開發工具”選項卡上的“宏”,單擊“Macro1”,然后單擊“運行”。單元格 A1 現在包含文本 Wow! 且其四周有雙線邊框。



圖 3. 您的第一個宏的結果

您的第一個宏的結果

 

您剛才錄制了宏,閱讀了對象模型文檔,并通過簡單編程制作了一個可執行某項操作的 VBA 程序。祝賀您!

宏沒有運行?閱讀 VBA 中的調試建議。

編程提示和技巧

從使用示例開始

VBA 社區非常大;在 Web 上進行搜索幾乎總是可以獲得其執行的操作與您要執行的操作類似的 VBA 代碼示例。如果您找不到好的示例,請嘗試將任務分解為較小的單元,然后搜索其中每個單元,或者嘗試考慮更常見、但類似的問題。從使用示例開始可為您節省數小時的時間。

這并不意味著編寫嚴密的免費代碼在 Web 上等待您使用。事實上,您找到的一些代碼可能有缺陷或錯誤。但您聯機或在 VBA 文檔中找到的示例可為您提供良好的開端。請記住,學習編程需要時間和思索。在您忙于使用另一個解決方案來解決您的問題之前,請詢問自己 VBA 是不是解決此問題的正確選擇。

處理較簡單的問題

編程過程可能會迅速變得復雜化。將問題分解為盡可能小的邏輯單元,然后獨立編寫并測試每個單元,這一點很重要,尤其對于初學者。如果您面前有太多代碼,并且您變得迷惑或糊涂,請停止并撇開問題。當您重新面對問題時,可以將一個小問題復制到新模塊中,解決該問題,讓代碼運行,并測試它以確保它能夠運行。然后移動到下一個部分。

缺陷和調試

有兩種主要類型的編程錯誤:語法 錯誤,即違反編程語言的語法規則;運行時 錯誤,即看上去語法正確,但在 VBA 嘗試執行代碼時失敗。

雖然修復這些錯誤可能令人沮喪,但語法錯誤很容易捕獲;如果您在代碼中鍵入語法錯誤,Visual Basic 編輯器會發出嘟嘟聲并閃爍。

例如,在 VBA 中,必須用雙引號將字符串值引起來。若要了解使用單引號會發生什么,請返回到 Visual Basic 編輯器,將代碼示例中的 "Wow!" 字符串替換為 'Wow!'(即,將單詞 Wow 括在單引號中)。如果您單擊下一行,Visual Basic 編輯器會做出響應。錯誤“Compile error: Expected: expression”(編譯錯誤: 預期: 表達式)不太有幫助,但生成該錯誤的行會變為紅色以告知您該行中有語法錯誤,因此,此程序不會運行。

單擊“確定”,然后將文本更改回 "Wow!"

運行時錯誤較難以捕獲,因為編程語法看上去正確,但代碼在 VBA 嘗試執行它時失敗。

例如,打開 Visual Basic 編輯器,在宏中將 Value 屬性名稱更改為 ValueX,故意引入運行時錯誤,因為Range 對象沒有名為 ValueX 的屬性。返回到 Excel 2010 文檔,打開“宏”對話框,再次運行 Macro1。您應該看到一個說明運行時錯誤的 Visual Basic 消息框,錯誤文本為“Object doesn't support this property of method”(對象不支持此屬性或方法)。雖然該文本解釋得很清楚,但單擊“調試”可查看更多信息。

當您返回到 Visual Basic 編輯器時,編輯器處于特定調試模式,即使用黃色突出顯示失敗的代碼行。與預期的一樣,突出顯示了包括 ValueX 屬性的行。



圖 4. 運行中的 Visual Basic 調試程序

使用中的 Visual Basic 調試程序

 

可以對運行中的 VBA 代碼進行更改,以將 ValueX 更改回 Value,然后單擊“調試”菜單下的綠色小播放按鈕。程序應能夠再次正常運行。

最好了解如何對更長、更復雜的程序更加慎重地使用調試程序。至少應了解如何設置斷點以在您要查看代碼時停止執行代碼,如何添加監視點以在代碼運行時查看不同變量和屬性的值,以及如何逐行分步完成代碼。所有這些選項均位于“調試”菜單中,并且認真的調試程序用戶通常會記住附帶的鍵盤快捷方式。

恰當使用參考材料

若要打開 Office 2010“幫助”中內置的“開發人員參考”,請通過單擊功能區中的問號或按 F1,即可從任何 Office 2010 應用程序中打開幫助參考。然后,在“搜索”按鈕右側,單擊下拉箭頭來篩選內容。單擊“開發人員參考”。如果您沒有在左面板中看到內容,請單擊小書籍圖標來打開它,然后從此處展開對象模型參考。



圖 5. 開發工具幫助上的篩選功能適用于所有 Office 2010 應用程序

對開發人員幫助進行篩選

 

瀏覽對象模型參考所花費的時間將得到回報。在您了解要使用的 Office 2010 應用程序的 VBA 語法和對象模型的基礎知識后,您的技能將得到提升,您將從主觀猜測轉變為進行有方法的編程。

當然,Microsoft Office 開發人員中心是查閱文章、提示和社區信息的極好門戶。

搜索論壇和組

所有程序員都會時不時遇到困難,即使在閱讀他們可以找到的每篇參考文章之后。他們晚上睡覺時會失眠,因為他們在思考解決問題的各種方法。幸運的是,Internet 促進了互相幫助以解決編程問題的開發人員社區的發展。

在網絡上搜索“office 開發人員論壇”時會顯示幾個討論組。您也可以搜索“office 開發”或問題描述來查找論壇、博客文章和文章。

如果您已為解決問題而竭盡全力,那么就不要害怕將您的問題張貼到開發人員論壇上。這些論壇歡迎來自較新程序員的帖子,并且許多有經驗的開發人員都很樂于提供幫助。

下面是在向開發人員論壇中張貼內容時需遵守的幾點規定:

  • 在張貼之前,應在網站上查找 FAQ 或論壇成員希望您遵循的準則。確保所張貼的內容符合這些準則,并位于論壇的正確區域。

  • 包括清楚的完整代碼示例,如果您的代碼是一長段代碼的一部分,請考慮編輯您的代碼以向其他人進行闡述。

  • 清楚準確地描述您的問題,并概述您為解決此問題已經采取的所有步驟?;ㄐr間盡力編寫好的帖子,尤其在您慌亂或匆忙時。采用對首次閱讀問題陳述的讀者有意義的方式介紹情況。

  • 要有禮貌,并表達您的感激之情。

進一步了解編程

雖然本文很短且只觸及 VBA 和編程的表面,但希望它能夠為您入門提供足夠幫助。

本節簡單討論一些較關鍵的主題。

變量

在本文提供的簡單示例中,您處理的是應用程序已創建的對象。您可能希望創建自己的對象來存儲值或對應用程序中臨時使用的其他對象的引用。這些對象稱為變量。

若要在 VBA 中使用變量,必須使用 Dim 語句告知 VBA 變量表示哪種類型的對象。然后,您可以設置其值并使用它來設置其他變量或屬性。

    Dim MyStringVariable As String     MyStringVariable = "Wow!"     Worksheets(1).Range("A1").Value = MyStringVariable 

分支和循環

本文中的簡單程序從上到下一次執行一行。編程的真正功能來自您必須根據指定的一個或多個條件確定要執行哪些代碼行的選項。您可以進一步擴展這些功能,以便可以重復執行一項操作許多次。例如,下面的代碼擴展了 Macro1。

Sub Macro1()     If Worksheets(1).Range("A1").Value = "Yes!" Then         Dim i As Integer         For i = 2 To 10             Worksheets(1).Range("A" & i).Value = "OK! " & i         Next i     Else         MsgBox "Put Yes! in cell A1"     End If End Sub 

將此代碼鍵入或粘貼到 Visual Basic 編輯器中,然后運行它。按照出現的消息框中的指示操作,并將單元格 A1 中的文本從 Wow! 更改為 Yes!,然后再次運行它來查看循環功能。此代碼段演示變量、分支和循環。在看到它運行后仔細閱讀它,嘗試確定每行執行時發生了什么。

所有 Office 2010 應用程序:代碼示例

下面是一些要嘗試的腳本;每個腳本解決一個 Office 2010 實際問題。

在 Outlook 2010 中創建電子郵件

Sub MakeMessage()     Dim OutlookMessage As Outlook.MailItem     Set OutlookMessage = Application.CreateItem(olMailItem)     OutlookMessage.Subject = "Hello World!"     OutlookMessage.Display     Set OutlookMessage = Nothing End Sub 

請注意,有時您可能希望在 Outlook 2010 中自動創建電子郵件;您也可以使用模板。

刪除 Excel 2010 工作表中的空行

Sub DeleteEmptyRows()    SelectedRange = Selection.Rows.Count    ActiveCell.Offset(0, 0).Select    For i = 1 To SelectedRange        If ActiveCell.Value = "" Then                 Selection.EntireRow.Delete        Else            ActiveCell.Offset(1, 0).Select        End If    Next iEnd Sub 

請注意,您可以選擇一列單元格,然后運行此宏來刪除所選列中具有空白單元格的所有行。

刪除 PowerPoint 2010 中的空文本框

Sub RemoveEmptyTextBoxes()     Dim SlideObj As Slide     Dim ShapeObj As Shape     Dim ShapeIndex As Integer     For Each SlideObj In ActivePresentation.Slides         For ShapeIndex = SlideObj.Shapes.Count To 1 Step -1             Set ShapeObj = SlideObj.Shapes(ShapeIndex)             If ShapeObj.Type = msoTextBox Then                 If Trim(ShapeObj.TextFrame.TextRange.Text) = "" Then                     ShapeObj.Delete                 End If             End If         Next ShapeIndex     Next SlideObj End Sub 

請注意,此代碼循環訪問所有幻燈片并刪除沒有任何文本的所有文本框。計數變量遞減而不是遞增,因為代碼每次刪除一個對象時,都會從集合中移除該對象,從而減小了計數。

將 Outlook 2010 中的聯系人復制到 Word 2010

Sub CopyCurrentContact()    Dim OutlookObj As Object    Dim InspectorObj As Object    Dim ItemObj As Object    Set OutlookObj = CreateObject("Outlook.Application")    Set InspectorObj = OutlookObj.ActiveInspector    Set ItemObj = InspectorObj.CurrentItem    Application.ActiveDocument.Range.InsertAfter (ItemObj.FullName & " from " & ItemObj.CompanyName) End Sub 

請注意,此代碼將 Outlook 2010 中當前打開的聯系人復制到打開的 Word 2010 文檔中。僅當 Outlook 中包含當前打開以供檢查的聯系人時,此代碼才運行。

總結

本文介紹 Office 2010 中的 Visual Basic for Applications (VBA) 的功能以及 VBA 如何可以自動執行重復任務。

其他資源