1.Excel中的datedif函数
之前我通过身份证计算年龄时,都是取第7到10位,用当年的年份去减,得到一个年龄,这样不准确。后来,发现了datedif函数,注意,只有一个f。
函数语法:
DATEDIF(start_date,end_date,unit)
参数1:start_date,表示起始日期
参数2:end_date,表示结束日期
参数1和参数2可以是带引号的文本串(例如:"2014-1-1")、系列号或者其他公式或函数的结果
参数3:unit为所需信息的返回时间单位代码。各代码含义如下:
"y"返回时间段中的整年数
"m”返回时间段中的整月数
"d"返回时间段中的天数
"md”参数1和2的天数之差,忽略年和月
"ym“参数1和2的月数之差,忽略年和日
"yd”参数1和2的天数之差,忽略年。按照月、日计算天数
演示如下:在C2单元格里写上如下内容:=DATEDIF(A2,B2,"y")
比如,要根据身份证号求实际年龄,则用下面的方法:
在B2单元格写下如下内容:=DATEDIF(MID(A2,7,4) & "/" & MID(A2,11,2) & "/" & MID(A2,13,2),NOW(),"y")
如果觉得不够详细,就看微软的官方说明。DATEDIF 函数 (microsoft.com)
2.在VBA中使用datediff函数
注意是两个f。而且函数的定义不一样,如下:
语法
DateDiff(interval, date1, date2, [ firstdayofweek, [ firstweekofyear ]] )
DateDiff 函数语法包括这些 命名参数:
Part | 说明 |
---|---|
interval | 必需。 表示用于计算 date1 和 date2 之间差异的时间间隔的 字符串表达式。 |
date1、date2 | 必需;Variant (Date)。 要在计算中使用的两个日期。 |
firstdayofweek | 可选。 一个指定一周的第一天的常量。 如果未指定,则会假定为星期日。 |
firstweekofyear | 可选。 一个指定一年的第一周的常量。 如果未指定,则会假定 1 月 1 日出现的那一周为第一周。 |
设置
interval 参数具有以下设置:
Setting | 说明 |
---|---|
yyyy | 年 |
q | 季度 |
m | 月 |
y | 每年的某一日 |
d | 天 |
w | 工作日 |
ww | 周 |
h | 小时 |
n | 分钟 |
s | 秒 |
这些是从官方文档上找的,很费解。比如,"yyyy"表示间隔的是多少年,"y"表示某年中的一日,有的文档上又写的是一年中的天。测试如下:
通过立即窗口的第3句我们发现,跨年就算一年,哪怕只有一天。
文档中也明确了这句话。
在将 12 月 31 日与随后一年中的 1 月 1 日相比时,“年”("yyyy") 的 DateDiff 会返回 1,即使仅过去一天时间。
微软的官方文档地址:DateDiff 函数 (Visual Basic for Applications) | Microsoft Docs
3.VBA求足岁的方法
通过上面第2点的说明,在VBA下面直接使用datediff来求足岁,是行不通的了。因此,定义如下的函数,解决这个问题。
Function Age(id As String) As Integer
varBirthDate = Mid(id, 7, 4) & "/" & Mid(id, 11, 2) & "/" & Mid(id, 13, 2)
If IsNull(varBirthDate) Then Age = 0: Exit Function
varAge = DateDiff("yyyy", varBirthDate, Now)
'为了解决跨年就是一岁的问题,判断今年的生日到没了。如果没到,则减1。
If Date < DateSerial(Year(Now), Month(varBirthDate), Day(varBirthDate)) Then
varAge = varAge - 1
End If
Age = CInt(varAge)
End Function
使用效果如下: