Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3234|回复: 1

跟着校长学VBA之第42集:数据类型与转换

[复制链接]
发表于 2013-2-2 23:30 | 显示全部楼层 |阅读模式
本帖最后由 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 个字节
  1. Sub sss1()
  2.     Dim x As Long
  3.     Dim t
  4.     Dim k1 As Byte, k2 As Integer, k3 As String
  5.     Dim k As Byte
  6.     k = 1
  7.    
  8.     t = Timer
  9.     For x = 1 To 1000000
  10.         k1 = k
  11.     Next x
  12.     Debug.Print VBA.TypeName(k1), Timer - t
  13.    
  14.     t = Timer
  15.     For x = 1 To 1000000
  16.         k2 = k
  17.     Next x
  18.     Debug.Print VBA.TypeName(k2), Timer - t
  19.    
  20.     t = Timer
  21.     For x = 1 To 1000000
  22.         k3 = k
  23.     Next x
  24.     Debug.Print VBA.TypeName(k3), Timer - t
  25. End Sub
复制代码
通过立即窗口的输出,可以看出使用不同数据类型,对于程序的过行速度还是有影响的,至于影响的大小,就需要看数据量的大小。

二、数据类型检查
1.是否为空
  1. Sub s1()
  2.     Debug.Print Range("a1") = ""    '判断真空,无法判断假空
  3.     Debug.Print Len(Range("a1")) = 0    '判断真空,无法判断假空
  4.     Debug.Print VBA.IsEmpty(Range("a1"))    '假空时返回FALSE
  5.     Debug.Print VBA.TypeName(Range("a1").Value)    '返回Empty表示为空
  6. End Sub
复制代码
2.是否为数字
  1. Sub s2()
  2.     Debug.Print VBA.IsNumeric(Range("a1"))
  3.     Debug.Print Application.WorksheetFunction.IsNumber(Range("A1"))
  4.     Debug.Print VBA.TypeName(Range("A1").Value)
  5. Debug.Print Range("a1").Value Like "#" '判断一位整数
  6. Debug.Print Range("a1") Like "*#*" '判断是否包含数字
  7. End Sub
复制代码
3.是否为文本
  1. Sub t3()
  2.     Debug.Print Application.IsText(Range("a1"))
  3.     Debug.Print "B" Like "[A-Za-z]"    '判断是否为字母
  4.     Debug.Print Len(Range("a1"))
  5.     Debug.Print Range("a1") Like "*[一-龥]*"    '判断字符串中是否包含汉字
  6. End Sub
复制代码
4.是否为错误值
  1. Sub s4()
  2.     Debug.Print VBA.IsError(Range("a1"))
  3.     Debug.Print TypeName(Range("a1").Value)
  4. End Sub
复制代码
5.是否为数组
  1. Sub s5()
  2.     Dim arr
  3.     arr = Range("A1:A2")
  4.     Erase arr
  5.     Debug.Print VBA.IsArray(arr)
  6. End Sub
复制代码
6. 判断是否为日期
  1. Sub s6()
  2.     Debug.Print VBA.IsDate(Range("a2"))
  3. 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 子类型。
  1. Sub ss1()
  2.     Dim s As Integer
  3.     s = 2334
  4.     MsgBox 截取(CStr(s))    '因为自定义函数参数要求是文本类型,而s是数值类型,所以需要用cstr转换成文本类型
  5. End Sub

  6. Function 截取(x As String)
  7.     截取 = Left(x, 2)
  8. End Function

  9. Sub ss2()
  10.     Debug.Print 1 + True    'CInt(1 = 1)
  11. End Sub
复制代码
2.Format函数
format函数用法等同于工作表中的text函数,可以格式化显示数字或文本
  1. Sub ss3()
  2.     Dim n, n1
  3.     n = 234.3372
  4.     n1 = 41105
  5.     Debug.Print Format(n, "0.00")
  6.     Debug.Print Format(n, "0")
  7.     Debug.Print Format(n, "\价格\:0.00")
  8.     Debug.Print Format(n1, "yyyy-mm-dd")
  9. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-11-25 19:25 | 显示全部楼层
学习后,能否在access中自己编辑窗体与表之间的代码,是否有老师再进行直接答疑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-6 12:00 , Processed in 0.289989 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表