Office 2010
35(共 38)對本文的評價是有幫助 評價此主題

摘要:向還不是程序員的 Excel 高級用戶介紹 Excel 2010 中的 Visual Basic for Applications (VBA)。本文提供 VBA 語言概述、有關如何在 Excel 2010 中訪問 VBA 的說明、面向實際 Excel VBA 編程問題的解決方案的詳細說明以及有關編程和調試的提示。

社區成員圖標 Ben Chinowsky,SDK Bridge

2009 年 11 月

適用范圍:Microsoft Excel 2010

目錄

為什么在 Excel 2010 中使用 VBA?

Microsoft Excel 2010 是一個功能相當強大的工具,您可以使用它操作、分析和顯示數據。不過有時候,盡管標準 Excel 用戶界面 (UI) 中提供了豐富的功能集,但您可能仍想要找到一種更簡便的方法來執行繁瑣的重復任務,或執行某個 UI 似乎無法解決的任務。幸運的是,像 Excel 這樣的 Office 應用程序提供了 Visual Basic for Applications (VBA)。這是一種編程語言,您可以通過它來擴展這些應用程序。

VBA 是通過運行(在 Visual Basic 中編寫的分步過程)來工作的。學習編程可能看起來很困難,但只要多些耐心,多學習像本文中介紹的示例,許多用戶會發現,甚至只需學會少量 VBA 代碼,就會使工作變得更加簡單,而且可以在 Office 中完成他們以前認為不可能做到的事情。一旦學會了一些 VBA,便可以更加輕松地掌握更多的 VBA,因此,這種可能性是無限的。

迄今為止,在 Excel 中使用 VBA 最常見的原因就是自動完成重復的工作。例如,假定您有好幾十個工作簿,每個工作簿都包含好幾十個工作表,這些工作表都需要進行更改。這些更改既可能很簡單,例如對固定的單元格范圍應用新格式;也可能很復雜,例如,查看每個工作表中的數據的統計特征,再選擇最恰當的圖表類型來顯示數據和這些特征,然后創建圖表并設置相應格式。

對于上述任一種情況,您都可能不愿意手動執行這些任務,最多也就愿意重復執行幾次。您可以改為使用 VBA 來編寫要 Excel 執行的顯式指令,從而自動完成這些任務。

VBA 不僅僅可用于重復任務。您還可以使用 VBA 構建 Excel 的新功能(例如,您可以開發新算法來分析數據,然后使用 Excel 中的圖表功能顯示結果),也可以執行將 Excel 與其他 Office 應用程序(如 Microsoft Access 2010)集成的任務。事實上,在所有 Office 應用程序中,Excel 最常用作一個類似于常規開發平臺的工具。除了所有涉及列表和會計的顯而易見的任務之外,從數據可視化到軟件原型制作的大量任務中,開發人員都可使用 Excel。

盡管有這么多原因要在 Excel 2010 中使用 VBA,但一定要記住,解決問題的最佳方案可能是根本就不涉及 VBA。即使沒有 VBA,Excel 仍然提供了大量的功能,就連高級用戶也不可能完全熟悉這些功能。在決定采用 VBA 解決方案之前,請全面搜索“幫助”和聯機資源以確定沒有更簡單的方法。

VBA 編程 101

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

您可能認為編寫代碼是一項神秘而又復雜的工作,但基本原則是使用日常推理,并且很容易掌握。Office 2010 應用程序的創建方式公開了一些名為對象 的內容,這些對象可以接收指令。通過向應用程序中的各種對象發送指令,可與應用程序進行交互。這些對象數量眾多、類型各異而且使用靈活,但是它們也有局限性。這些對象只能執行為其設計的操作,并且只按照您的指令執行操作。

對象

在應用程序的名為對象模型 的層次結構中,編程對象彼此之間有系統地相互關聯。對象模型會大致反映您在用戶界面中看見的內容;例如,Excel 對象模型包含 ApplicationWorkbookSheet 和 Chart 對象以及其他很多對象。對象模型是應用程序及其功能的概念圖。

屬性和方法

