(1条消息) 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个字符,即限制了可以在消息框中显示内容的长度。