VBA日期处理全攻略

论坛 期权论坛 期权     
Access开发   2019-6-29 21:07   5427   0


摘要
在日常应用中经常会需要对日期数据进行处理,本文对VBA中的日期相关处理内容进行了整理,包括对日期数据类型的介绍、VBA内置的日期相关函数以及另外一些作为补充的自定义函数等。希望通过本文能够让大家对日期数据处理方面的知识有一个全面的梳理。


正文
在日常应用中经常会需要对日期数据进行处理,本文对VBA中的日期相关处理内容进行了整理,包括对日期数据类型的介绍、VBA内置的日期相关函数以及另外一些作为补充的自定义函数等。希望通过本文能够让大家对日期数据处理方面的知识有一个全面的梳理。
日期单独作为一种数据类型,使用8个字节进行存储,以#号作为界定符,可以包含日期和时间,有效数据范围为:100年1月1日到9999年12月31日。

在函数中用到的日期间隔符
以下字符用于一些日期处理函数在对日期进行处理时指定日期间隔:
符号
说明
yyyy

q
季                                    
y
一年的天数
m

d

w
一周的天数
ww

h
小时
n
分钟
s
秒数


设置系统日期/时间Date语句:设置系统日期。示例:Date=#1999-1-1#
Time语句:设置系统时间。示例:Time=#13:01:01#
Now语句:设置系统日期和时间。示例:Now=#1999-1-1 13:01:01#


取当前系统日期/时间Date函数:返回当前系统日期。示例: =Date()   
Time函数:返回当前系统时间。示例:=Time()
Now函数:返回当前系统的日期和时间。示例:=Now()

将其它类型数据转换为日期类型数据:
CDate函数:
       语法:           CDate(expression)
中文含义:    CDate(表达式)
示例:          =CDate("February 12, 1969")      返回1969-2-12
DateValue函数:
       语法:           DateValue(date)
       中文含义:    DateValue(用字符串表达的日期)
       示例:           =DateValue("Dec 30, 1991")      返回1991-12-30
TimeValue函数:
       语法:           TimeValue(date)
       中文含义:    TimeValue(用字符串表达的日期)
注:DateValue函数只返回日期部分,TimeValue只返回时间部分,而CDate则允许同时含有日期和时间。

得到在指定日期上加减一定间隔之后的日期值
DateAdd函数:
语法:           DateAdd(interval, number, date)
中文含义:    DateAdd(间隔字符,间隔数,原始日期)
说明:           间隔数为正数返回比原始日期更晚的日期,为负数返回比原始日期更早的日期
       示例:           =DateAdd(”y”,1,Date())    返回在当前系统日期上加1年之后得到的日期
                            =DateAdd(”ww”,2,Date())  返回在当前系统日期上减去2周得到的日期

得到两个指定日期间的时间间隔数目
DateDiff函数
语法:           DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
中文含义:    DaateDiff(间隔字符, 日期1, 日期2, [星期几为周的第1天], [哪周为年的第1周])

得到某个日期中指定的时间部分
DatePart函数:
语法:           DatePart(interval, date[,firstdayofweek[, firstweekofyear]])
中文含义:    DatePart(间隔字符, 指定的日期, [星期几为周的第1天, [哪周为年的第1周]])
示例:           =DatePart("m",日期变量)            返回日期中的月
Year函数:返回日期中的年。
Month函数: 返回日期中的月。
Day函数:返回日期中的天。
Hour函数:返回日期/时间中的小时。
Minute函数:返回日期/时间中的分。
Second函数:返回日期/时间中的秒。