可通過設置對象的屬性 和調用對象的方法 來操作對象。設置屬性可更改對象的某些性質。調用方法可使對象執行某個操作。例如,Workbook 對象具有一個用于關閉工作簿的 Close 方法和一個用于表示工作簿中當前活動的工作表的 ActiveSheet 屬性。

集合

許多對象有單復數之分,例如 Workbook 和 Workbooks;Worksheet 和 Worksheets,等等。對象的復數形式稱作集合。集合對象用于對集合中的多個項執行一個操作。本文稍后將介紹如何使用 Worksheets 集合來更改工作簿中每個工作表的名稱。

宏和 Visual Basic 編輯器

現在,您已對 Microsoft Excel 2010 如何公開其對象模型的方式有所了解,接下來可以嘗試調用對象方法并設置對象屬性。為此,您必須在一個位置以 Office 可以理解的方法編寫代碼;通常使用是 Visual Basic 編輯器。盡管默認情況下會安裝該編輯器,但在功能區中啟用該編輯器之前,許多用戶都不知道該編輯器的存在。

“開發工具”選項卡

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

啟用“開發工具”選項卡

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

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

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

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

  5. 單擊“確定”

在 Excel 顯示“開發工具”選項卡之后,注意選項卡上“Visual Basic”、“宏”和“宏安全性”按鈕的位置。



圖 1. Excel 2010 中的“開發工具”選項卡

Excel 2010 中的開發人員選項卡

安全問題

單擊“宏安全性”按鈕可以指定哪些宏可以運行并需滿足哪些條件。盡管未授權宏代碼可能會嚴重損害計算機,但阻止您運行有幫助的宏的安全條件會嚴重妨礙您的工作效率。宏安全性是一個復雜而又涉及廣泛的話題,您應研究并了解是否應使用 Excel 宏。

在本文中,請注意,如果當您打開一個包含宏的工作簿時,在功能區和工作表之間出現“安全警告: 宏已被禁用”條,則可單擊“啟用內容”按鈕來啟用宏。

此外,作為一種安全措施,您不能以默認的 Excel 文件格式 (.xlsx) 保存宏;而必須將宏保存在具有一個特殊擴展名 .xlsm 的文件中。

Visual Basic 編輯器

以下過程演示如何創建一個儲存宏的新的空白工作簿。然后,可以按 .xlsm 格式保存該工作簿。

創建一個新的空白工作簿

  1. 單擊“開發工具”選項卡上的“宏”按鈕。

  2. 在隨后出現的“宏”對話框中,在“宏名稱”下鍵入 Hello

  3. 單擊“創建”按鈕打開 Visual Basic 編輯器,其中包含已鍵入的新宏的大綱。

VBA 是一種功能齊全的編程語言,并具有一個相應的功能齊全的編程環境。本文只介紹那些您剛開始編程所使用的工具,而不介紹 Visual Basic 編輯器中的大部分工具。出于這個原因,請關閉 Visual Basic 編輯器左側的“屬性”窗口,并忽略在代碼上方顯示的兩個下拉列表。



圖 2. Visual Basic 編輯器

Visual Basic Editor

Visual Basic 編輯器包含下列代碼。

Sub Hello()  End Sub 

Sub 代表子例程,現在可將它定義為“宏”。運行 Hello 宏將運行 Sub Hello() 與 End Sub 之間的任何代碼。

現在,請編輯宏,使其類似于以下代碼。

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

返回到 Excel 中的“開發工具”選項卡,再次單擊“宏”按鈕。

在隨后出現的列表中選擇“Hello”宏,然后單擊“運行”顯示包含文本“Hello, world!”的小型消息框。

您剛才在 Excel 中創建并實現了自定義 VBA 代碼。在消息框中單擊“確定”關閉消息框并完成宏的運行。

如果未出現消息框,請檢查宏安全性設置并重新啟動 Excel。

使宏可供訪問

還可以從“視圖”選項卡訪問“宏”對話框。但是,如果您頻繁使用某個宏,則使用一個快捷方式或“快速訪問工具欄”按鈕來訪問它可能會更方便。

