嵌套循环调用WorksheetFunction.SumProduct出现1004错误求助
VBA 嵌套筛选后调用SumProduct出现1004错误的解决方法
错误根源分析
- 无可见单元格触发报错:筛选后若没有符合条件的数据行(仅留表头),
SpecialCells(xlCellTypeVisible)会直接抛出1004错误,因为找不到目标单元格。 - 工作表引用混乱:代码中在
wsS区域执行AutoFilter,但后续操作Worksheets(10)的单元格,两者筛选状态不关联,导致获取的可见区域并非当前筛选结果。 - 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
相关产品推荐
相关产品推荐

