excel vba从单元格里提取生日,显示错误13类型不匹配

excel vba从单元格里提取生日,显示错误13类型不匹配

Dim birthday As Date
Dim sendIndex

endRowNo = ThisWorkbook.Sheets("Sheet1").[a65535].End(xlUp).Row 


ThisWorkbook.Sheets("sheet1").Select

For rowCount = 2 To endRowNo 

nbirthday = ThisWorkbook.Sheets("sheet1").Range("d" & rowCount).Value
birthday = CDate(nbirthday)

单元格如下

img

如果您在Excel VBA中使用了CDate函数将单元格的日期值转换为日期类型,但是在运行代码时出现了“错误13:类型不匹配”,则可能是因为单元格内的值不是可识别的日期格式。

这个错误基本可以肯定是由于单元格中的值不是日期格式导致的(你那个值是2/4,不是标准日期啊)。
需要尝试转换为日期的单元格是否包含有效的日期,
并且该单元格的格式设置为日期。
如果确实是日期,才能使用CDate函数才可以转换为日期格式
~
你excel里的数据格式应该只是string 2/4 如果所有数据都这样那么估计要拼年份才可以,比如 1998/2/4 这种格式的,比如这个例子

' 举例1:
d1 = "April 22, 2001"
d2 = "6:15:45 PM"
d3 = "2014-07-24 15:43:06"
d4 = "29-Jan-21"

If IsDate(d1) And IsDate(d2) And IsDate(d3) Then
    MsgBox CDate(d1)      ' 22/04/2020
    MsgBox CDate(d2)      ' 18:15:45
    MsgBox CDate(d3)      ' 24/07/2014 15:43:06
    MsgBox CDate(d4)      ' 29/01/2021

    MsgBox DateValue(d1)  ' 22/04/2020
    MsgBox DateValue(d2)  ' 00:00:00
    MsgBox DateValue(d3)  ' 24/07/2014
End If

之所以会出现13错误,你要看下面这个例子就知道了
~

' 举例2:
MsgBox CDate(43972)             ' 5/21/2020
MsgBox CDate("12/25/2020")      ' 1/15/2014

MsgBox DateValue("12/25/2020")  ' 1/15/2014
MsgBox DateValue(43972)         ' Throws a Type mismatch error(Run-time error 13)

===

总结: CDate和DateValue的区别:

从上述 举例1 代码结果总结出,DateValue 只返回一个Date类型结果,而CDate返回结果将保留日期和时间,当参数为一个时间类型的时候,DateValue 只能返回一个 00:00:00的结果。

从上述 举例2 代码结果总结出,另外,DateValue (或TimeValue)只接受 String 类型的参数,而 CDate 也可以处理 数字 。

==

另外送你个大礼包 ,希望有学习VBA小工具的可以参考
github上几百star的一个学习vba文档
https://github.com/bluetata/concise-excel-vba