若要在“快速訪問工具欄”中為“Hello”宏創建一個按鈕,請使用以下過程。

以下過程描述了如何在“快速訪問工具欄”上為宏創建按鈕:

在“快速訪問工具欄”中為宏創建按鈕

  1. 單擊“文件”選項卡。

  2. 單擊“選項”打開“Excel 選項”對話框,然后單擊“快速訪問工具欄”

  3. 在“從下列位置選擇命令:”下的列表中,選擇“宏”。在隨后出現的列表中查找類似于“Book1!Hello”的文本,并選擇該文本。

  4. 單擊“添加 >>”按鈕將宏添加到右側的列表中,然后單擊“修改…”按鈕選擇與該宏關聯的按鈕圖像。

  5. 單擊“確定”。現在,您應在“快速訪問工具欄”中的“文件”選項卡上方看到新按鈕。

現在,您不必使用“開發工具”選項卡,便可隨時快速運行宏,趕快試試吧。

一個實際示例

假定您有一個工作簿,其中的大量工作表上都包含列表,您需要更改每個工作表的名稱,以與工作表上的列表標題相匹配。并不是每個工作表上都包含列表,但是如果包含列表,則標題在單元格 B1 中,如果不包含列表,則單元格 B1 為空白。不包含列表的工作表名稱應原樣保留。

通常,這可能是一個涉及以下操作的很復雜的任務:查看每一個工作表是否包含列表,如果包含列表,則復制列表名稱,單擊工作表標簽,然后貼入新名稱。可使用 Excel VBA 自動重新命名工作表,而不必手動執行所有上述步驟。

了解對象

若要解決 VBA 編程問題,首先必須搞清楚代碼將操作哪些對象。可用來研究此信息的一個基本工具是 Excel 對象模型參考,它是 Microsoft Developer Network (MSDN) 上的 Excel 2007 開發人員參考的一部分。

在 Excel 2010 公開發布之后,這些參考材料將會針對 Excel 2010 進行更新,但 Excel 2007 開發人員參考可適用于大部分 Excel 2010 用途。



圖 3. MSDN 上的 Excel 對象模型參考

MSDN 上的 Excel 對象模型引用

第一步是搞清楚如何操作您完成任務需要使用的特定對象;例如,工作表、工作表名稱、單元格和單元格內容。在 Excel 中,至少有兩種方法可以解決此問題:

  • 直接查看對象模型參考。

  • 錄制一些您需要自動執行的操作,查看已錄制的代碼是如何操作對象的,然后查看對象模型參考以獲取更多信息。

根據首選方法的不同,選項也不同,但是現在,首先請嘗試使用錄制宏。

使用錄制宏

有時,一個簡單的錄制宏就可以滿足您的全部需要;在這種情況下,您甚至不必查看代碼。更為常見的情況是,只錄制是不夠的,它只是后續過程的一個起點。

將錄制宏用作解決方案的起點

  1. 錄制您需要編碼的操作。

  2. 查看代碼,并找到執行這些操作的行。

  3. 刪除代碼的剩余部分。

  4. 修改錄制的代碼。

  5. 添加錄制宏無法錄制的變量、控制結構和其他代碼。

通過錄制一個將工作表重新命名為 New Name 的宏來開始研究代碼。然后可使用錄制的宏開發您自己的宏,使它可以基于工作表的內容重新命名多個工作表。

錄制可重命名工作表的宏

  1. 在“開發工具”選項卡上,單擊“錄制宏”

  2. 將該宏命名為 RenameWorksheets,將 Sheet1 重命名為 New Name,然后單擊“停止錄制”

  3. 轉到“開發工具”或“視圖”選項卡,單擊“宏”按鈕,選擇“編輯”以打開 Visual Basic 編輯器。

Visual Basic 編輯器看起來應像下面這樣。

Sub RenameWorksheets() ' ' RenameWorksheets Macro ' '     Sheets("Sheet1").Select     Sheets("Sheet1").Name = "New Name" End Sub 

Sub 行后面的前四行為注釋。任何以撇號開始的行均為注釋,對宏執行的操作沒有任何影響。注釋的主要作用是:

  • 使代碼更加便于理解,不僅方便您,而且還方便其他以后可能需要修改此代碼的任何人。

  • 暫時禁用代碼行(稱作將代碼注釋掉)。 

此錄制的宏中的四個注釋沒有起到上述的任何一個作用,因此刪除它們。

接下來的行使用 Select 方法選擇 Sheets 集合對象的 Sheet1 成員。在 VBA 代碼中,在操作對象之前通常并不需要選擇對象,即使錄制宏執行了此操作,也同樣如此。換句話說,此行代碼是多余的,因此也可刪除它。

錄制的宏的最后一行修改 Sheets 集合的 Sheet1 成員的 Name 屬性。這是要保留的行。

在經過更改后,現在錄制的代碼看起來應像下面這樣。

Sub RenameWorksheets()     Sheets("Sheet1").Name = "New Name" End Sub 

手動將名為“New Name”的工作表改回為“Sheet1”,然后運行該宏。此名稱應更改回“New Name”。

修改錄制的代碼

現在來研究錄制宏使用的 Sheets 集合。對象模型參考中的“工作表”主題包括類似下面這樣的文本。

Sheets 集合可能包含 Chart 或 Worksheet 對象。如果您需要使用只包含一種類型的工作表,請查看該工作表類型的對象主題。”

您現在只使用 Worksheets,因此將代碼更改為下面這樣。

Sub RenameWorksheets()     Worksheets("Sheet1").Name = "New Name" End Sub 

循環

此時的代碼有一個限制,即,它只能對一個工作表進行更改。您可以為需要重命名的每個工作表添加對應的行,但是,如果您不知道有多少個這樣的工作表,或者不知道這些工作表的當前名稱是什么,怎么辦?您需要一種方法對工作簿中的每一個 工作表應用某個規則。

VBA 具有一個理想的稱為“For Each”循環的構造。For Each 循環可檢查集合對象(例如 Worksheets)中的每一項,還可用于對這些項中的部分或全部執行一個操作(如更改名稱)。

有關 For Each 循環的更多信息,請參閱 VBA 語言參考。單擊“Visual Basic Conceptual Topics”(Visual Basic 概念性主題),再單擊“Using For Each...Next Statements”(使用 For Each...Next 語句)。請注意,VBA 語言參考與對象模型參考一樣,可以讓您做到事半功倍,這是一個當您使用代碼遇到困難時尋找解決方法的好地方。

使用“Using For Each...Next Statements”(使用 For Each...Next 語句)主題中的第三個示例,編輯該宏,以便它看起來類似于下面的代碼。

Sub RenameWorksheets() For Each myWorksheet In Worksheets     myWorksheet.Name = "New Name" Next End Sub 

myWorksheet 是一個變量;也就是說,它表示的內容會發生變化。在這種情況下,myWorksheet 變量相繼表示Worksheets 集合中的每一個工作表。您不一定要使用 myWorksheet;可以使用“x”、“ws”、“WorksheetToRenameAfterTheContentsOfCellB1”或者您想要使用的幾乎任何名稱(具有一些限制)。一個很好的準則就是,使用的變量名稱的長度足以提醒您變量代表的內容,但也不要太長以致造成代碼混亂不堪。

如果此時運行該宏,它會發生錯誤,因為 Excel 要求工作簿中的每一個工作表具有唯一名稱,但下一行代碼指示 Excel 為每個工作表賦予相同的名稱。

    myWorksheet.Name = "New Name" 

若要更正此行以便您可以確認 For Each 循環能正常運行,應將此行做如下更改。

    myWorksheet.Name = myWorksheet.Name & "-changed" 

此行會將每個工作表的當前名稱 (myWorksheet.Name) 更改為在當前名稱后面追加“-changed”,而不是嘗試為每個工作表賦予相同的名稱。

有用的重命名

現在,該宏正在接近于實際解決手頭的問題。現在您需要一種方法來從工作表本身獲取信息,具體而言,就是從每個工作表的 B1 單元格獲取信息,然后將獲取信息放入到工作表名稱中。

