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对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- 对上传附件及图片功能限制附件上传的...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)