如何用VBA及R1C1引用在Excel中按姓名筛选并求和数据?
Excel VBA计算销售人员总销售额(R1C1引用)问题解决
原代码问题分析
你的代码无法运行主要有两个核心问题:
- AutoFilter使用错误:
Range("H6").Offset(5, 0)指向单个单元格(H11),AutoFilter必须作用在包含表头的完整数据区域,单独单元格调用会触发错误。 - R1C1公式范围错误:原公式
=SUM(R[6]C[-4]:R[10]C[4])的引用区域完全偏离了销售数据(A列销售人员、F列销售额),逻辑上根本无法匹配求和需求。
解决方案:使用SUMIF函数(R1C1格式)
不需要用AutoFilter,直接用SUMIF按销售人员名字匹配求和是更高效的方案,完全契合你的需求。以下是修正后的代码:
完整VBA代码
Sub CalculateSales() ' 定义目标工作表(第二张表,可替换为实际表名如"Sheet2") Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(2) ' 给第一个销售人员(H6对应的I6)写入R1C1格式的SUMIF公式 ' 逻辑:匹配A6:A16中等于H列当前单元格的内容,对F6:F16对应行求和 ws.Range("I6").FormulaR1C1 = "=SUMIF(R6C1:R16C1, RC[-1], R6C6:R16C6)" ' 将公式填充到其他销售人员行(I6到I10) ws.Range("I6:I10").FillDown ' 计算总销售额(I11) ws.Range("I11").FormulaR1C1 = "=SUM(R6C:R10C)" End Sub
代码说明
R6C1:R16C1:指定A列(第1列)的销售人员数据范围(从第6行到第16行)RC[-1]:相对引用当前单元格左侧一列(即H列的销售人员名字)R6C6:R16C6:指定F列(第6列)的销售额数据范围- 用
FillDown快速将公式复制到其他行,避免重复写代码
可选:用AutoFilter实现的修正方案
如果你坚持要用AutoFilter,需要先对数据区域启用过滤,再对可见单元格求和,代码如下:
Sub CalculateSalesWithFilter() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(2) Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 清除原有过滤 ws.AutoFilterMode = False ' 循环处理每个销售人员 Dim i As Integer For i = 6 To 10 ' 对A列(销售人员)启用过滤,匹配H列当前名字 ws.Range("A5:F" & lastRow).AutoFilter Field:=1, Criteria1:=ws.Range("H" & i).Value ' 对可见的F列销售额求和,写入I列 ws.Range("I" & i).Value = ws.Range("F6:F" & lastRow).SpecialCells(xlCellTypeVisible).Sum Next i ' 计算总销售额 ws.Range("I11").Value = Application.Sum(ws.Range("I6:I10")) ' 清除过滤 ws.AutoFilterMode = False End Sub
内容的提问来源于stack exchange,提问作者Barun Bepart
相关产品推荐
相关产品推荐

