VBA 代碼必須存放在某個(gè)位置,這個(gè)地方就是模塊。
有兩種基本類型的模塊:標(biāo)準(zhǔn)模塊和類模塊。模塊中的每個(gè)過程可能是函數(shù)過程,也可能是子程序。
本課的最后部分將討論函數(shù)過程和子程序的區(qū)別。
新術(shù)語:模塊:它是作為一個(gè)單元保存在一起的VBA定義和過程的集合。
類模塊:VBA允許你創(chuàng)建自己的對(duì)象,對(duì)象的定義包含在類模塊中。
你的大部分工作集中在標(biāo)準(zhǔn)模塊中(簡(jiǎn)稱為模塊)。
當(dāng)錄制宏時(shí)如果不存在模塊,EXCEL 會(huì)自動(dòng)創(chuàng)建一個(gè)。
EXCEL 和 VBA 不關(guān)心代碼存放在哪一個(gè)模塊中,只要代碼存在于打開的工作簿中即可。
過程被定義為 VBA 代碼的一個(gè)單元,過程中包括一系列用于執(zhí)行某個(gè)任務(wù)或是進(jìn)行某種計(jì)算的語句。工作簿的每個(gè)過程都有唯一的名字加以區(qū)分。
有兩種不同的過程:子程序和函數(shù)過程。子程序只執(zhí)行一個(gè)或多個(gè)操作,而不返回?cái)?shù)值。當(dāng)錄制完宏查看代碼時(shí),所看到的就是子程序。宏只能錄制子程序,而不能錄制函數(shù)過程。一個(gè)子程序的例子如下所示:
例:
Sub cmdSmallFont_Click()
With Selection.Font
.Name="Arial"
.FontStyle="Regular"
.Size=16
End With
End sub
上面列出的過程實(shí)際上是一個(gè)事件過程。通過它的名字,就可以知道這是一個(gè)事件過程。這個(gè)過程的名字是由一個(gè)對(duì)象的名字CmdSmallFont和一個(gè)事件的名字Click組成的,兩者之間用下劃線分開。如果還不明白,可以告訴你,CmdSmallFont是一個(gè)命令按鈕的名字。也就是說,當(dāng)單擊這個(gè)命令按鈕時(shí),就會(huì)運(yùn)行這個(gè)事件過程。
函數(shù)過程通常情況下稱為函數(shù),要返回一個(gè)數(shù)值。這個(gè)數(shù)值通常是計(jì)算的結(jié)果或是測(cè)試的結(jié)果,例如False 或True。
正如前面所說,可以用VBA創(chuàng)建自定義函數(shù)。實(shí)際上可以在工作表上使用你創(chuàng)建的函數(shù)。下面是一個(gè)計(jì)算價(jià)格的10%為運(yùn)費(fèi)的簡(jiǎn)單例子。
簡(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ì)算出來的運(yùn)費(fèi),這個(gè)函數(shù)可以用在單元格中(B2為表達(dá)式)。
A | B | |
1 | Price | 100 |
2 | Shipping | =shipping(B1) |
創(chuàng)建第一個(gè)過程需要兩個(gè)基本步驟。首先,需要向工作簿中添加一個(gè)模塊。接著需要向模塊中添加一個(gè)工程。對(duì)于創(chuàng)建的每一個(gè)應(yīng)用程序,只需添加一次模塊??梢允褂枚鄠€(gè)模塊,但這是不必要的。某些開發(fā)者喜歡使用多個(gè)模塊,以便根據(jù)他們的目的或者窗體對(duì)過程進(jìn)行組織。在本練習(xí)中,創(chuàng)建的過程只顯示一個(gè)消息框。
在本練習(xí)中使用Msgbox是為了提供一個(gè)可見的例子,雖然我們還沒有介紹過Msgbox語句,但是在本例中將使用它。要?jiǎng)?chuàng)建該過程,請(qǐng)按如下步驟進(jìn)行:
1、打開一個(gè)新工作簿。
2、選擇"工具"-"宏"-"Visual Basic編輯器",打開VBA編輯器窗口。
3、在`VBA 編輯器的左面,可以看到"工程資源管理器"窗口。在工程資源管理器窗口的"Thisworkbook"上單擊鼠標(biāo)右鍵,選擇"插入"-"模塊",這樣就將一個(gè)模塊添加到應(yīng)用程序中了。(如果你沒有看見"工程資源管理器"窗口,可以按Ctrl+R)
4、選擇"插入""過程",顯示"添加過程"對(duì)話框。
5、輸入"第一個(gè)工程"作為過程名字。在"類型"分組框中,確認(rèn)選擇了"子程序"。單擊"確定"按鈕。這樣一個(gè)新的過程就添加到模塊中了??梢栽谀K中看到以 P?ublicSub 第一個(gè)過程()
?開始,以?End Sub
?結(jié)束的語句結(jié)構(gòu)。
6、在過程中插入光標(biāo),輸入以下語句并回車:
?Msgbox "這是我的第一個(gè)過程"
?
在輸入Msgbox后,會(huì)自動(dòng)彈出一個(gè)消息框告訴你有關(guān)這條命令的信息,稱之為自動(dòng)列表技術(shù)。
輸入完成的過程如下所示:
Public Sub 第一個(gè)過程()
Msgbox "這是我的第一個(gè)過程"
End Sub
VBA對(duì)子程序和函數(shù)有如下的命名規(guī)則:
* 名字中可以包含字母數(shù)字和下劃線。
* 名字中不能包含空格句號(hào)驚嘆號(hào),也不能包含字符@ & $ #.
* 名字最多可以包含255個(gè)字符。
創(chuàng)建這個(gè)過程后,可以運(yùn)行一下。運(yùn)行一個(gè)過程有幾種方法:可以直接使用"運(yùn)行"菜單,"運(yùn)行子程序/用戶窗體"工具欄按鈕或按下F5鍵。要運(yùn)行一個(gè)過程,可以按照如下步驟:
1、單擊"運(yùn)行子程序/用戶窗體"工具欄按鈕,過程執(zhí)行并顯示一個(gè)消息框。
2、單擊消息框之中的"確定"按鈕,關(guān)閉該消息框。
要保存新過程,需要保存過程所駐留的工作簿.可以用 VBA 編輯器保存工作簿.具體步驟如下:
1、選擇"文件"-"保存工作簿".因?yàn)楸竟ぷ鞑具€沒有保存過,所以要給它命名.
2、輸入"HOUR4"作為文件名并按回車鍵,則工作簿和模塊與過程都保存下來了.。
變量是用于臨時(shí)保存數(shù)值的地方.每次應(yīng)用程序運(yùn)行時(shí),變量可能包含不同的數(shù)值,而在程序運(yùn)行時(shí),變量的數(shù)值可以改變.
為了說明為什么需要變量,可以按照如下步驟創(chuàng)建一個(gè)簡(jiǎn)單的過程:
1、創(chuàng)建一個(gè)名為"你叫什么名字"的過程。
2、在過程中輸入如下代碼:?Inputbox "輸入你的名字:"
?
現(xiàn)在不要擔(dān)心inputbox語句的語法,將在第六小節(jié)中了解到有關(guān)這條命令的更多信息。
3、按下F5鍵運(yùn)行過程,這時(shí)會(huì)顯示一個(gè)輸入框,要求輸入你的名字。
4、輸入你的名字按"確定"按鈕,則結(jié)束該過程。
你輸入的名字到那里去了?如何找到用戶在輸入框中輸入的信息?在這種情況下,需要使用變量來存儲(chǔ)用戶輸入的結(jié)果。
使用變量的第一步是了解變量的數(shù)據(jù)類型.變量的數(shù)據(jù)類型控制變量允許保存何種類型的數(shù)據(jù).下表列出了VBA支持的數(shù)據(jù)類型,還列出了各種類型的變量所需要的存儲(chǔ)空間和能夠存儲(chǔ)的數(shù)值范圍。
數(shù)據(jù)類型 | 存儲(chǔ)空間 | 數(shù)值范圍 |
Byte(位) | 1字節(jié) | 0-255 |
Boolean(布爾型) | 2字節(jié) | True或者False |
Integer(整型) | 2字節(jié) | -32,768 ~ 32,767 |
Long(長(zhǎng)整型) | 4字節(jié) | -2,147,483,648 ~2,147,483,647 |
Single (單精度浮點(diǎn)數(shù),類似于C語言的float) | 4字節(jié) | 負(fù)值范圍:-3.402823E38 ~ -1.401298E-45 正值范圍:1.401298E-45 ~ 3.402823E38 |
Double (雙精度浮點(diǎn)型) | 8字節(jié) | 負(fù)值范圍:-1.79769313486232E308 ~ -4.94065645841247E-324 正值范圍:4.94065645841247E-324 ~ 1.79769313486232E308 |
Currency (貨幣類型) | 8字節(jié) | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
Decimal (精準(zhǔn)型) | 14字節(jié) | 不包括小數(shù)時(shí): -79,228,162,514,264,337,593,543,950,335 ~ +79,228,162,514,264,337,593,543,950,335 包括小數(shù)時(shí): -7.9228162514264337593543950335 ~ +7.9228162514264337593543950335 |
Date | 8字節(jié) | 1000年1月1日 ~ 9999年12月31日 |
Object | 4字節(jié) | 任何引用對(duì)象 |
String(長(zhǎng)字符串) | 10字節(jié)+1字節(jié)/字符 | 0 ~ 約20億 |
String(固定長(zhǎng)度) | 字符串的長(zhǎng)度 | 1 ~約65400 |
Varient(數(shù)字) | 16字節(jié) | double范圍內(nèi)的任何數(shù)值 |
Varient(文本) | 22字節(jié)+1字節(jié)/字符 | 數(shù)據(jù)范圍和變長(zhǎng)字符串相同 |
注: Currency是vb獨(dú)有的一種數(shù)據(jù)類型,他用來進(jìn)行貨幣的換算和定點(diǎn)計(jì)算特別方便(他的精度是確定的,不會(huì)出現(xiàn)精度帶來的舍入誤差)。
decimal與single和double的區(qū)別是,前者不是浮點(diǎn)數(shù)據(jù)類型,他的精度是確定的。因?yàn)槭褂玫膬?nèi)存空間極大,他可以將精度控制得很準(zhǔn)確(比后兩者更準(zhǔn)確),但因此犧牲了其性能,在有精度要求(無法容忍精度帶來的舍入誤差,比如財(cái)務(wù)計(jì)算)的情況下建議使用decimal。
作為 VBA 程序員,一個(gè)目標(biāo)是選擇需要存儲(chǔ)空間盡量小的數(shù)據(jù)類型來保存所需要的數(shù)據(jù),這正是上表提供各種數(shù)據(jù)類型存儲(chǔ)空間的原因。例如,要保存諸如班級(jí)學(xué)生總數(shù)這樣的小數(shù)字,那么Byte數(shù)據(jù)類型就足夠了。在這種情況下,使用Single數(shù)據(jù)類型只是對(duì)計(jì)算機(jī)存儲(chǔ)空間的浪費(fèi)。
現(xiàn)在,你對(duì)變量可以使用的數(shù)據(jù)類型已經(jīng)比較熟悉了,接下來我們將創(chuàng)建變量。創(chuàng)建變量可以使用Dim語句,創(chuàng)建變量通常稱為"聲明變量" Dim語句的基本語法如下:
?Dim 變量名 AS 數(shù)據(jù)類型
?
這條語法中的變量名代表將要?jiǎng)?chuàng)建的變量名。對(duì)變量的命名規(guī)則和對(duì)過程的命名規(guī)則相同。
這條語句中的數(shù)據(jù)類型部分可以是上表中的任何一種數(shù)據(jù)類型。
變量名必須以字母開始,并且只能包含字母數(shù)字和特定的特殊字符,不能包含空格句號(hào)驚嘆號(hào),也不能包含字符@ & $ #。
名字最大長(zhǎng)度為255個(gè)字符。
在接下來的練習(xí)中將說明如何在 VBA 中使用變量。你將要輸入你的名字,并用一個(gè)消息框?qū)⑵滹@示出來。具體步驟如下:
1、創(chuàng)建一個(gè)名為"顯示你的名字"的子程序.
2、輸入以下代碼:
Public Sub 顯示你的名字()
Dim s名字 As String
s名字 = Inputbox("請(qǐng)輸入你的名字:")
Msgbox "你好"& s名字
End Sub
3、將鼠標(biāo)放到過程中的任何地方,按下F5鍵運(yùn)行過程,會(huì)顯示一個(gè)輸入框。
4、輸入你自己的名字并按回車鍵,會(huì)顯示一個(gè)消息框,顯示的文字中包含你自己的名字。
5、單擊"確定"按鈕,返回過程中。
在 Dim 語句中不必提供數(shù)據(jù)類型.如果沒有數(shù)據(jù)類型,變量將被定義為 Variant 類型,因?yàn)閂BA 中默認(rèn)的數(shù)據(jù)類型是 Variant.你知道這一點(diǎn)后,最初的反應(yīng)也許是覺得應(yīng)該不用自己決定數(shù)據(jù)類型,而將一切拋給VBA.這種觀念是完全錯(cuò)誤的。你必須決定選擇使用何種數(shù)據(jù)類型。因?yàn)閂ariant數(shù)據(jù)類型占用存儲(chǔ)空間較大(16或22字節(jié))而且它將影響程序的性能。VBA必須辨別Variant類型的變量中存儲(chǔ)了何種類型的數(shù)據(jù)。
變量命名的慣例
下表給出了推薦的變量命名慣例
如果你使用過其他編程序語言,可能對(duì)數(shù)組已經(jīng)比較熟悉了.數(shù)組是具有相同數(shù)據(jù)類型并共同享有一個(gè)名字的一組變量的集合.數(shù)組中的元素通過索引數(shù)字加以區(qū)分,定義數(shù)組的方法如下:
?Dim array_name(n) As type
? (其中n是數(shù)組元素的個(gè)數(shù))
例如,如果要?jiǎng)?chuàng)建保存10個(gè)學(xué)生名字的數(shù)組,可以用以下語句:
?Dim s學(xué)生名字(9) As Integer
?
注意,括號(hào)中的數(shù)字是9而不是10.這是因?yàn)樵谀J(rèn)的情況下,第一個(gè)索引數(shù)字是0.數(shù)組在處理相似信息時(shí)非常有用.假設(shè)要處理15門考試成績(jī),可以創(chuàng)建15個(gè)獨(dú)立的變量,這意味著要使用15個(gè)Dim語句。也可以創(chuàng)建一個(gè)數(shù)組來保存考試成績(jī),具體如下:
Dim s學(xué)生名字(14) As Integer
?
聲明數(shù)組時(shí)的另一種方法是不給定大小。可以在程序運(yùn)行時(shí)定義其大小。通過創(chuàng)建動(dòng)態(tài)數(shù)組就可以做到。例如,你的程序要?jiǎng)?chuàng)建一表格,可以提示用戶輸入表格的行和列的數(shù)目。聲明動(dòng)態(tài)數(shù)組的語法如下:
?Dim dyn_array() As type
?
對(duì)數(shù)組聲明后可以在程序運(yùn)行時(shí)用:ReDim語句指定數(shù)組的大?。?/p>
?ReDim dyn_array()(array_size)
?
參數(shù)array_size代表數(shù)組的新大小。如果要保留數(shù)組的數(shù)值,請(qǐng)?jiān)赗eDim語句后使用保留字Preserve,具體語法如下:
?ReDim Preserve dyn_array(array_size)
?
聲明變量后就可以給變量賦值。請(qǐng)注意下列語句中為數(shù)組變量賦值時(shí)索引數(shù)字的使用。
Dim i人數(shù) As Integer
Dim i考試成績(jī)() As Integer
Dim i As Integer
i人數(shù) = inputbox("輸入學(xué)生的人數(shù):")
ReDim Preserve i考試成績(jī)(i人數(shù))
For i = 1 to i人數(shù)
i考試成績(jī)(i) = inputbox("輸入考試成績(jī)"& i )
Next
更多建議: