Excel 2016中如何用VBA比较文本日期与实际日期?
当然可以用VBA实现!
问题出在CDate函数太依赖系统的区域设置了——比如你的系统如果是美式区域,CDate("01/05/2018")会被解析成1月5日,而英式格式下它应该是5月1日;另外May 18会默认使用当前年份,这就导致匹配结果完全不符合预期。
我给你写个自定义函数,手动解析两种日期格式,完全不受系统区域影响,精准实现你要的判断:
Function DatesMatch() As Boolean Dim a1Val As String, a2Val As String Dim a1Month As Integer, a1Year As Integer Dim a2Day As Integer, a2Month As Integer, a2Year As Integer Dim dateParts() As String ' 获取两个单元格的值 a1Val = Range("A1").Text a2Val = Range("A2").Text ' 解析A1的"May 18"格式:提取月份和年份(18是2018的后两位) dateParts = Split(a1Val, " ") If UBound(dateParts) <> 1 Then DatesMatch = False Exit Function End If ' 把月份名称转成数字(比如May转成5) On Error Resume Next a1Month = Month(DateValue("1 " & dateParts(0) & " 2000")) ' 用任意年份来获取月份数字 On Error GoTo 0 If a1Month = 0 Then ' 月份名称无效的情况 DatesMatch = False Exit Function End If ' 解析年份:18 → 2018 a1Year = 2000 + CInt(dateParts(1)) ' 解析A2的英式日期"dd/mm/yyyy" dateParts = Split(a2Val, "/") If UBound(dateParts) <> 2 Then DatesMatch = False Exit Function End If a2Day = CInt(dateParts(0)) a2Month = CInt(dateParts(1)) a2Year = CInt(dateParts(2)) ' 判断:A1的年份和月份是否与A2一致(符合你说的May18和01/05/2018返回TRUE的需求) DatesMatch = (a1Year = a2Year And a1Month = a2Month) End Function
使用方法:
- 打开Excel的VBA编辑器(按
Alt+F11) - 插入一个新模块(右键你的工作簿→插入→模块)
- 把上面的代码粘贴进去
- 回到Excel,在任意单元格输入
=DatesMatch(),就能得到TRUE或FALSE了
如果你的实际需求是判断日期和月份都完全相同(比如A1是"May 01"和A2的"01/05/2018"匹配),只需要把最后一行的判断改成:
' 先构造A1的完整日期 Dim a1Date As Date a1Date = DateSerial(a1Year, a1Month, CInt(dateParts(1))) ' 这里dateParts(1)是日期,比如01 DatesMatch = (a1Date = DateSerial(a2Year, a2Month, a2Day))
这样就完全按照你需要的逻辑来匹配啦。
内容的提问来源于stack exchange,提问作者bd528
相关产品推荐
相关产品推荐

