1 常量與變量
1.1 VB的數據類型
數據類型是數據的表示和存儲形式。VB定義的基本數據類型如表5-1所示。
表5-1 VB的基本數據類型
數據類型
|
類型描述
|
類型說明后綴
|
數據范圍
|
所占字節數
|
Integer
|
整型
|
%
|
-32768~32767
|
2
|
Long
|
長整型
|
&
|
-2147483648~2147483647
|
4
|
Single
|
單精度浮點型
|
!
|
-3.402823E38~-1.401298E-45
1.401298E-45~3.402823E38
|
4
|
Double
|
雙精度浮點型
|
#
|
-1.79769313486232E308~-4.9406564584124E324
4.9406564584124E324~1.79769313486232E308
|
8
|
Currency
|
貨幣型
|
@
|
|
8
|
String
|
字符串型
|
$
|
|
每字符占一字節
|
Byte
|
字節型
|
|
0~255
|
1
|
Boolean
|
布爾數據型
|
|
-1(True)、(False)
|
|
Date
|
日期型
|
|
|
|
Object
|
對象型
|
|
|
4
|
Variant
|
變體
|
為上述任一種
|
|
|
Integer(整型)、Long(長整型)、Single(單精度浮點型)、Double(雙精度長整型)及Currency(貨幣型)均為Numeric數據類型。其中整型是16位的整數,長整型是32位的整數。單精度及雙精度浮點型就表示實數,常被用于數量較大的數字。Currency數據類型支持小數點右面15位,是定點數據類型,適用于貨幣計算。
String(字符串變量)的數據類型只存放文本,是一個字符序列,它的每一個字符用ASCII編碼表示。不包含任何字符的串稱為空串。
Byte數據類型表示0到255之間的數,常用于訪問二進制文件、圖形和聲音文件
等。當需要把數據存放成字節,必須訪問各字節時可采用Byte類型。
取值僅為True/False的類型稱為Boolean(布爾)型,缺省值為False。
Date數據類型用于以特殊方式存放日期和時間。
Object變量可引用應用程序中或某些其他應用程序中的對象。
VB缺省規定,如果在生命中沒有說明數據類型,則變量的數據類型為Variant(變體)。Variant數據類型還包含三種特定值:Empty、Null、Error。Empty值用于確定是否已將一個值賦予所創建的變量。賦值之前,Variant變量具有值Empty。
Null常用于數據庫應用程序,表示未知或丟失為空的數據。
Error值是指已發出的過程中的錯誤狀態。
Variant數據類型是最為靈活的數據類型,可以依據不同的需要進行各種數據類型的轉換。它實際上包含兩部分信息,一部分是數據類型的信息,一部分是表示數據值的信息。但正是由于它的靈活性,又使得它存在著一個明顯的缺點,Variant數據類型比其他類型的數據占有更多的內存空間。
2 數組
VB中數組的定義類似于變量定義,所不同的是數組需要指定數組中的元素個數,例如:
Dim Array(9) As Integer
數組中包含10個元素,腳標從0到9。
也可以指定腳標的起始值,例如:
Dim IntegerArray(2 to 10) As Integer
這個數組含有九個元素,腳標從2到10。
還可以定義多維數組:
Dim ThreeD(4,2 to 5,3 to 6) As Integer
定義一個三維數組(4×4×4)。
數組
數組是一組擁有相同名稱同類元素。定義數組后,即創建了數組。數組中單個的數據項稱為數組元素,用于訪問數組元素的編號稱為數組索引號,最小索引號和最大索引號稱為邊界。
在VBA中,根據數組元素是否變化,分為固定大小的數組和動態數組,根據數組的維數又可分為一維數組和多維數組。
1、創建數組
用Dim語句來定義固定大小的數組,即聲明一個數組。如
Dim myArray(9) As Integer
上面的代碼創建一個名為myArray含有10個數組元素的一維數組。注意,所有VBA數組的下界均從0開始,因此上面的代碼所創建的數組元素從myArray(0)到myArray(9)。
在Dim語句中不指明數組元素的個數來聲明動態數組,如
Dim myDynamicArray() As Integer
使用ReDim關鍵字重新定義數組的大小:
ReDim myDynamicArray(10)
也可以用ReDim關鍵字同時聲明一個動態數組并指定該數組的元素個數:
ReDim myDynamicArray(5) As Integer
VBA沒有限制重新定義動態數組大小的次數,但在重新定義數組大小時,原有的數組數據就會丟失。如果需要保留原來的數據,可以使用Preserve關鍵字:
ReDim Preserve myDynamicArray(5)
需要注意的是,如果重新定義數組時減小了數組的大小,則會丟失被縮減了的那部分元素的數據。
當然,與聲明變量一樣,也可以用Public語句聲明公共數組。
2、確定數組的邊界
可以使用UBound函數和LBound函數分別獲取數組的最大邊界和最小邊界。
默認情況下,VBA的數組的下界是從0開始的,可以在模塊的聲明部分使用Option Base語句來改變模塊中數組的起始邊界。如
Option Base 1
該語句使數組元素的索引號從1開始。
也可以在定義數組時指定數組的上界和下界,如
Dim <數組名> (<下界> to <上界>) As <數據類型>
3、多維數組
多維數組可以在每個數組元素中存儲一組數據,因此,多維數組的每個數組元素都包含一個數組。與一維數組相同,可以使用下面的兩種方法創建多維數組:
(1)Dim <數組名> (<數組元素數1>,<數組元素數2>,……) As <數據類型>
(2)Dim <數組名>(<下界> to <上界>,<下界> to <上界>,……) As <數據類型>
與一維數組相似,多維數組也可以是動態的。
4、引用數組中的元素
可以使用數組名稱和一個索引號來引用數組中的某個特定的元素。
變量與常量:
1)VB允許使用未定義的變量,默認是變體變量Variant。
2)在模塊通用說明部份,加入 Option Explicit 語句可以強迫用戶進行變量定義。
3)變量定義語句及變量作用域
Dim 變量 as 類型 '定義為局部變量,如 Dim xyz as integer
Private 變量 as 類型 '定義為私有變量,如 Private xyz as byte
Public 變量 as 類型 '定義為公有變量,如 Public xyz as single
Global 變量 as 類型 '定義為全局變量,如 Globlal xyz as date
Static 變量 as 類型 '定義為靜態變量,如 Static xyz as double
一般變量作用域的原則是,那部份定義就在那部份起作用,模塊中定義則在該模塊那作用。
4)常量為變量的一種特例,用Const定義,且定義時賦值,程序中不能改變值,作用域也如同變量作用域。如下定義:Const Pi=3.1415926 as single
5,數組:是包含相同數據類型的一組變量的集合,對數組中的單個變量引用通過數組索引下標進行。在內存中表現為一個連續的內存塊,必須用Global或Dim語句來定義。定義規則如下: Dim 數組名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值為0。二維數組是按行列排列,如XYZ(行,列)。
除了以上固定數組外,VBA還有一種功能強大的動態數組,定義時無大小維數聲明;在程序中再利用Redim語句來重新改變數組大小,原來數組內容可以通過加preserve關鍵字來保留。如下例: Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)
6,注釋和賦值語句
1)注釋語句是用來說明程序中某些語句的功能和作用;VB中有兩種方法標識為注釋語句。
單引號 ’ ;如:’定義全局變量;可以位于別的語句之尾,也可單獨一行
Rem ;如:Rem定義全局變量;只能單獨一行
2)賦值語句是進行對變量或對象屬性賦值的語句,采用賦值號 =,如X=123:Form1.caption=”我的窗口”。對對象的賦值采用:set myobject=object 或 myobject:=object
7,書寫規范:
1)VBA不區分標識符的字母大小寫,一律認為是小寫字母;
2)一行可以書寫多條語句,各語句之間以冒號 : 分開;
3)一條語句可以多行書寫,以空格加下劃線 _ 來標識下行為續行;
4)標識符最好能簡潔明了,不造成歧義。
運算符
VB具有豐富的運算符集,大體上分為三類,算術運算符、關系運算符和邏輯運算符。
5.3.1 算術運算符
VB中的算術運算符有如下幾種:
^ 冪運算 - 負號
* 乘 / 除
整除 Mod 取模
+ 加 - 減
以下列出幾個算術運算的表達式:
X=Y^2 ‘X等于Y的平方
X=Y^-2 ‘X等于Y的負二次方
X=Y*Z ‘X等于Y乘以Z
X=Y/Z ‘X等于Y除以Z
X=5/2 ‘X等于5除以2,值為2.5
X=52 ‘X等于5用2整除,值為2
X=5Mod2 ‘X等于5模2,值為1
5.3.2 關系運算符
= 等于 > 大于 < 小于
<> 不等于 <= 小于等于 >= 大于等于
如:
X=Y
3<>2 ……
關系運算符與數學運算符的用法一致,只是表達方式有所不同而已。
5.3.3 邏輯運算符
VB中的邏輯運算符有:
NOT 非 AND 與
OR 或 XOR 異或
EQU 邏輯等 IMP 隱含
以下分別介紹這幾種運算符:
NOT:邏輯非。對邏輯值取反,如:
3<5 ‘表達式值為真
NOT3<5 ‘取反,表達式值為假
AND:邏輯與。兩個表達式的值均為真,則結果為真,如果有任一個表達式值為假,則結果為假。其運算規則如表5-2。
表5-2 AND運算規則表
第一操作符
|
第二操作符
|
操作結果
|
True
|
True
|
True
|
True
|
False
|
False
|
False
|
True
|
False
|
False
|
False
|
False
|
例如:
3<5AND4>3 ‘兩個表達式結果均為真,則AND操作結果為真。
3<5AND4<3 ‘第一個表達式結果為真,第二個表達式結果為假,則AND操作結果為假。
OR:邏輯或。當兩個表達式中至少一個為真時,結果為真。運算規則如表5-3。
表5-3 OR運算規則表
第一操作符
|
第二操作符
|
操作結果
|
True
|
True
|
True
|
True
|
False
|
True
|
False
|
True
|
True
|
False
|
False
|
False
|
例如:
3<5OR4<3 ‘第一個表達式結果為真,第二個表達式結果為假,則OR操作結果為真。
XOR:邏輯異或。當兩個表達式值相反時,結果為真。運算規則如表5-4。
表5-4 XOR運算規則表
第一操作符
|
第二操作符
|
操作結果
|
True
|
True
|
False
|
True
|
False
|
True
|
False
|
True
|
True
|
False
|
False
|
False
|
例如:
5/3>1XOR1<0 ‘第一個表達式結果為真,第二個表達式結果為假,則XOR操作結果為真。
EQU: 邏輯等。兩個表達式的值相同時,結果為真。運算規則如表5-5。
表5-5 EQU運算規則表
第一操作符
|
第二操作符
|
操作結果
|
True
|
True
|
True
|
True
|
False
|
False
|
False
|
True
|
False
|
False
|
False
|
True
|
例如:
3<2EQU(3-1)<0 ‘第一個表達式結果為假,第二個表達式結果也為假,則EQU操作結果為真。
IMP:比較兩個表達式。當第一個表達式為假或第二個表達式為真時操作結果為真。運算規則如表5-6。
表5-6 IMP運算規則表
第一操作符
|
第二操作符
|
操作結果
|
True
|
True
|
True
|
True
|
False
|
False
|
False
|
True
|
True
|
False
|
False
|
True
|
例如:
3<2IMP3>0 ‘第一個表達式結果為假,第二個表達式結果為真,則IMP操作結果為真。
5.4 基本語句
5.4.1 注釋語句
在使用注釋語句之前必須先了解注釋的作用,注釋不僅僅是對程序的解釋,有時它對于程序的調試也非常有用,譬如說可以利用注釋屏蔽一條語句以觀察變化,發現問題和錯誤。以后注釋語句將是我們在編程里最經常用到的語句之一。
在VB里,注釋語句有兩種,一種是用“Rem”關鍵字,這跟DOS里的批處理文件的用法一樣,還有一種是利用單引號“’”,例如:
‘Dim a As String 與
Rem Dim a As String 的作用是一致的。
5.4.2 順序語句
順序語句就是依順序逐條執行的語句。在程序中沒有流程控制語句的情況下,程序中各語句將按順序逐一執行,只有在上一條語句執行完畢后,才能執行下一條語句。
5.4.3 條件語句
任何一種程序語言都離不開流程控制語句,程序中控制流程的語句有兩種:條件與循環。掌握這兩種語句是學習編程關鍵的一步,下面首先介紹VB中的條件語句。
5.4.3.1 IF語句
在條件語句里,我們先來學習“If……Then……”語句。
語法:
If <條件> Then
<語句>
End If
如果希望條件不滿足時執行另一語句,可以以增加一個else語句:
If <條件> Then
<語句>
else
<語句>
End If
如果Then后面所跟的語句只有一條,可以寫成:
If <條件> Then <語句>
而不用End If。
還可以在Else里在嵌套If語句,如:
If <條件> Then
<語句>
Else If <條件> Then
<語句>
……
Else
<語句>
End If
判斷語句
1)If…Then…Else語句
If condition Then [statements][Else elsestatements]
如1:If A>B And C<D Then A=B+2 Else A=C+2
如2:If x>250 Then x=x-100
或者,可以使用塊形式的語法:
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
如1:
If Number < 10 Then
Digits = 1
ElseIf Number < 100 Then
Digits = 2
Else
Digits = 3
End If
2)Select Case…Case…End Case語句
如1:
Select Case Pid
Case “A101”
Price=200
Case “A102”
Price=300
……
Case Else
Price=900
End Case
3)Choose 函數: choose(index, choce-1,choice-2,…,choice-n),可以用來選擇自變量串列中的一個值,并將其返回,index 必要參數,數值表達式或字段,它的運算結果是一個數值,且界于 1 和可選擇的項目數之間。choice 必要參數,Variant表達式,包含可選擇項目的其中之一。如: GetChoice? = Choose(Ind, "Speedy", "United", "Federal")
4)Switch函數: Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]]) switch函數和Choose函數類似,但它是以兩個一組的方式返回所要的值,在串列中,最先為TRUE的值會被返回。 expr 必要參數,要加以計算的 Variant 表達式。value 必要參數。如果相關的表達式為 True,則返回此部分的數值或表達式,沒有一個表達式為 True,Switch 會返回一個 Null值。
9,循環語句
1)For Next語句 以指定次數來重復執行一組語句
For counter = start To end [Step step] ' step 缺省值為1
[statements]
[Exit For]
[statements]
Next [counter]
如1:
For Words = 10 To 1 Step -1 ' 建立 10 次循環
For Chars = 0 To 9 ' 建立 10 次循環
MyString = MyString & Chars ' 將數字添加到字符串中
Next Chars ' Increment counter
MyString = MyString & " " ' 添加一個空格
Next Words
2)For Each…Next語句:主要功能是對一個數組或集合對象進行,讓所有元素重復執行一次語句
For Each element In group
Statements
[Exit for]
Statements
Next [element]
如1:
For Each rang2 In range1
With range2.interior
.colorindex=6
.pattern=xlSolid
End with
Next
這上面一例中用到了 With…End With 語句,目的是省去對象多次調用,加快速度;語法為:
With object
[statements]
End With
3)Do…loop語句 在條件為true時,重復執行區塊命令
Do {while |until} condition ' while 為當型循環,until為直到型循環,顧名思義,不多說啦
Statements
Exit do
Statements
Loop
或者使用下面語法
Do ' 先do 再判斷,即不論如何先干一次再說
Statements
Exit do
Statements
Loop {while |until} condition
10,其他類語句和錯誤語句處理
A, 其他循環語句:結構化程序使用以上判斷和循環語句已經足夠,建議不要輕易使用下面的語句,雖然VBA還支持。
1)Goto line 該語句為跳轉到line語句行
2)On expression gosub destinatioinlist 或者 on expression goto destinationlist 語句為根據 exprssion表達式值來跳轉到所要的行號或行標記
3)Gosub line…line…Return語句, Return 返回到 Gosub line行,如下例:
Sub gosubtry()
Dim num
Num=inputbox(“輸入一個數字,此值將會被判斷循環”)
If num>0 then Gosub Routine1 :Debug.print num:Exit sub
Routine1:
Num=num/5
Return
End sub
4)while…wend語句,只要條件為TRUE,循環就執行,這是以前VB老語法保留下來的,如下例: while condition 'while I<50 [statements] 'I=I+1 wend 'Wend
B, 錯誤語句處理:執行階段有時會有錯誤的情況發生,利用On Error語句來處理錯誤,啟動一個錯誤的處理程序。語法如下:
On Error Goto Line '當錯誤發生時,會立刻轉移到line行去
On Error Resume Next '當錯誤發生時,會立刻轉移到發生錯誤的下一行去
On Erro Goto 0 '當錯誤發生時,會立刻停止過程中任何錯誤處理過程
5.5 過程
在程序設計中經常會有重復的地方,可以把重復的部分獨立為一個過程,在使用時進行調用,從而簡化代碼編寫,提高編程效率。過程可用于壓縮重復任務或共享任務。用過程編程有兩大好處:
· 過程可使程序劃分成離散的邏輯單元,每個單元都比無過程的整個程序容易調試。
· 一個程序中的過程,往往不必修改或只需稍作改動,便可以成為另一個程序的構件。
在 Visual Basic 中使用下列幾種過程:
1.子(Sub)過程
[Private | Public ] [Static] Sub name [(arglist)]
[statements]
[Exit Sub]
[statements]
End Sub
Sub 語句的語法包含下面部分:
Public|Private 、Static 聲明函數的作用域、生存期。
Name:必需的。Sub 的名稱,遵循標準的變量命名約定。
Arglist:可選的。代表在調用時要傳遞給 Sub 過程的參數的變量列表。多個變量則用逗號隔開。
Statements:可選的。Sub 過程中所執行的任何語句組。事件過程或其他過程可按名稱調用子過程。
子過程能夠接收參數,并可用于完成過程中的任務并返回一些數值。但是,與函數過程不同,子過程不返回與其特定子過程名相關聯的值(盡管它們能夠通過變量名返回數值)。子過程一般用于接收或處理輸入數據、顯示輸出或者設置屬性。
2.函數(Function) 過程
[Public | Private ] [Static] Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
各參數分述如下:
Public|Private 、Static:聲明函數的作用域、生存期。
Name:必需的。Function 的名稱,遵循標準的變量命名約定。
Arglist:可選的。代表在調用時要傳遞給 Function 過程的參數變量列表。多個變量應用逗號隔開。
type :可選的。Function 過程的返回值的數據類型,可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(除定長)、Object、Variant或任何用戶定義類型。任何類型的數組都不能作為返回值,但包含數組的 Variant 可以作為返回值。
Statements:可選的。在 Function 過程中執行的任何語句組。
Expression:可選的。Function 的返回值。
事件過程或其他過程可按名稱調用函數過程。函數過程能夠接收參數,并且總是以該函數名返回一個值。這類過程一般用于完成計算任務。
函數過程與子過程有許多相似的地方,它們之間最大也是最本質的區別就在于,函數過程有一個返回值,而子過程只是執行一系列動作。
事件處理過程
要對一個控件事件編寫事件處理程序,應先打開窗體的代碼窗口并從可用對象的下拉列表中選擇所需的控件。然后,從該控件的可用事件下拉列表中選擇所用的事件。此時,對事件處理程序的定義語句就會自動出現在代碼窗口中,就可以直接編寫事件處理程序了。
在Excel中,有下面幾類事件,即Excel應用程序事件、工作簿事件、工作表事件、圖表事件、用戶窗體事件等。
屬性過程
屬性過程(property procedure)是特殊的過程,用于賦予和獲取自定義屬性的值。屬性過程只能在對象模塊如窗體或類模塊中使用。
有三種屬性過程:
Property Let
給屬性賦值
Property Get
獲取屬性的值
Property Set
將對象引用賦給屬性引用
- - - - - - - - - - - - - - - - - - - -
調用子過程和函數過程
子過程可以用下面三種方法調用。第一種使用Call語句:
Call DoSomething(參數1,參數2,……)
如果使用Call語句,就必須用小括號將參數列表括起來。
第二種是直接利用過程名:
DoSomething 參數1,參數2,……
此時,不用在參數列表兩邊加上括號。
如果不想使用函數的返回值,可以用上述任一種方法調用函數。否則,可以用函數名作為表達式的組成部分,如
If GetFunctionResult(parameter)=1 Then
如果用函數調用作為表達式的一部分,參數列表必須放在小括號中。
第三種是使用Run方法。
5.6 VB的系統函數
在VB中,為了增強程序的功能,我們經常要調用系統提供的函數。這些函數可以分為以下幾類:字符處理函數、數學函數、數據類型函數、輸入輸出函數、圖像函數和時間函數。下面我們就來分門別類地介紹一些常用的函數。
5.6.1 字符處理函數
在這一章里,我們將介紹一系列的字符處理函數:Chr,Asc,String,Len,Left,Right,Mid,
Lcase,Ucase,Ltrim,Rtrim,Trim,Str,Val,InStr,StrComp。
1.Chr[$](數值)函數
返回標準擴展碼的對應字符。
說明:
(1)數值范圍在0到255之間。
(2)Chr()返回的是數值類型,而Chr$()則返回字符類型。
(3)ANSI是ASCII碼的擴充,其前128個字符都與ASCII碼相同。
例如,我們常用以下的語句加入回車換行符。
Chr(13)+Chr(10)
2.Asc(“字符”)函數
此函數用來返回字符的ANSI碼值。
說明: 若輸入為一字符串,則只返回第一個字符的ASCII碼值。
例如,
x=Asc(“a”) 則 x=97
x=Asc(“ab”) 則 x=97
3.String[$](個數,字符)
用于重復某一個字符。
說明:
(1)“個數”用來指定重復的次數。
(2)若“字符”為一字符串,則只重復復制第一個字符。
4.Len(字符串) 函數
用于返回字符串的長度。
5.Left[$](字符串,字符個數)
用于返回“字符串”最左邊的長度為“字符個數”的字符串。
例如,
Dim substr As String
substr=Left("Visual Basic",3)
則,
substr="Vis"
6.Right[$](字符串,字符個數)
用于返回“字符串”最右邊的長度為“字符個數”的字符串。
例如,
Dim substr As String
substr=Right(“Visual Basic”,3)
則,
substr=”sic”
7.Mid[$](字符串,起始位置,[字符個數])
用于返回一個子字符串。
說明:
(1)子字符串從“起始位置”開始,以“字符個數”為長度。
(2)若省略“字符個數”,則從起始位置到字符串的結尾。
8.Lcase(字符串)和Ucase(字符串)函數
Lcase:不論字符串中的字符為大寫還是小寫,一律輸出為小寫。
Ucase:不論字符串中的字符為大寫還是小寫,一律輸出為小寫。
9.Ltrim(字符串)、Rtrim(字符串)、Trim(字符串)函數
Ltrim(字符串):用于去掉字符串中左邊的空格。
Rtrim(字符串):用于去掉字符串中右邊的空格。
Trim(字符串):用于去掉字符串中左右兩邊的空格。
10.Str(數值)函數 和 Val(字符串) 函數
Str(數值):用于將數字轉化為字符串。
Val(字符串):用于將字符串轉化為數值。
例如,
Dim a As String
Dim b As Long
a=Str(345.45)
b=Val(“234.45”)
則,
a=“345.45”
b=234.45
11.Instr([起始位置,]“字符串1”,“字符串2”[,比較模式])
此函數用來在字符串1中查找字符串2。
說明:
(1)從字符串1的“起始位置”處開始查找字符串2,如果找到“字符串2,則返回字符串2在字符串1中的起始位置。
(2)比較模式可以為0或1,為1時,比較時不區分大小寫;為0時,區分大小寫。VB的默認設置為0。
(3)若指定了比較模式,則必須指定起始位置,否則就會出現語法錯誤。
12.StrComp(字符串1,字符串2,比較模式)
此函數用于對兩個字符串進行比較。
說明:
(1)若字符串1小于字符串2,則返回-1;
若字符串1大于字符串2,則返回1;
若字符串1等于字符串2,則返回0;
(2)比較模式可以為0或1。為1時,比較不區分大小寫;為0時,區分大小寫。VB的默認設置為0。
(3)字符的比較是從第一個字符開始逐一比較,若出現不匹配字符,則終止比較,返回比較的結果。