Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 8772|回复: 10

[已解决]如何用VBA代替SUMPRODUCT函数

[复制链接]
发表于 2014-12-19 10:30 | 显示全部楼层 |阅读模式
想用VBA代替SUMPRODUCT筛选求和,最好可以满足筛选条件的增加、减少,见附件E列。
求大神指点,
谢谢!

求助.rar (2.07 KB, 下载次数: 34)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-12-19 11:37 | 显示全部楼层
Sub test()
    Dim A, B, d, i&, j%, t$, s&
    A = Sheet1.Range("a1").CurrentRegion
    ReDim B(1 To UBound(A), 1 To UBound(A, 2))
    Set d = CreateObject("scripting.dictionary")
    For i = 2 To UBound(A)
        '关键字
        t = ""
        For j = 1 To 4
            t = t & A(i, j) & ","
        Next j
        '统计
        If d.exists(t) Then
            B(d(t), UBound(B, 2)) = B(d(t), UBound(B, 2)) + A(i, UBound(B, 2))
        Else
            s = s + 1
            d(t) = s
            For j = 1 To UBound(B, 2)
                B(s, j) = A(i, j)
            Next j
        End If
    Next i
    Sheet2.Activate
    Range("a1").CurrentRegion = ""
    Range("a1").Resize(1, UBound(A, 2)) = Application.Index(A, 1, 0)
    Range("a2").Resize(UBound(B), UBound(B, 2)) = B
End Sub
求助2.rar (10.88 KB, 下载次数: 47)
回复

使用道具 举报

 楼主| 发表于 2014-12-19 13:23 | 显示全部楼层
爱疯 发表于 2014-12-19 11:37
Sub test()
    Dim A, B, d, i&, j%, t$, s&
    A = Sheet1.Range("a1").CurrentRegion

谢谢!
能否有办法在插入一列或者多列条件后,仍然使VBA有用。
即,
我在新附件中插入一列F列后,运算结果仍然是没插入F列之前的结果,能否满足在插入新条件后仍保证运算正确?
感激不尽。
求助2 - 副本.rar (10.61 KB, 下载次数: 8)
回复

使用道具 举报

发表于 2014-12-19 13:28 | 显示全部楼层
插入F列后,结果哪儿不对?标记一下看看
回复

使用道具 举报

发表于 2014-12-19 13:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2014-12-19 13:34 | 显示全部楼层
爱疯 发表于 2014-12-19 13:28
插入F列后,结果哪儿不对?标记一下看看

标红区域.rar (10.73 KB, 下载次数: 9)
回复

使用道具 举报

发表于 2014-12-19 13:37 | 显示全部楼层
不明白为什么g2应该是5,而且还多出了第14行
回复

使用道具 举报

 楼主| 发表于 2014-12-19 13:57 | 显示全部楼层
爱疯 发表于 2014-12-19 13:37
不明白为什么g2应该是5,而且还多出了第14行

因为F2单元格是“。”不是“.”
回复

使用道具 举报

发表于 2014-12-19 14:06 | 显示全部楼层    本楼为最佳答案   
Sub test()
    Dim A, B, d, i&, j%, t$, s&
    A = Sheet1.Range("a1").CurrentRegion
    ReDim B(1 To UBound(A), 1 To UBound(A, 2))
    Set d = CreateObject("scripting.dictionary")
    For i = 2 To UBound(A)
        '关键字
        t = ""
        For j = 1 To UBound(A, 2) - 1
            t = t & A(i, j) & ","
        Next j
        '统计
        If d.exists(t) Then
            B(d(t), UBound(B, 2)) = B(d(t), UBound(B, 2)) + A(i, UBound(B, 2))
        Else
            s = s + 1
            d(t) = s
            For j = 1 To UBound(B, 2)
                B(s, j) = A(i, j)
            Next j
        End If
    Next i
    Sheet2.Activate
    Range("a1").CurrentRegion = ""
    Range("a1").Resize(1, UBound(A, 2)) = Application.Index(A, 1, 0)
    Range("a2").Resize(UBound(B), UBound(B, 2)) = B
End Sub

求助3 - 副本.rar (10.56 KB, 下载次数: 164)
回复

使用道具 举报

 楼主| 发表于 2014-12-19 14:19 | 显示全部楼层
爱疯 发表于 2014-12-19 14:06
Sub test()
    Dim A, B, d, i&, j%, t$, s&
    A = Sheet1.Range("a1").CurrentRegion

对了!师傅好厉害。
但能不能把14行自动弹出、删除的功能去掉?
因为有时候并不是数据源的所有项都要体现在主表中。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 04:44 , Processed in 1.059479 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表