本帖最后由 hwc2ycy 于 2013-2-2 23:40 编辑
一、数据类型
1.数据类型综述
在VBA中的数据类型有整数、文本、对象等类型。这些不同的类型有着特定的作用,在进行运算时也会占用不同大小的内存,所以我们在编写程序时为了提高运行效率,一般都要定义数据的类型。
2 数据类型对程序运行的影响
byte 占用1个字节
integer,boolean 占用2个字节
long,single 占用4个字节
Double,Currency,date 占用8个字节
Object 占用4个字节
string(不定长) 占用10+字符长度个字节
String(定长) 占用字符串长度个字节
Variant(任意数字类型) 占用16个字节
Variant(字符串) 占用24+字符串长度个字节
包含一数组的 Variant 比单独的一个数组需要多 12 个字节 - Sub sss1()
- Dim x As Long
- Dim t
- Dim k1 As Byte, k2 As Integer, k3 As String
- Dim k As Byte
- k = 1
-
- t = Timer
- For x = 1 To 1000000
- k1 = k
- Next x
- Debug.Print VBA.TypeName(k1), Timer - t
-
- t = Timer
- For x = 1 To 1000000
- k2 = k
- Next x
- Debug.Print VBA.TypeName(k2), Timer - t
-
- t = Timer
- For x = 1 To 1000000
- k3 = k
- Next x
- Debug.Print VBA.TypeName(k3), Timer - t
- End Sub
复制代码 通过立即窗口的输出,可以看出使用不同数据类型,对于程序的过行速度还是有影响的,至于影响的大小,就需要看数据量的大小。
二、数据类型检查
1.是否为空- Sub s1()
- Debug.Print Range("a1") = "" '判断真空,无法判断假空
- Debug.Print Len(Range("a1")) = 0 '判断真空,无法判断假空
- Debug.Print VBA.IsEmpty(Range("a1")) '假空时返回FALSE
- Debug.Print VBA.TypeName(Range("a1").Value) '返回Empty表示为空
- End Sub
复制代码 2.是否为数字- Sub s2()
- Debug.Print VBA.IsNumeric(Range("a1"))
- Debug.Print Application.WorksheetFunction.IsNumber(Range("A1"))
- Debug.Print VBA.TypeName(Range("A1").Value)
- Debug.Print Range("a1").Value Like "#" '判断一位整数
- Debug.Print Range("a1") Like "*#*" '判断是否包含数字
- End Sub
复制代码 3.是否为文本- Sub t3()
- Debug.Print Application.IsText(Range("a1"))
- Debug.Print "B" Like "[A-Za-z]" '判断是否为字母
- Debug.Print Len(Range("a1"))
- Debug.Print Range("a1") Like "*[一-龥]*" '判断字符串中是否包含汉字
- End Sub
复制代码 4.是否为错误值- Sub s4()
- Debug.Print VBA.IsError(Range("a1"))
- Debug.Print TypeName(Range("a1").Value)
- End Sub
复制代码 5.是否为数组- Sub s5()
- Dim arr
- arr = Range("A1:A2")
- Erase arr
- Debug.Print VBA.IsArray(arr)
- End Sub
复制代码 6. 判断是否为日期- Sub s6()
- Debug.Print VBA.IsDate(Range("a2"))
- End Sub
复制代码 三、数据类型转换
1.类型转换函数
CBool,CByte,CCur,CDate,CDbl,CDec,CInt,CLng,CLngLng,CLngPtr,CSng,CStr,CVar,CStr
如果传递给函数的 expression 超过转换目标数据类型的范围,将发生错误。
通常,在编码时可以使用数据类型转换函数,来体现某些操作的结果应该表示为特定的数据类型,而不是缺省的数据类型。例如,当单精度、双精度或整数运算发生的情况下,使用 CCur 来强制执行货币运算。
应该使用数据类型转换函数来代替 Val,以使国际版的数据转换可以从一种数据类型转换为另一种。例如,当使用 Ccur 时,不同的小数点分隔符、千分位分隔符和各种货币选项,依据系统的区域设置都会被妥善识别。
当小数部分恰好为 0.5 时,Cint 和 CLng 函数会将它转换为最接近的偶数值。例如,0.5 转换为 0、1.5 转换为 2。Cint 和 CLng 函数不同于 Fix 和 Int 函数,Fix 和 Int 函数会将小数部分截断而不是四舍五入。并且 Fix 和 Int 函数总是返回与传入的数据类型相同的值。
使用 IsDate 函数,可判断 date 是否可以被转换为日期或时间。Cdate 可用来识别日期文字和时间文字,以及落入可接受的日期范围内的数值。当转换一个数字成为日期时,是将整数部分转换为日期,小数部分转换为从午夜起算的时间。
CDate 依据系统上的区域设置来决定日期的格式。如果提供的格式为不可识别的日期设置,则不能正确判断年、月、日的顺序。另外,长日期格式,若包含有星期的字符串,也不能被识别。
CVDate 函数也提供对早期 Visual Basic 版本的兼容性。CVDate 函数的语法与 CDate 函数是完全相同的,不过,CVDate 是返回一个 Variant,它的子类型是 Date,而不是实际的 Date 类型。因为现在已有真正的 Date 类型,所以 CVDate 也不再需要了。转换一个表达式成为 Date,再赋值给一个 Variant,也可以达到同样的效果。也可以使用这种技巧将其他真正的数据类型转换为对等的 Variant 子类型。
注意 CDec 函数不能返回独立的数据类型,而总是返回一个 Variant,它的值已经被转换为 Decimal 子类型。 - Sub ss1()
- Dim s As Integer
- s = 2334
- MsgBox 截取(CStr(s)) '因为自定义函数参数要求是文本类型,而s是数值类型,所以需要用cstr转换成文本类型
- End Sub
- Function 截取(x As String)
- 截取 = Left(x, 2)
- End Function
- Sub ss2()
- Debug.Print 1 + True 'CInt(1 = 1)
- End Sub
复制代码 2.Format函数
format函数用法等同于工作表中的text函数,可以格式化显示数字或文本 - Sub ss3()
- Dim n, n1
- n = 234.3372
- n1 = 41105
- Debug.Print Format(n, "0.00")
- Debug.Print Format(n, "0")
- Debug.Print Format(n, "\价格\:0.00")
- Debug.Print Format(n1, "yyyy-mm-dd")
- End Sub
复制代码 |