日常工作中,我们时常需要对数据按周或月或年来分类,从而生成相关图表。所以在VBA编程中,日期函数是一个非常重要的知识点,VBA里面的日期函数和excel函数的用法并不完全一样。本章节将就日期函数的运用做一个归纳总结。
-
当月或上个月的第一天和最后一天
这里主要用到DateSerial 函数:DateSerial(year, month, day)。每个月的最后一天实际上就是下个月的day为0(注意:不是当月的day为31,因为有的月份是30天)。
firstday_PastM = DateSerial(Year(Date), Month(Date) - 1, 1) '上个月第一天,Date函数返回当前的系统日期
lastday_PastM = DateSerial(Year(Date), Month(Date), 0) '上个月最后一天
firstday_CurrentM = DateSerial(Year(Date), Month(Date), 1) '当月第一天
lastday_CurrentM = DateSerial(Year(Date), Month(Date)+1, 0) '当月最后一天
-
当天周数或周几
当天周数要用到DatePart函数:DatePart (interval, date, [ firstdayofweek, [ firstweekofyear ]])。DatePart 函数是一个非常强大的函数,通过它我们可以得到所在天所属周数、月数、季度等等,其语法包介绍如下:
Part | 说明 |
---|---|
interval | 必需。 表示您要返回的时间间隔的字符串表达式。 |
date | 必需。 要计算的 Variant (Date) 值。 |
firstdayofweek | 可选。 一个指定一周的第一天的常量。 如果未指定,则会假定为星期日。 |
firstweekofyear | 可选。 一个指定一年的第一周的常量。 如果未指定,则会假定 1 月 1 日出现的那一周为第一周。 |
interval 参数具有以下设置:
Setting | 说明 |
---|---|
yyyy | 年 |
q | 季度 |
m | 月 |
y | 每年的某一日 |
d | 天 |
w | 工作日 |
ww | 周 |
h | 小时 |
n | 分钟 |
s | 秒 |
firstdayofweek 参数具有以下设置:
常量 | 值 | 说明 |
---|---|---|
vbUseSystem | 0 | 使用 NLS API 设置。 |
vbSunday | 1 | 周日(默认) |
vbMonday | 2 | 星期一 |
vbTuesday | 3 | 星期二 |
vbWednesday | 4 | 星期三 |
vbThursday | 5 | 星期四 |
vbFriday | 6 | 星期五 |
vbSaturday | 7 | 星期六 |
firstweekofyear 参数包含以下设置:
常量 | 值 | 说明 |
---|---|---|
vbUseSystem | 0 | 使用 NLS API 设置。 |
vbFirstJan1 | 1 | 从 1 月 1 日所在的周开始(默认)。 |
vbFirstFourDays | 2 | 从至少包含新的一年中的四天的那一周开始。 |
vbFirstFullWeek | 3 | 从每年的第一个完整的星期开始。 |
这个时候interval选用ww,DatePart就要表示第几周, WeekNum = VBA.DatePart("ww", Date, vbMonday, vbFirstFourDays) 这就表示把星期一当作每周的第一天。
另外,我们可以用weekday函数来精确找到上一周的第一天和第二天。
firstdayW = Date - Weekday(Date) - 6 。'Weekday(date[,firstdayofweek]), 可选参数默认周日为第一天
lastdayW = Date - Weekday(Date)
-
日期格式转换
日期格式:cdate函数将有效的日期和时间表达式转换为类型日期,一般用format(cdate(dt),”yyyy-mm-dd hh:mm:ss”)
Range(Cells(2, "o"), Cells(RowLast, "S")).NumberFormat = "@" '将格式设为文本格式,以便数据格式符合SPC要求 Cells(i, "n") = CDate(Right(Cells(i, "n"), 4) & "/" & Mid(Cells(i, "n"), 4, 2) & "/" & Left(Cells(i, "n"), 2)) '将日期文本格式转换为标准的日期格式