VBA代碼必須存放在某個(gè)位置,這個(gè)地方就是模塊。有兩種基本類(lèi)型的模塊:標(biāo)準(zhǔn)模塊和類(lèi)模塊。模塊中的每個(gè)過(guò)程或者是函數(shù)過(guò)程,或者是子程序概念.本課的最后部分將討論函數(shù)過(guò)程和子程序的區(qū)別。
新術(shù)語(yǔ):
模塊:它是作為一個(gè)單元保存在一起的VBA定義和過(guò)程的集合。
類(lèi)模塊:VBA允許你創(chuàng)建自己的對(duì)象,對(duì)象的定義包含在類(lèi)模塊中。
你的大部分工作集中在標(biāo)準(zhǔn)模塊中(簡(jiǎn)稱(chēng)為模塊)當(dāng)錄制宏時(shí)如果不存在模塊,EXCEL自動(dòng)創(chuàng)建一個(gè)。EXCEL和VBA不關(guān)心代碼存放在哪一個(gè)模塊中,只要代碼存在于打開(kāi)的工作簿中即可。
4.2 對(duì)模塊的概覽
過(guò)程被定義為VBA代碼的一個(gè)單元,過(guò)程中包括一系列用于執(zhí)行某個(gè)任務(wù)或是進(jìn)行某種計(jì)算的語(yǔ)句。工作簿的每個(gè)過(guò)程都有唯一的名字加以區(qū)分。
有兩種不同的過(guò)程:子程序和函數(shù)過(guò)程。子程序只執(zhí)行一個(gè)或多個(gè)操作,而不返回?cái)?shù)值。當(dāng)錄制完宏查看代碼時(shí),所看到的就是子程序。宏只能錄制子程序,而不能錄制函數(shù)過(guò)程。一個(gè)子程序的例子如清單4-1所示。
程序清單4-1 子程序的例子
Sub cmdSmallFont_Click()
With Selection.Font
.Name="Arial"
.FontStyle="Regular"
.Size=16
End With
End sub
上面列出的過(guò)程實(shí)際上是一個(gè)事件過(guò)程。通過(guò)它的名字,就可以知道這是一個(gè)事件過(guò)程。這個(gè)過(guò)程的名字是由一個(gè)對(duì)象的名字CmdSmallFont和一個(gè)事件的名字Click組成的,兩者之間用下劃線分開(kāi)。如果還不明白,可以告訴你,CmdSmallFont是一個(gè)命令按鈕的名字。也就是說(shuō),當(dāng)單擊這個(gè)命令按鈕時(shí),就會(huì)運(yùn)行這個(gè)事件過(guò)程。
函數(shù)過(guò)程通常情況下稱(chēng)為函數(shù),要返回一個(gè)數(shù)值。這個(gè)數(shù)值通常是計(jì)算的結(jié)果或是測(cè)試的結(jié)果,例如False 或True.正如前面所說(shuō),可以用VBA創(chuàng)建自定義函數(shù)。實(shí)際上可以在工作表上使用你創(chuàng)建的函數(shù)。程序清單4-2是一個(gè)計(jì)算價(jià)格的10%為運(yùn)費(fèi)的簡(jiǎn)單例子。
程序清單4-2 簡(jiǎn)單的用戶定義函數(shù)示例。
Public Function Shipping(Price)
Shipping = Price * 0.1
End Function
請(qǐng)注意,這個(gè)函數(shù)使用一個(gè)參數(shù)(Price).子程序和函數(shù)都可以使用參數(shù)。不論P(yáng)rice的值是多少,它都將決定運(yùn)費(fèi)額。Price可以是數(shù)字和單元格引用。函數(shù)返回計(jì)算出來(lái)的運(yùn)費(fèi),這個(gè)函數(shù)可以用在單元格中。
A B
1 Price 100
2 Shipping =shipping(B1)
4.2.1 創(chuàng)建過(guò)程
創(chuàng)建第一個(gè)過(guò)程需要兩個(gè)基本步驟。首先,需要向工作簿中添加一個(gè)模塊。接著需要向模塊中添加一個(gè)工程。對(duì)于創(chuàng)建的每一個(gè)應(yīng)用程序,只需添加一次模塊。可以使用多個(gè)模塊,但這是不必要的。某些開(kāi)發(fā)者喜歡使用多個(gè)模塊,以便根據(jù)他們的目的或者窗體對(duì)過(guò)程進(jìn)行組織。在本練習(xí)中,創(chuàng)建的過(guò)程只顯示一個(gè)消息框。
在本練習(xí)中創(chuàng)建的過(guò)程只顯示一個(gè)消息框。在本練習(xí)中使用Msgbox是為了提供一個(gè)可見(jiàn)的例子,雖然我們還沒(méi)有介紹過(guò)Msgbox語(yǔ)句,但是在本例中將使用它。要?jiǎng)?chuàng)建該過(guò)程,請(qǐng)按如下步驟進(jìn)行:
1)打開(kāi)一個(gè)新工作簿。
2)選擇"工具"-"宏"-"Visual Basic編輯器",打開(kāi)VBA編輯器窗口。
3)在`VBA編輯器的左面,可以看到“工程資源管理器”窗口。在工程資源管理器窗口的“Thisworkbook"上單擊鼠標(biāo)右鍵,選擇“插入”-“模塊”,這樣就將一個(gè)模塊添加到應(yīng)用程序中了。(如果你沒(méi)有看見(jiàn)“工程資源管理器”窗口,可以按Ctrl+R)
4)選擇“插入”“過(guò)程”,顯示“添加過(guò)程”對(duì)話框。
5)輸入“第一個(gè)工程”作為過(guò)程名字。在“類(lèi)型”分組框中,確認(rèn)選擇了“子程序”。單擊“確定”按鈕。這樣一個(gè)新的過(guò)程就添加到模塊中了。可以在模塊中看到以 Public Sub 第一個(gè)過(guò)程()開(kāi)始,以End Sub結(jié)束的語(yǔ)句結(jié)構(gòu)。
6)在過(guò)程中插入光標(biāo),輸入以下語(yǔ)句并回車(chē):
Msgbox "這是我的第一個(gè)過(guò)程"
在輸入Msgbox后,會(huì)自動(dòng)彈出一個(gè)消息框告訴你有關(guān)這條命令的信息,稱(chēng)之為自動(dòng)列表技術(shù)。輸入完成的過(guò)程如下所示:
Public Sub 第一個(gè)過(guò)程()
Msgbox "這是我的第一個(gè)過(guò)程"
End Sub
VBA對(duì)子程序和函數(shù)有如下的命名規(guī)則:
* 名字中可以包含字母數(shù)字和下劃線。
* 名字中不能包含空格句號(hào)驚嘆號(hào),也不能包含字符@ & $ #.
* 名字最多可以包含255個(gè)字符。
4.2.2 運(yùn)行宏
創(chuàng)建這個(gè)過(guò)程后,可以運(yùn)行一下。運(yùn)行一個(gè)過(guò)程有幾種方法:可以直接使用“運(yùn)行”菜單,“運(yùn)行子程序/用戶窗體”工具欄按鈕或按下F5鍵。要運(yùn)行一個(gè)過(guò)程,可以按照如下步驟:
1)單擊“運(yùn)行子程序/用戶窗體”工具欄按鈕,過(guò)程執(zhí)行并顯示一個(gè)消息框。
2)單擊消息框之中的“確定”按鈕,關(guān)閉該消息框。
4.3 保存對(duì)模塊所做的改變
要保存新過(guò)程,需要保存過(guò)程所駐留的工作簿.可以用VBA編輯器保存工作簿.具體步驟如下:
1)選擇"文件"-"保存工作簿".因?yàn)楸竟ぷ鞑具沒(méi)有保存過(guò),所以要給它命名.
2)輸入"HOUR4"作為文件名并按回車(chē)鍵,則工作簿和模塊與過(guò)程都保存下來(lái)了.