VBA计算两个日期差值时出现Run-time error '13': Type Mismatch错误
解决VBA日期计算的Run-time error '13'类型不匹配问题
问题根源
- 空白单元格赋值冲突:当单元格为空时,
Ws.Cells(RowNo, Column1)返回Empty,直接赋值给Date类型变量会触发类型不匹配。 - 非空判断逻辑错误:
FirstDate <> ""的写法完全错误——Date类型变量不能和字符串""做比较,这会直接引发类型不匹配报错。 - 变量声明不规范:VBA中
Dim FirstDate, SecondDate As Date仅将SecondDate设为Date类型,FirstDate实际是Variant类型,虽不是直接报错原因,但会增加潜在风险。
修复后的代码
Sub Date_Calc() Dim RowNo As Long Dim FirstDate As Variant, SecondDate As Variant Dim Ws As Worksheet: Set Ws = Sheets("Sheet1") RowNo = 2 Const Column1 = 1 Const Column2 = 2 Const Column3 = 3 Do Until RowNo = 10000 FirstDate = Ws.Cells(RowNo, Column1).Value SecondDate = Ws.Cells(RowNo, Column2).Value ' 先判断单元格内容是否为有效日期 If IsDate(FirstDate) And IsDate(SecondDate) Then Ws.Cells(RowNo, Column3) = Day(SecondDate) - Day(FirstDate) End If RowNo = RowNo + 1 ' 无论是否计算,都要递增行号,避免死循环 Loop End Sub
关键修改说明
- 将
FirstDate和SecondDate声明为Variant类型,兼容空白单元格的Empty值。 - 用
IsDate()函数判断单元格内容是否为有效日期,彻底避免类型不匹配。 - 把
RowNo = RowNo + 1移到If语句外面,防止遇到空白行时陷入死循环。 - 用
Const定义列号,提升代码可读性和可维护性。
额外优化建议
如果数据行数不确定,不要固定循环到10000行,建议用动态获取最后一行的方式优化循环:
' 获取数据区域最后一行 Dim LastRow As Long LastRow = Ws.Cells(Ws.Rows.Count, Column1).End(xlUp).Row Do Until RowNo > LastRow ' 循环逻辑不变 Loop
内容的提问来源于stack exchange,提问作者sd1272
相关产品推荐
相关产品推荐

