VBA中Application.Evaluate报错2015:公式值无法赋值给Days变量
解决VBA中DATEVALUE计算返回2015错误的问题
这个2015错误本质是Excel无法识别你传入DATEVALUE的字符串为合法日期格式,咱们从公式逻辑和VBA写法两方面来修正:
先排查公式本身的问题
你可以先在Excel单元格(比如F4)直接输入原公式测试:
=DATEVALUE(MID(B4,7,9))-DATEVALUE(CONCATENATE(RIGHT(A4,4),LEFT(B4,4)))+1
如果单元格里也报错,核心问题大概率是这两点:
CONCATENATE(RIGHT(A4,4),LEFT(B4,4))拼接出来的是纯数字字符串(比如20231005),DATEVALUE默认不识别这种格式,需要给它加上日期分隔符(比如2023/10/05)。- 或者
MID(B4,7,9)提取的内容本身就不是合法的日期字符串(比如格式不对、长度不足)。
修正后的VBA写法(两种可选)
方案1:修正Evaluate里的公式,指定工作表引用
避免依赖Activate和Select(VBA里尽量不用这些操作,容易因活动表切换出意外),同时给拼接的日期字符串加上格式转换:
Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Plan1") Dim Days As Long ' 天数是整数,用Long类型更合适 ' 给拼接后的日期字符串添加分隔符,让DATEVALUE能识别 Days = Application.Evaluate( _ "DATEVALUE(MID(" & ws.Range("B4").Address & ",7,9)) - " & _ "DATEVALUE(TEXT(CONCATENATE(RIGHT(" & ws.Range("A4").Address & ",4),LEFT(" & ws.Range("B4").Address & ",4)),""0000-00-00"")) + 1" _ )
方案2:用VBA原生函数计算,更易调试
把拆分、转换、计算的步骤拆开,方便你排查哪一步出问题:
Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Plan1") Dim endDateStr As String, startDateStr As String Dim startDate As Date, endDate As Date Dim Days As Long ' 提取结束日期(从B4第7位取9个字符) endDateStr = Mid(ws.Range("B4").Value, 7, 9) If Not IsDate(endDateStr) Then MsgBox "B4提取的日期无效:" & endDateStr Exit Sub End If endDate = CDate(endDateStr) ' 拼接并转换开始日期格式(比如把20231005转成2023/10/05) startDateStr = Right(ws.Range("A4").Value, 4) & Left(ws.Range("B4").Value, 4) startDateStr = Left(startDateStr, 4) & "/" & Mid(startDateStr, 5, 2) & "/" & Right(startDateStr, 2) If Not IsDate(startDateStr) Then MsgBox "拼接的开始日期无效:" & startDateStr Exit Sub End If startDate = CDate(startDateStr) ' 计算最终天数 Days = endDate - startDate + 1
关键注意点
- 始终确保传入DATEVALUE(或CDate)的是Excel能识别的日期格式,比如
YYYY/MM/DD、MM/DD/YYYY、YYYY-MM-DD等,纯数字串大概率会触发识别错误。 - VBA里直接引用工作表对象,比激活/选择单元格更稳定,不会因为当前活动表切换而出错。
内容的提问来源于stack exchange,提问作者ldsouza




