ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 多条件求和

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-21 11:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

我用F8逐行遍历,第一个得出的也是0 ,不知道哪里出问题了C:\Users\10792\Desktop\QQ图片20171221110713.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-21 11:12 | 显示全部楼层
图片上传错误,,,附件在这里
QQ图片20171221110713.png

TA的精华主题

TA的得分主题

发表于 2017-12-21 11:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
leon小鱼 发表于 2017-12-21 11:12
图片上传错误,,,附件在这里

1.代码写在ThisWorkbook
2.检查你的“源数据”表,标题行应是这样的顺序
门店编号 门店名称 会计日期  产品编号 产品名称 吊牌价 数量 销售金额

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-21 12:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wangxml 发表于 2017-12-21 11:36
1.代码写在ThisWorkbook
2.检查你的“源数据”表,标题行应是这样的顺序
门店编号 门店名称 会计日期   ...

按照所有的都实验了,还是0,是否是日期的提取有问题?

TA的精华主题

TA的得分主题

发表于 2017-12-21 15:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请试用。使用方法是把鼠标放在你要求和的列(可多列一起计算,因为有时候请假什么的,某天没有计算,可以一次计算多天),运行代码即可。
Sub test()
Dim rng1 As Range, rng2 As Range, c As Range, c2 As Range
Set d = CreateObject("Scripting.Dictionary")
If Selection.Column < 6 Then Exit Sub
Set rng1 = Intersect(Range(Columns(Selection.Column), Columns(Selection.Column + Selection.Columns.Count - 1)), Range("1:1"))
Set rng2 = Range("c2:c" & Range("c" & Rows.Count).End(3).Row)
For Each c In rng1
    If c.Column = 6 Then dt = dt & "/" & CLng(CDate(Right(c, 10))) Else dt = dt & "/" & CLng(c)
Next
For Each c In rng2
    If Len(c) Then s = s & "/" & c
Next
arr = Sheet2.Range("a1").CurrentRegion
For i = 2 To UBound(arr)
    If InStr(s, arr(i, 1)) > 0 And InStr(dt, CLng(arr(i, 3))) > 0 Then
        d(arr(i, 1) & "/" & CLng(arr(i, 3))) = d(arr(i, 1) & "/" & CLng(arr(i, 3))) + arr(i, 7)
    End If
Next
For Each c In rng2
    For Each c2 In rng1
        If c2.Column = 6 Then k = c & "/" & CLng(CDate(Right(c2, 10))) Else k = c & "/" & CLng(c2)
        If d.exists(k) Then Cells(c.Row, c2.Column) = d(k) Else Cells(c.Row, c2.Column) = 0
    Next
Next
Set d = Nothing
End Sub



TA的精华主题

TA的得分主题

发表于 2017-12-21 15:24 | 显示全部楼层
本帖最后由 ivccav 于 2017-12-21 15:36 编辑

已核查,计算结果快速无误。因为日期格式不同,不好匹配,我全部转为长整型了( CLng),看代码时可注意。既然数据有40万行,就不适合使用公式了,而是应该每次都计算需要的日期即可。用VBA无疑是更好的选择
测试.zip (184.91 KB, 下载次数: 9)


TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-21 15:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ivccav 发表于 2017-12-21 15:24
已核查,计算结果快速无误。因为日期格式不同,不好匹配,我全部转为长整型了( CLng),看代码时可注意。( ...

测试过了,可以使用,有个BUG,,会把小计那一列也给求和了,因无匹配项,会导致出错,可有优化办法?

TA的精华主题

TA的得分主题

发表于 2017-12-21 18:02 | 显示全部楼层
leon小鱼 发表于 2017-12-21 15:52
测试过了,可以使用,有个BUG,,会把小计那一列也给求和了,因无匹配项,会导致出错,可有优化办法?

我知道“小计”会变成0,只是看到你小计行有sum公式,横着一拉就可以继续使用小计,我就懒得处理了。处理也很简单,加入2句话,就是在下面红色的代码中判断C列是否为空就行了。你说查询不到会报错?请截图告诉我。
For Each c In rng2
    if Len(c)>0 Then
    For Each c2 In rng1
        If c2.Column = 6 Then k = c & "/" & CLng(CDate(Right(c2, 10))) Else k = c & "/" & CLng(c2)
        If d.exists(k) Then Cells(c.Row, c2.Column) = d(k) Else Cells(c.Row, c2.Column) = 0
    Next
    End If
Next
Set d = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2017-12-21 18:22 | 显示全部楼层
本帖最后由 ivccav 于 2017-12-21 18:25 编辑

13楼提供的代码是固定了行数和列数的,没有考虑到扩展性(增加店数,增加日期等等)。我的代码是计算F列之后的任意列,而不限于G列到K列,行数也没有任何限制。因为楼主说数据源包含1年的数据,那报表应该是可以统计任意日期的,而不能限于G列到K列5天的查询,也不会仅仅是那几个店。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-22 09:09 | 显示全部楼层
ivccav 发表于 2017-12-21 18:02
我知道“小计”会变成0,只是看到你小计行有sum公式,横着一拉就可以继续使用小计,我就懒得处理了。处理 ...

如果店铺都存在,数据没错,如果有前面无法识别的店铺,会报错,提示类型不匹配。可否加QQ? 图片好像发不上
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 13:28 , Processed in 0.027021 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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