ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 38719|回复: 69

[总结]VBA中多条件求和中SUMPRODUCT问题

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-1-19 16:36 | 显示全部楼层 |阅读模式

       我们知道在EXCEL中多条件求和可以使用sumproduct公式求值,但在VBA中使用
Application.WorksheetFunction.SumProduct,却提示类型不匹配,似乎VBA就不支持此写法,经过多方收集,总结至少可以使用以下六种来替代求解,达到多条件求和的目的。

年份类型售价 2006年A型总售价
2006A1000公式结果:1950
2006B1200
2006C1100
2006A950VBA方法一:1950
2007A1050VBA方法二:1950
2007B1050VBA方法三:1950
2008C1200VBA方法四:1950
VBA方法五:1950
VBA方法六:1950

       如上为表格数据:我们想求得2006年A型总售价,在EXCEL中可以使用公式:=SUMPRODUCT((A2:A8=2006)*(B2:B8="A")*(C2:C8))解得。

VBA中解法如下:

'VBA方法一---利用EXCEL公式法:
Sub breezy_method_1()
    Range("E5").Formula = "=SumProduct((A2:A8=2006)*(B2:B8=""A"")*(C2:C8))"
    '加入以下这句可实现公式转化为值
    'Range("E5") = Range("E5").Value
End Sub


'VBA方法二---直接利用公式求值:
Sub breezy_method_2()
    Range("E6").Value = [SumProduct((A2:A8 = 2006) * (B2:B8 = "A") * (C2:C8))]
End Sub


'VBA方法三---利用Evaluate求值:
Sub breezy_method_3()
    Range("E7").Value = Evaluate("SumProduct((A2:A8=2006)*(B2:B8=""A"")*(C2:C8))")
End Sub


'VBA方法四---SQL查询求值:
Sub breezy_method_4()
    Dim SQL As String
    Set xx = CreateObject("adodb.connection")
   
    slastline = [a65536].End(xlUp).Row

    xx.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
    SQL = "select sum(售价) from [Sheet1$] where 年份=2006 and 类型=""A"""
   
    Set yy = xx.Execute(SQL)
    'MsgBox yy.fields(0)
   
    Range("E8").CopyFromRecordset yy
   
    Set yy = Nothing
    Set xx = Nothing
End Sub


'VBA方法五---数组循环求值:
Sub breezy_method_5()
    Dim aw
    Dim i%, aCount%, iRow$, s1%, s2$
    aCount = 0
    s1 = 2006
    s2 = "A"
    iRow = Range("A65536").End(xlUp).Row
    aw = Cells(2, 1).Resize(iRow - 1, 3)
    For i = 1 To iRow - 1
        If aw(i, 1) = s1 And aw(i, 2) = s2 Then
            aCount = aCount + aw(i, 3)
        End If
    Next i
   
    Range("E9") = aCount
End Sub


'VBA方法六---单元格循环求值:
Sub breezy_method_6()
    Dim i%, aCount%, iRow$, s1%, s2$
    aCount = 0
    s1 = 2006
    s2 = "A"
    iRow = Range("A65536").End(xlUp).Row
    For i = 2 To iRow - 1
        If Cells(i, 1) = s1 And Cells(i, 2) = s2 Then
            aCount = aCount + Cells(i, 3)
        End If
    Next i
   
    Range("E10") = aCount
End Sub

PS:第一次在『 Excel 程序开发 』 版发主题贴,还望诸位GG、JJ、DD、MM不吝赐教,欢迎大家交流讨论,跟贴支持,小弟谢过!~

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-19 16:48 | 显示全部楼层

附件如下:

monWTX1G.rar (9.32 KB, 下载次数: 1169)


TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-19 17:32 | 显示全部楼层

再来一法。

'VBA方法七---利用自动筛选求解:
Sub breezy_method_7()
    With Cells
        .AutoFilter Field:=1, Criteria1:="2006"
        .AutoFilter Field:=2, Criteria1:="A"
        .Range("E11") = Application.WorksheetFunction.Subtotal(9, .Range("C:C"))
        .AutoFilter
    End With
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2007-1-22 09:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢breezy分享

TA的精华主题

TA的得分主题

发表于 2007-1-22 09:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-22 13:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很不错!谢谢分享!

TA的精华主题

TA的得分主题

发表于 2007-1-22 13:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-22 13:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-23 22:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-1-24 00:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢breezy朋友,分享,收藏了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 05:35 , Processed in 0.041427 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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