這一次,不再使用錄制宏來搞清楚如何引用某個單元格,猜猜看,使用 Cell 對象是否可行。這個想法很好,不過,如果您打開對象模型參考并搜索 Cell 對象,就會發現根本沒有 Cell 對象!但是有一個 CellFormat 對象(該鏈接可能指向英文頁面)

CellFormat 對象主題在第一個代碼示例中包括下面的代碼。

    ' Set the interior of cell A1 to yellow.     Range("A1").Select 

此代碼表明,您使用 Range 指定單元格區域或僅指定一個單元格。同樣,您不需要 .Select 部分,但需要搞清楚如何引用 Range 對象的內容(與 Range 對象本身相對)。如果您查看 Range 對象主題,則會了解到Range 同時具有 Methods 和 PropertiesRange 的內容是一個事物,而不是一個操作,因此,它很可能是一個 Property。如果向下翻看列表,則會看到 Value 屬性。因此,請嘗試以下代碼。

Sub RenameWorksheets() For Each myWorksheet In Worksheets     myWorksheet.Name = myWorksheet.Range("B1").Value Next End Sub 

如果您對包含 B1 為空的工作表的工作簿運行此代碼,則會發生錯誤,因為空的 Range 具有一個 "" 值(一個空文本字符串),這不是合法的工作表名稱。現在差不多該創建一些示例數據了。在工作簿中創建三個與下圖類似的工作表,然后運行該宏。



圖 4. RenameWorksheets 宏的示例數據

用于 RenameWorksheets 宏的簡單數據

 

用于 RenameWorksheets 宏的簡單數據

 

用于 RenameWorksheets 宏的簡單數據

 

工作表名稱應會相應地進行更改。

檢查空單元格

如上文所述,工作簿中任何 B1 單元格為空,則該宏會失敗。不用手動檢查每個工作表,可對該宏進行編碼來執行此操作。在 myWorksheet.Name 行之前添加下面的代碼行。

If myWorksheet.Range("B1").Value <> "" Then 

并且在 myWorksheet.Name 行之后添加下面的文本。

End If 

這稱作“If…Then”語句。If…Then 語句指示 Excel:只要滿足 If 行中的條件,就執行 If 行和 End If 行之間的行上的任何操作。此示例中,下面的行指定要滿足的條件。

myWorksheet.Range("B1").Value <> "" 

<> 表示“不等于”,而中間沒有任何內容的雙引號表示一個空文本字符串;也就是說,無任何文本。因此,只有在 B1 單元格中的值不等于空(即,B1 單元格中有文本)時,才會執行 If 和 End If 之間的任何代碼行。

有關 If…Then 語句的更多信息,請參閱 VBA 語言參考。(全稱為“If…Then…Else 語句”,其中 Else 是可選組件。)

變量聲明

應對該宏所做的另一個改進是在該宏的開頭放置一個 myWorksheet 變量聲明。

Dim myWorksheet As Worksheet 

Dim 是“Dimension”的簡寫,Worksheet 是此特定變量的類型。此語句告訴 VBA myWorksheet 表示的實體類型。注意,當您鍵入 As 之后,Visual Basic 編輯器會顯示一個彈出列表,其中列出了所有可用的變量類型。這是 IntelliSense 技術的一個示例;即,Visual Basic 編輯器會對它確定您嘗試要執行的操作做出響應,并提供適用選項的列表。您可以從列表中選擇一個選項,或者繼續鍵入。

盡管 VBA 中并不要求變量聲明,但還是強烈推薦使用!通過變量聲明,可以更容易地跟蹤您的變量以及代碼中的錯誤。此外需注意,如果您聲明一個帶有對象類型(如 Worksheet)的變量,而且您稍后在該宏中使用該對象變量,則 IntelliSense 會顯示與該對象相關的屬性和方法的適當列表。

注釋

