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

基于起止日期统计指定范围唯一日期数量的VBA报错问题

错误原因分析
  • Filter无匹配时触发错误:WorksheetFunction.Filter在没有找到符合条件的数据时,会直接抛出运行时错误,而非返回空数组,后续的Unique和Count函数无法处理这种错误值,导致类型不匹配。
  • Range比较的兼容性问题:VBA中直接对Range对象执行Range("Date") >= Range("RawStartDate")这类数组运算,无法像工作表公式那样自动将单个单元格的值广播到整个范围,会引发类型不匹配。
  • WorksheetFunction的严格错误机制:WorksheetFunction系列函数遇到错误时会直接抛出运行时错误,不像Application对象调用函数那样会返回错误值供后续判断。

方案1:修复原代码(兼容工作表函数)

改用Application调用函数(允许返回错误值),同时先将起止日期存入变量,避免Range直接比较的问题:

Dim RawDistinctDates As Long
Dim startDate As Date, endDate As Date
Dim filteredDates As Variant

startDate = Range("RawStartDate").Value
endDate = Range("RawEndDate").Value

' 使用Application调用函数,无匹配时返回错误值而非直接报错
filteredDates = Application.Filter(Range("Date"), (Range("Date") >= startDate) * (Range("Date") <= endDate))

If Not IsError(filteredDates) Then
    RawDistinctDates = Application.Count(Application.Unique(filteredDates))
Else
    RawDistinctDates = 0 ' 无匹配日期时返回0
End If

MsgBox RawDistinctDates

方案2:纯VBA遍历实现(无工作表函数依赖)

利用字典自动去重的特性,遍历日期范围统计符合条件的唯一日期:

Dim RawDistinctDates As Long
Dim dateRange As Range, cell As Range
Dim startDate As Date, endDate As Date
Dim uniqueDates As Object

Set uniqueDates = CreateObject("Scripting.Dictionary")
startDate = Range("RawStartDate").Value
endDate = Range("RawEndDate").Value
Set dateRange = Range("Date")

For Each cell In dateRange
    ' 跳过非日期单元格
    If IsDate(cell.Value) Then
        If cell.Value >= startDate And cell.Value <= endDate Then
            ' 字典键唯一,自动去重
            uniqueDates(cell.Value) = Empty
        End If
    End If
Next cell

RawDistinctDates = uniqueDates.Count
MsgBox RawDistinctDates

' 释放对象
Set uniqueDates = Nothing

内容的提问来源于stack exchange,提问作者Andrew Abbott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:57:45