得到指定日期是一星期中的第几天
Weekday函数
       语法:           Weekday(date, [firstdayofweek])
       中文含义:    Weekday(日期值, [星期几为周的第1天])
       示例:           =Weekday(#2001-1-1#, vbMonday)      ‘设星期一为周的第一天,此处返回1

得到指定日期是星期几
WeekdayName函数
       语法:           WeekdayName(weekday, abbreviate, firstdayofweek)
       中文含义:    WeekdayName(星期中的第几天, 是否缩写, 星期几为周的第一天)
       示例:           =WeekdayName(2, False,vbMonday)    ‘设星期一为周的第一天,此处返回“星期二”
                            =WeekdayName(2, True,vbMonday)     ‘设星期一为周的第一天,此处返回“周二”
注:此处返回的值和系统语言环境有关,示例中是在中文简体系统下返回的值。

得到将指定的日期部分进行组合后的日期
DateSerial函数:
       语法:           DateSerial(year, month, day)
中文含义:    DateSerial(年,月,日)
TimeSerial函数:
语法:           TimeSerial(hour, minute, second)
中文含义:    TimeSerial(时,分,秒)

计时器
Timer函数:返回从午夜开始到现在经过的秒数。用来在两个时间点之间计时。示例:
  1. 1Dim sngStart As Single2sngStart=Timer()3'其它要执行的代码……4MsgBox "共计用时" & Timer()-sngStart & "秒"
复制代码
得到某日期所在月第一天日期
  1. 1Function FirstOfMonth(Optional DateArg As Date) As Date
  2. 2    If Len(DateArg) = 0 Then DateArg = Date
  3. 3    FirstOfMonth = DateSerial(Year(DateArg), Month(DateArg), 1)
  4. 4End Function
复制代码
得到某日期所在月最后一天日期
  1. 1Function LastDayOfMonth(Optional DateArg As Date) As Date
  2. 2    If Len(DateArg) = 0 Then DateArg = Date
  3. 3    LastOfMonth = DateSerial(Year(DateArg), Month(DateArg) + 1, 1) - 1
  4. 4End Function
复制代码
得到某日期所在周第一天日期
  1. 1Function FirstDayOfWeek(DateArg) As Date
  2. 2    FirstDayOfWeek = DateAdd("d",  -Weekday(Date, vbMonday) + 1, DateArg)
  3. 3End Function
复制代码
得到某日期所在周最后一天日期
  1. 1Function LastDayOfWeek(DateArg) As Date
  2. 2    LastDayOfWeek = DateAdd("d",  7 - Weekday(Date, vbMonday, DateArg)
  3. 3End Function
复制代码
得到指定日期所在月份的天数
  1. 1Function DaysOfMonth(DateArg) As Integer
  2. 2    DaysOfMonth = Day(DateAdd("d", -1, Format(DateAdd("m", 1, DateArg), "yyyy-mm-1")))
  3. 3End Function
  4. 4
复制代码
转换为中文日期
  1. 1Public Function CnDate(TheDate As Date) As String
  2. 2    Dim strNum As String
  3. 3    Dim intI As Integer
  4. 4    Dim strPart(1 To 3) As String
  5. 5
  6. 6    CnDate = Format(TheDate, "yyyy年m月d日")
  7. 7    For intI = 1 To Len(CnDate)
  8. 8        strNum = Mid(CnDate, intI, 1)
  9. 9        If strNum Like "[0-9]" Then
  10. 10            If strNum = 0 Then strNum = "10"
  11. 11            Mid(CnDate, intI, 1) = Mid("一二三四五六七八九〇", CInt(strNum), 1)
  12. 12        End If
  13. 13    Next
  14. 14    strPart(1) = Left$(CnDate, 5)
  15. 15    strPart(2) = Mid$(CnDate, 6, InStr(1, CnDate, "月") - 5)
  16. 16    strPart(3) = Mid$(CnDate, InStr(1, CnDate, "月") + 1)
  17. 17    If Len(strPart(2)) > 2 Then strPart(2) = "十" & Mid$(strPart(2), 2)
  18. 18    If Len(strPart(3)) > 2 Then
  19. 19        strPart(3) = Left$(strPart(3), 1) & "十" & Mid$(strPart(3), 2)
  20. 20        If Left$(strPart(3), 1) = "一" Then strPart(3) = Mid$(strPart(3), 2)
  21. 21    End If
  22. 22    strPart(3) = Replace(strPart(3), "十〇", "十")
  23. 23    CnDate = strPart(1) & strPart(2) & strPart(3)
  24. 24End Function
复制代码
对日期的格式化处理
Format函数:
       语法:Format(expression[, format[, firstdayofweek[, firstweekofyear]]])
       中文含义:    Format(表达式[, 格式字符串[, 星期几为周的第1天[, 哪周为年的第1周]]])
预定义的格式
下表显示了“日期/时间”数据类型的预定义格式字符串。
格式字符串
说明
Genaral   Date
常规日期    (默认值)如果值只是一个日期,则不显示时间;如果值只是一个时间,则不显示日期。该设置是“短日期”与“长时间”设置的组合。   示例:4/3/93,05:34:00 PM 和 4/3/93 05:34:00 PM。
Long Date
长日期  与   Windows 区域设置中的“长日期”设置相同。 示例:1993 年 4 月 3 日,星期六。
Medium Date
中日期  示例:93   年 4 月 3 日。
Short Date
短日期  与   Windows 区域设置中的“短日期”设置相同。 示例:4/3/93。
注意: “短日期”设置假设 00-1-1 和 29-12-31 之间的日期是二十一世纪的日期(即假定年从 2000 到 2029 年)。而   30-1-1 到 99-12-31 之间的日期假定为二十世纪的日期(即假定年从 1930 到 1999 年)。
Long Time
长时间  与   Windows 区域设置中的“时间”选项卡上的设置相同。 示例:5:34:23 PM。
Medium Date
中时间  示例:5:34   PM。
Short Time
短时间  示例:17:34。

自定义格式
可以使用下列的符号创建自定义日期及时间格式。
符号
说明
:(冒号)
时间分隔符 (分隔符:用来分隔文本或数字单元的字符。)。分隔符是在 Windows 区域设置中设置的。
/
日期分隔符。
aaaa
表示星期几的字符串(如 Windows 区域设置中所定义)。示例:星期一。
c
与“常规日期”的预定义格式相同。
d
一个月中的天数,根据需要以一位或两位数表示(1 到 31)。
dd
一个月中的天数,用两位数字表示(01 到 31)。
ddd
星期数的前三个字母(Sun 到 Sat)。
dddd
星期数的全称(Sunday 到 Saturday)。
ddddd
与“短日期”的预定义格式相同。
dddddd
与“长日期”的预定义格式相同。
w
星期数(1 到 7)。
ww
一年中的周数(1 到 53)。
m
一年中的月份数,根据需要以一位或两位数表示(1 到 12)。
mm
一年中的月份数,以两位数表示(01 到 12)。
mmm
月份的前三个字母(Jan 到 Dec)。
mmmm
月份的全称(January 到 December)。
q
以一年中的季度的形式显示的日期(1 到 4)。
y
一年中的天数(1 到 366)。
yy
年份的最后两个数字(01 到 99)。
yyyy
完整的年数(0100 到 9999)。
h
小时,根据需要以一位或两位数表示(0 到 23)。
hh
小时,以两位数表示(00 到 23)。
n
分钟,根据需要以一位或两位数表示(0 到 59)。
nn
分钟,以两位数表示(00 到 59)。
s
秒,根据需要以一位或两位数表示(0 到 59)。
ss
秒,以两位数表示(00 到 59)。
ttttt
与“长时间”的预定义格式相同。
AM/PM
相应地使用大写字母“AM”或“PM”的 12 小时时钟。
am/pm
相应地使用小写字母“am”或“pm”的 12 小时时钟。
A/P
相应地使用大写字母“A”或“P”的 12 小时时钟。
a/p
相应地使用小写字母“a”或“p”的 12 小时时钟。
AMPM
使用适当的上午/下午指示器(如 Windows 区域设置中所定义)的 24 小时时钟。





关注
我的

都变
瘦了
扫码更多惊喜

你点的每个赞,我都认真当成了喜欢


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:5
帖子:1
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP