Excel中VBA程式設計學習筆記(二)
7、VBA中的資料型別
據型別(名稱) |
大小(位元組) |
描述 |
Boolean |
2 |
邏輯值True或False |
Byte |
1 |
0到255的整數 |
Integer |
2 |
–32,768到32,767的整數 |
Long |
4 |
–2,147,483,648到2,147,483,647的整數 |
Single |
4 |
單精度浮點數值 負數:–3.402823E38到–1.401298E–45 正數:1.401298E–45到3.402823E38 |
Double |
8 |
雙精度浮點數值 負數:–1.79769313486231E308到–4.94065645841247E–324 正數:4.94065645841247E–324到1.79769313486231E308 |
Currency |
8 |
(放大的整數(譯者:整數除以10000得到的數值,參見VBA幫助))使用在定點計算中: –922,337,203,685,477.5808到922,337,203,685,477.5807 |
Decimal |
14 |
+/–79,228,162,514,264,337,593,543,950,335沒有小數點; +/–7.9228162514264337593543950335小數點後有28位數字; 最小的非0數字是 +/–0.0000000000000000000000000001 |
Date |
8 |
從100年1月1日到9999年12月31日的日期 |
String(變長字串) |
10位元組+字串長度 |
變長字串最多可包含大約 20 億 ( 2^31)個字元。 |
String(定長字串) |
字串長度 |
定長字串最多可包含大約65,400 個字元。 |
Object |
4 |
物件變數用來引用Excel中的任何物件 |
Variant(帶數字) |
16 |
最高範圍到Double型別的任何數值 |
Variant(帶字母) |
22位元組+字串長度 |
和變長字串的範圍一樣 |
使用者定義型別 (使用Type) |
成員所需的數值 |
每個成員的範圍和它的資料型別的範圍一致 |
常用資料型別的簡寫
integer |
% |
long |
& |
single |
! |
double |
# |
string |
$ |
currency |
@ |
自定義資料型別
使用Type關鍵字自定義資料型別
Type student
name As String
age As Integer
address As String
End Type
Private Sub A()
Dim student1 As student
student1.name = "小紅"
student1.age = 22
student1.address = "湖北武漢"
MsgBox ("姓名:" & student1.name & ";年齡:" & student1.age & ";住址:" & student1.address)
End Sub
8、VBA中內建常量的使用
Private Sub B()
With Sheet3.Range("A1")
.Font.Color = vbRed
.Font.Size = 12
.Font.Bold = True
.Font.Italic = False
End With
Cells(1, 1).Font.ColorIndex = 3 '字的顏色號為3 紅色
Cells(1, 1).Interior.ColorIndex = 3 ' 背景的顏色為3 紅色
Cells(2, 1).Font.Color = RGB(0, 255, 0) '字的顏色綠色
Cells(2, 1).Interior.Color = RGB(0, 0, 255) '背景的顏色藍色
End Sub
常用顏色常量
常量 |
描述 |
vbBlack |
黑色 |
vbRed |
紅色 |
vbGreen |
綠色 |
vbYellow |
黃色 |
vbBlue |
藍色 |
vbWhite |
白色 |
9、陣列
dim arr(1 to 10) as integer ‘宣告10個元素的一維陣列,下表索引從1開始
dim arr(5) ‘宣告5個元素的一維陣列,型別為Variant
dim arr(3) as string ‘宣告3個元素的陣列,資料型別為string
使用示例:
【例1】
Private Sub B()
Const N As Integer = 10
Dim i As Integer
Dim arr(1 To 10) As String
For i = 1 To N
arr(i) = -2 * i
Next
For i = 1 To N
Debug.Print (arr(i))
Next
End Sub
【例2】
Sub test()
Rem 定義一維陣列
arr1 = [{"武漢","廣州","長沙"}]
arr2 = Application.Transpose([{1;2;3;4}])
arr3 = Array(1, 2, 3, 4) '下標從0開始
Rem 定義二維陣列
arr4 = [{1;2;3;4}] '4*1維陣列
arr5 = [{"張三",98;"李四",79;"王武",80}] '3*2維陣列
arr6 = Array(Array("張三", "李四", "王武"), Array(98, 79, 80)) '下標從0開始
End Sub
【例3】改變陣列大小
Sub cc()
Dim Arr
'測試一維
ReDim Arr(1 To 3)
Arr(1) = "測試"
ReDim Preserve Arr(1 To 4)
Arr(4) = "繼續測試"
Debug.Print Arr(1) & "-" & Arr(4)
'測試二維
ReDim Arr(1 To 2, 1 To 5) '重置陣列空間,並清除原有內容
Arr(1, 1) = "測試" '設定內容
Arr(1, 5) = "測試1"
ReDim Preserve Arr(1 To 2, 1 To 3) '更改空間大小,並保留已輸入的內容
'由於空間被改小,所以 arr(1,5) 的內容將不存在
Arr(2, 3) = "測試2"
ReDim Preserve Arr(1 To 2, 1 To 6) '再次更改空間大小,由於是增加空間,原有的內容都會被保留下來
Arr(2, 6) = "測試3"
'測試修改非最未維空間
ReDim Preserve Arr(1 To 5, 1 To 6) '修改第一維空間大小,提示下標越界
'測試增加陣列維數
ReDim Preserve Arr(1 To 2, 1 To 6, 1 To 3) '增加陣列維數,提示下標越界
'使用了 Preserve 關鍵字,就只能重定義陣列最末維的大小,且不能改變維數的數目
'例如,如果陣列就是一維的,則可以重定義該維的大小,因為它是最末維,也是僅有的一維。 _
不過,如果陣列是二維或更多維時,則只有改變其最末維才能同時仍保留陣列中的內容。
End Sub
在宣告陣列時,不使用 () 和 使用 () 的區別:
Sub CCC()
Dim Arr, Brr(), Crr(), Drr()
ReDim Preserve Arr(1 To 5) '由於變數 Arr 在宣告時沒有設定為陣列型別,這裡將提示 型別不匹配
ReDim Preserve Brr(1 To 5) 'Brr 為陣列型別,這裡通過
Crr = Sheets(1).Range("A1:B1") '提示 型別不匹配錯誤
Crr = Sheets("Sheet1").Range("A1:B1") '提示 型別不匹配錯誤
Crr = Sheet1.Range("A1:B1") '通過
Drr = Range("A1:B1") '通過
End Sub
10、運算子與表示式
運算子 |
含義 |
mod |
取餘數運算 |
^ |
指數運算子 |
>= |
大於或等於 |
<= |
小於或等於 |
<> |
不等於 |
like |
按樣式比較字串 |
is |
用來比較兩個物件的引用常量 |
and |
邏輯與 |
or |
邏輯或 |
not |
邏輯非 |
xor |
邏輯異或 |
eqv |
邏輯等,兩表示式相等時值為真 |
imp |
邏輯隱含 |
: |
區域運算子產生包括在兩個引用之間的所有單元格的引用,例(B1:B5) |
,(逗號) |
聯合運算子將多個引用合併為一個引用,例(sum(B2:B5,D2:D5)) |
(空格) |
交叉運算子產生對兩個引用共有位置的單元格的引用,例(B1:D7 C3:C9) |
說明:
(1)邏輯運算子優先順序次序(從高到低):
not->and->or->xor->eqv->imp
處於相同優先順序則從左向右運算.
(2)字串的連線可以使用”+”或者”&”.
11、使用MsgBox函式進行輸出
MsgBox用法:
MsgBox(prompt[,buttons] [,title] [,helpfile,context])
引數說明:
(1)prompt為要顯示的內容,此引數必須要,其它引數都可以省去。Chr(13)表示回車符,Chr(10)表示換行符,Chr(13)&Chr(10)表示回車符與換行符的組合。
(2)buttons表示對話方塊顯示的按鈕和圖示.
按鈕取值如下
值 |
常量 |
說明 |
0 |
vbOkOnly |
“確定按鈕” |
1 |
vbOkCancel |
“確定”和”取消”按鈕 |
2 |
vbAbortRetryIgnore |
“終止”、”重試”和”忽略”按鈕 |
3 |
vbYesNoCancel |
“是”、”否”和”取消按鈕” |
4 |
vbYesNo |
“是”和”否”按鈕 |
5 |
vbRetryCancel |
“重試”和”取消”按鈕 |
圖示取值如下
值 |
常量 |
說明 |
16 |
vbCritical |
停止圖示 |
32 |
vbQuestion |
問號圖示 |
48 |
vbExcalmation |
感嘆號圖示 |
64 |
vbInformation |
資訊圖示 |
對話方塊設定預設按鈕
值 |
常量 |
說明 |
0 |
vbDefaultButton1 |
指定第一個按鈕為預設按鈕 |
256 |
vbDefaultButton2 |
指定第二個按鈕為預設按鈕 |
512 |
vbDefaultButton3 |
指定第三個按鈕為預設按鈕 |
(3)title為對話方塊的標題.
(4)helpfile為字串表示式,與context配個使用,context為數值表示式.
MsgBox返回值如下:
返回值 |
常量 |
說明 |
1 |
vbOk |
“確定”按鈕 |
2 |
vbCancel |
“取消”按鈕 |
3 |
vbAbort |
“終止”按鈕 |
4 |
vbRetry |
“重試”按鈕 |
5 |
vbIgnore |
“忽視”按鈕 |
6 |
vbYes |
“是”按鈕 |
7 |
vbNo |
“否”按鈕 |
【例1】
Private Sub b()
Dim a, b, res As Integer
a = 2 ^ 3
b = 25 Mod 7
res = MsgBox("第一個計算機結果為:" & a & vbCrLf & "第二個計算結果為:" & b, 1 + 64 + 0, "計算結果")
If res = 1 Then
MsgBox ("你點選了確定")
Else
MsgBox ("你點選了取消")
End If
End Sub
注:
(1)在上面第一次使用MsgBox中,1+64+0表示使用“確定”和“取消”按鈕,圖示為“資訊圖示”,設定第一個按鈕為預設按鈕。
(2)可以使用vbCrlf常量表示換行符.
同時,還可以使用常量vbTab來插入一個製表符分隔列,達到使訊息框中各列對齊的效果。下例用一個訊息框顯示當前工作表中A1至F11單元格區域中的內容,結果如圖4所示。
【例2】
Sub test()
Dim msg As String
Dim r As Long, c As Long
msg = ""
For r = 1 To 11
For c = 1 To 6
msg = msg & Cells(r, c) & vbTab
Next c
msg = msg & vbCrLf
Next r
MsgBox msg, vbInformation
End Sub
圖4
注:MsgBox函式最多隻能接受1023個字元,即限制了可以在訊息框中顯示內容的長度。