VBA(高速版)转换为中文字日期
时 间:2013-01-05 05:37:16
作 者:dbaseIIIer ID:22003 城市:深圳
摘 要:进入云计算年代了,将会是每一行代码算成本的年代,你的代码越精简、越高速,就能赢取更大的使用人群!
正 文:
我看到有些相传的 转换中文日期的方法:
Public Function CDateTime(MyDate As Date) As String '大写中文日期 '引用:CDateTime(# 1968-1-24 #) Dim i As Long, d(3) As String For i = 1 To Len(Year(MyDate)) d(0) = d(0) & Mid("零一二三四五六七八九", CInt(Mid(Year(MyDate), i, 1)) + 1, 1) Next d(1) = "年" & Choose(Month(MyDate) \ 10 + 1, "", "十") & Mid(" 一二三四五六七八九", Month(MyDate) Mod 10 + 1, 1) & "月" d(2) = Choose(Day(MyDate) \ 10 + 1, "", "十", "二十", "三十") & Mid(" 一二三四五六七八九", Day(MyDate) Mod 10 + 1, 1) & "日" CDateTime = Join(d, "") CDateTime = Replace(CDateTime, " ", "") End Function
运行代码结果:
? CDateTime( now()) 二零一三年一月五日
其实,代码没有错误的;一般的显示,也不是什么大问题的;但是我们这里是数据库开发应用的,如果我们在查询语句里面添加自定义函数,可不得了! 譬如
select CDateTime( [日期]) as C_DATE from A_Table
意思是每条记录都要做一次的函数,如果这是放在报表里面的话,那就花了很多时间在这个函数上面了,那就要讲究速率了!运行10000次,就是 0.38秒。
t=timer(): for j=1 to 10000: n=CDateTime(now()): next: ? timer()-t .3847656
也许大家都觉得不是很大的问题,才半秒不到的时间,不过我提出这个文章意思是让大家一举反三,学会文本处理一定要快速,等着我们去处理的事还多着的呢!
提速,就要看到代码,有个 For..Next,有个Replace,更有三个 字符串要从代码里面 塞进VBA的运算核心,都是比较慢的事情!改了下:
Public Function DigitChi(d, cc, cd) dtext = Format(d, "yyyymmdd") Dim b() As Byte b = dtext For i = 0 To 15 Step 2: b(i) = b(i) - 48: Next DigitChi = cc(b(0)) & cc(b(2)) & cc(b(4)) & cc(b(6)) & "年" & _ cd(b(8)) & cc(b(10)) & "月" & cd(b(12)) & cc(b(14)) & "日" End Function
cc, cd 则在呼叫前定义好
cc = Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九") cd = Array("", "十", "二十", "三十")
提速的有三个关键部分:
-
用 Byte Array 来 处理文本,下面两句就能把文本放在一个 数组里面了
Dim b() as Byte
b = dtext -
由于Windows的Unicode是UCS-2BE的,所以,数字的 ascii 码会在第一个字节,然后第二个字节就为0。
输出的 b(0) , b(2), b(4),... b(14) 就是那8个数字的 ascii码。ascii 码减去 0的ascii码 48 就是 我们要 0-9的值。直接从 cc 与 cd 里面提取就行了! -
另外也是最关键的,cc 和 cd 其实是常数,VBA又不能定义 常数数组,唯有,所以在呼叫这个函数之前定义好,在运行的时候就不用在代码里解释这段字符串代码,毕竟VBA的编译器没办法固化这些数组!
(应用到窗体或者报表,这两个变量,最好 Public 代码预先生成,而就不需要传入参数了!)
我们就试试速度:
cc = Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九") cd = Array("", "十", "二十", "三十") t=timer(): for j=1 to 10000: n=DigitChi(now(),cc,cd): next: ? timer()-t .1542969
比原来的代码 .3847656 提升到 .1542969 了!
正如这里的群主们说的,方法永远多于问题的,我们采用更好的方法,程序就能跑得更快!
初学者就为了完成任务,学习怎么编写能完成任务的代码;
而我们资深用家,就是让相同功能的程序可以
在相同的配置的环境下,执行更快的运算、支持更多的同时在线用户、处理更大的数据流量!
![]() |
开发者你们好,这是 地球信息思维开发者 dbaseIIIer (QQ325613888) |
Access软件网官方交流QQ群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- 通过命令按钮让Access列表...(04.24)
- 统计当月之前(不含当月)的记录...(03.11)
- 【Access Inputbo...(03.03)
- 按回车键后光标移动到下一条记录...(02.12)
- 【Access Dsum示例】...(02.07)
- Access对子窗体的数据进行...(02.05)
- 【Access高效办公】上月累...(01.09)
- 【Access高效办公】上月累...(01.06)
- 【Access Inputbo...(12.23)

学习心得
最新文章
- 仓库管理实战课程(15)-月度库存...(04.30)
- Access选择打印机、横纵向、纸...(04.29)
- 仓库管理实战课程(14)-出库功能...(04.26)
- 通过命令按钮让Access列表框指...(04.24)
- 仓库管理实战课程(13)-入库功能...(04.21)
- Access控件美化之--美化按钮...(04.19)
- Access多行文本按指定字符筛选...(04.18)
- Microsoft Access数...(04.18)
- 仓库管理实战课程(12)-月度结存...(04.16)
- 仓库管理实战课程(11)-人性化操...(04.15)