You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA计算两个日期差值时出现Run-time error '13': Type Mismatch错误

解决VBA日期计算的Run-time error '13'类型不匹配问题

问题根源

  1. 空白单元格赋值冲突:当单元格为空时,Ws.Cells(RowNo, Column1)返回Empty,直接赋值给Date类型变量会触发类型不匹配。
  2. 非空判断逻辑错误:FirstDate <> ""的写法完全错误——Date类型变量不能和字符串""做比较,这会直接引发类型不匹配报错。
  3. 变量声明不规范: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:01:00