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

嵌套循环调用WorksheetFunction.SumProduct出现1004错误求助

VBA 嵌套筛选后调用SumProduct出现1004错误的解决方法

错误根源分析

  1. 无可见单元格触发报错:筛选后若没有符合条件的数据行(仅留表头),SpecialCells(xlCellTypeVisible)会直接抛出1004错误,因为找不到目标单元格。
  2. 工作表引用混乱:代码中在wsS区域执行AutoFilter,但后续操作Worksheets(10)的单元格,两者筛选状态不关联,导致获取的可见区域并非当前筛选结果。
  3. SumProduct参数要求严格:WorksheetFunction.SumProduct要求两个参数区域尺寸完全一致,若可见区域是不连续多块单元格,直接传入会触发不匹配错误。

修正后的代码

With wsS
    .AutoFilterMode = False
    With .Range("B1:U" & lRow) ' 明确绑定wsS表的区域,避免默认工作表混淆
        For i = 0 To uBS - 1
            .AutoFilter Field:=10, Criteria1:=result(i)
            For j = 0 To uBD - 1
                .AutoFilter Field:=8, Criteria1:=result2(j)
                
                ' 捕获无可见单元格的场景
                Dim dataRange As Range
                On Error Resume Next
                Set dataRange = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
                On Error GoTo 0
                
                If Not dataRange Is Nothing Then
                    ' 从可见区域中提取目标列(L、M列需对应原区域的列位置,此处以B列为起始列计算)
                    Dim r1 As Range, r2 As Range
                    Set r1 = Intersect(dataRange, .Columns("L"))
                    Set r2 = Intersect(dataRange, .Columns("M"))
                    
                    ' 用Application.SumProduct替代,出错时返回错误值而非中断代码
                    Dim VolG As Variant
                    VolG = Application.SumProduct(r1, r2)
                    
                    ' 此处添加VolG的后续处理逻辑
                    ' Debug.Print VolG
                End If
                
                ' 清除当前列筛选,避免影响下一轮循环
                .AutoFilter Field:=8
            Next j
            ' 清除当前列筛选
            .AutoFilter Field:=10
        Next i
    End With
    .AutoFilterMode = False
End With

关键修正说明

  • 错误捕获机制:通过On Error Resume Next处理无可见单元格的情况,避免SpecialCells直接抛出运行时错误。
  • 统一工作表上下文:所有操作基于wsS表,确保筛选和数据提取的是同一表的内容。
  • 列范围匹配:用Intersect从可见区域中提取目标列,保证r1和r2的尺寸完全一致,满足SumProduct的参数要求。
  • 改用Application.SumProduct:相比WorksheetFunction.SumProduct,前者在参数不合法时返回错误值(如#VALUE!),而非中断代码,更适合循环场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:43:20