現在該宏已經很復雜,可以包含一些注釋來提醒您代碼執行的操作。使用的注釋數量部分地取決于個人風格,但通常而言,注釋多比注釋少好。隨著時間的推移,通常需要修改和更新代碼。如果沒有注釋,則可能很難理解代碼的意圖,尤其是在修改代碼的人不是當初編寫代碼的人的情況下。為 If 條件和重命名工作表的行添加注釋,得到的代碼應如下所示。

Sub RenameWorksheets() Dim myWorksheet As Worksheet For Each myWorksheet In Worksheets     'make sure that cell B1 is not empty     If myWorksheet.Range("B1").Value <> "" Then         'rename the worksheet to the contents of cell B1         myWorksheet.Name = myWorksheet.Range("B1").Value     End If Next End Sub 

為了測試該宏,將工作表重命名回 Sheet1Sheet2 和 Sheet3,在一個或多個工作表中刪除單元格 B1 的內容。運行該宏,驗證它是否重命名單元格 B1 中有文本的工作表,并且保留其他工作表的名稱不變。該宏適用于任何數量的、混合了已填充的 B1 單元格與空的 B1 單元格的工作表。

可以使用 VBA 完成的更多任務

本節介紹在 Excel 2010 中可以使用 VBA 完成的更多任務。本節中的示例旨在讓您了解 VBA 的功能,而不是重點介紹特定的實際應用場景。您可能會發現,在演練這些示例時,在對象模型參考中查看每一步操作中的對象的信息會很有用。

樂于學習的態度的重要性

學習一般的編程(具體為 Excel VBA)的一個好方法就是采用一種策略,嘗試新的內容,努力搞懂它,然后問自己一些問題,例如:

  • 接下來我可以嘗試點什么?

  • 如果我想要使用 VBA,我首先要學習什么?

  • 有哪些我想知道的好玩或有趣的內容?

  • 我對哪些內容感到好奇?

強烈建議讀者探索通向開啟知識大門的道路。

圖表

Excel 中的一個常見任務是基于一個單元格區域創建圖表。創建一個名為 AssortedTasks 的新宏,然后在 Visual Basic 編輯器中鍵入以下文本。

Dim myChart As ChartObject 

添加一行以創建圖表對象,并將 myChart 變量分配給它。

Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200) 

括號中的數字決定圖表的位置和大小。前兩個數字是圖表左上角的坐標,后面的兩個數字是寬度和高度。

新建一個空的工作表,并運行該宏。該宏創建的圖表中沒有數據,因此沒有用。刪除您剛剛創建的圖表,將以下幾行添加到該宏的末尾。

With myChart     .Chart.SetSourceData Source:=Selection End With 

這是 VBA 編程中的一個常用模式。首先,創建一個對象,將其分配給一個變量,然后使用 With…End With 構造來對該對象執行操作。示例代碼指示圖表使用當前選擇內容作為其數據。(Selection 是 SetSourceData 方法的 Source 參數的值,而不是某個對象屬性的值,因此,VBA 語法要求您使用冒號和等于號 (:=) 替代一個等于號 (=) 來賦值。)

在單元格 A1:A5 中鍵入一些數字,選擇這些單元格,然后運行該宏。圖表將按默認類型(條形圖)顯示。



圖 5. 使用 VBA 創建的條形圖

使用 VBA 創建的條形圖

如果您不喜歡條形圖,則可以使用與下面類似的代碼,將條形圖更改為某種其他類型的圖表。

With myChart     .Chart.SetSourceData Source:=Selection     .Chart.ChartType = xlPie End With 

xlPie 是內置常數(也稱為“枚舉常數”)的一個示例。Excel 中有很多這樣的常數,并且這些常數已經被詳盡地記錄下來。有關內置常數的更多信息,請參閱對象模型參考的“Enumerations”(枚舉)部分。例如,圖表類型的常數將會在“XlChartType Enumeration”(XlChartType 枚舉)下列出。

您可以修改數據。例如,嘗試將此行添加到變量聲明的后面。

Application.ActiveSheet.Range("a4").Value = 8 

可以從用戶獲取輸入,并使用該輸入修改數據。

myInput = InputBox("Please type a number:") Application.ActiveSheet.Range("a5").Value = myInput 

最后,將下面的行添加到該宏的末尾。

