VBA按客户汇总商品价格并计算差值写入可调列问题求助
VBA商品价格求和差值计算修复方案
问题根因
你当前会输出所有中间累加值的原因是:打印逻辑被放在了每行循环的内部,每处理一行子商品就触发一次打印,没有等到同一个客户的所有子项全部遍历完成后再统一输出最终结果。
修复后的完整代码
Option Explicit Const start_row = 2 Const tot_price = 3 Const cus_id_num = 1 Const adjustable_col = 4 ' 可调列的列号 Sub refresh() Dim cus_id As String Dim fee_item As Double Dim temp As Double Dim base_fee As Double Dim i As Long Dim current_cus_header_row As Long ' 记录当前客户头部行的行号 i = start_row ' 初始化第一个客户的信息 current_cus_header_row = i cus_id = Me.Cells(i, cus_id_num).Value base_fee = Me.Cells(i, tot_price).Value temp = 0 i = i + 1 ' 直接跳到子项行开始遍历 While Me.Cells(i, 2).Value <> "" ' 遇到新的客户ID,先结算上一个客户的结果 If Me.Cells(i, cus_id_num).Value <> "" And Me.Cells(i, cus_id_num).Value <> "0" Then ' 输出上一个客户的最终结果 Debug.Print "客户ID:" & cus_id & " 标注总价:" & base_fee & " 子项求和:" & temp & " 差值:" & (base_fee - temp) ' 差值写入对应客户行的可调列 Me.Cells(current_cus_header_row, adjustable_col).Value = base_fee - temp ' 初始化新客户的信息 current_cus_header_row = i cus_id = Me.Cells(i, cus_id_num).Value base_fee = Me.Cells(i, tot_price).Value temp = 0 Else ' 累加当前子项的金额(四舍五入到整数) If Me.Cells(i, tot_price).Value <> "" Then fee_item = Round(Me.Cells(i, tot_price).Value, 0) temp = temp + fee_item End If End If i = i + 1 Wend ' 遍历结束后处理最后一个客户的结果 Debug.Print "客户ID:" & cus_id & " 标注总价:" & base_fee & " 子项求和:" & temp & " 差值:" & (base_fee - temp) Me.Cells(current_cus_header_row, adjustable_col).Value = base_fee - temp End Sub
关键调整说明
- 新增了客户头部行记录变量,计算完成后直接将差值写入对应行的可调列,符合业务需求
- 输出和写入逻辑仅在遇到下一个客户ID和遍历全部结束两个节点触发,每个客户仅输出一次最终结果
- 补充了变量声明规范,避免隐式变量带来的运行异常
运行输出示例
对应你提供的测试数据,运行后输出结果如下:
客户ID:70 标注总价:1578 子项求和:1579 差值:-1 客户ID:40 标注总价:1370 子项求和:1370 差值:0
差值会自动填充到对应客户行的Adjustable列中。
内容的提问来源于stack exchange,提问作者Virat
相关产品推荐
相关产品推荐