ActiveWorkbook.Save ActiveWorkbook.Close 

現在,完整的宏看起來應像下面這樣。

Sub AssortedTasks() Dim myChart As ChartObject Application.ActiveSheet.Range("a4").Value = 8 myInput = InputBox("Please type a number:") Application.ActiveSheet.Range("a5").Value = myInput Set myChart = ActiveSheet.ChartObjects.Add(100, 50, 200, 200) With myChart     .Chart.SetSourceData Source:=Selection     .Chart.ChartType = xlPie End With ActiveWorkbook.Save ActiveWorkbook.Close End Sub 

驗證單元格 A1:A5 是否仍然為選中狀態,運行該宏,在輸入框中鍵入一個數字,然后單擊“確定”。此代碼將保存并關閉工作簿。重新打開工作簿,并注意對餅圖的更改。

用戶窗體

前一節演示了如何使用一個簡單的輸入框獲取用戶的輸入。除了顯示信息的相應消息框之外,VBA 還提供了大量功能,以便您可以用來創建自定義對話框,對直接放置在工作表上的控件進行編碼,或者操作 Excel 中內置的對話框。有關這些功能的更多信息,請參閱 Excel 2007 開發人員參考中的控件、對話框和窗體

本節快速介紹一下用戶窗體,至此便完成對 Excel VBA 的簡單介紹。

在“開發工具”選項卡上,單擊“Visual Basic”按鈕以打開 Visual Basic 編輯器,然后轉到“插入”菜單,選擇“用戶窗體”以打開“用戶窗體設計視圖”

您將看見兩個窗口。一個窗口表示您創建的用戶窗體,另一個窗口就是“工具箱”,其中顯示您可以添加到用戶窗體中的各種控件。例如,命令按鈕、選項按鈕、復選框等等。可將鼠標移動到“工具箱”控件的上方,查看它創建的是哪種控件。

創建一個非常簡單的用戶窗體,其中包含一個可運行本文前面所述的 Hello 宏的按鈕。在“工具箱”中,按下CommandButton 控件,然后將其拖動到用戶窗體來創建一個命令按鈕。右鍵單擊該命令按鈕,選擇“查看代碼”

您看到的 Sub 是一個事件過程 的主干。在發生特定事件時將會運行事件過程。在此例中,正如 Sub 的名稱所示,運行代碼的事件為 CommandButton1 上的 Click。將下面一行添加到事件過程中。

Run("Hello") 

現在 Visual Basic 編輯器應看起來像下面這樣。



圖 6. CommandButton1_Click 事件過程

CommandButton1_Click 事件過程

保存工作簿,轉到“窗口”菜單,選擇“UserForm1 (用戶窗體)”,以重新顯示用戶窗體。單擊工具欄上的綠色箭頭運行用戶窗體。在對話框出現后,單擊命令按鈕以運行 Hello 宏,這將顯示“Hello, world!”消息框。關閉該消息框以返回到正在運行的用戶窗體,然后關閉正在運行的用戶窗體以返回到“設計視圖”

下一步做什么?

您可能會發現,通過結合一些試驗并仔細閱讀對象模型參考和 VBA 語言參考,您可以從本文中獲得足夠的信息來幫助完成任何激勵您開始學習 VBA 的任務。如果是這樣的話,則太好了!如果不是這樣,下一步最好是更多地大致了解 VBA。

學習更多有關 VBA 的知識的一種方法就是研究實用代碼。除了對象模型參考和 VBA 語言參考中的示例之外,各種聯機源中提供了大量的 Excel VBA 代碼,包括 MSDN 上的文章、由專門研究 Excel 的 Microsoft 最有價值專家 (MVP) 維護的網站以及您可以通過快速 Web 搜索找到的其他內容。

這些資源中的代碼可幫助您解決當前的編碼問題,還可以幫助您為可能尚未考慮過的項目提供靈感。

如果您更愿意系統地學習 VBA,則可以閱讀有關 VBA 的幾本好書,網上有一些關于這幾本書的不錯的評論,可幫助您選擇最適合自己的學習風格的書。

其他資源