ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA数组按开始结束日期 实现分类统计汇总

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-5-29 17:07 | 显示全部楼层 |阅读模式
本帖最后由 laoau128 于 2017-5-31 17:09 编辑

用VBA数组按开始结束日期   实现分类统计汇总

你改成这个就可以

你改成这个就可以.rar

12.78 KB, 下载次数: 21

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-30 18:17 | 显示全部楼层

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2017-5-31 21:54 | 显示全部楼层
用2个字典来做吧……

Sub lkyy()
Dim i%, j As Byte, s$, ar, br(), Star, Last
Set d = CreateObject("Scripting.Dictionary")
Set dic = CreateObject("Scripting.Dictionary")
Star = Application.InputBox(Prompt:="输入开始日期", Type:=1)
Last = Application.InputBox(Prompt:="输入结束日期", Type:=1)
If Star > Last Then MsgBox "开始日期比结束日期大,你玩我啊?", 0, "提示"
ar = Range("a1").CurrentRegion
ReDim br(1 To UBound(ar), 1 To 3)
For i = 2 To UBound(ar)
    If ar(i, 1) >= Star And ar(i, 1) <= Last Then
        d(ar(i, 2)) = d(ar(i, 2)) + ar(i, 4)
        dic(ar(i, 2) & "," & ar(i, 3)) = dic(ar(i, 2) & "," & ar(i, 3)) + ar(i, 4)
    End If
Next
If d.Count = 0 Then MsgBox "开始日期-结束日期不在A列日期区间中,请检查", 0, "提示"
For i = 0 To d.Count - 1
    n = n + 1
    br(n, 1) = d.keys()(i)
    br(n, 2) = d.items()(i)
    For j = 0 To dic.Count - 1
        If d.keys()(i) = Split(dic.keys()(j), ",")(0) Then s = s & Split(dic.keys()(j), ",")(1) & dic.items()(j) & ","
    Next
    br(n, 3) = s: s = ""
Next
Application.DisplayAlerts = False
Range("g13:L100").ClearContents
[g13] = Star
[g14] = Last
Range("h13").Resize(n, 3) = br
Range("j13").Resize(n).TextToColumns comma:=True
[h13].Offset(n, 0) = "合计"
[i13].Offset(n, 0).Formula = "=sum(i13:i" & 13 + n - 1 & ")"
Application.DisplayAlerts = True
End Sub

IgOjgd.zip

16.59 KB, 下载次数: 15

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-5-31 21:58 | 显示全部楼层
晕,又遇回复审核,请见附件

IgOjgd.zip

16.59 KB, 下载次数: 22

TA的精华主题

TA的得分主题

发表于 2017-5-31 23:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
再来一种方法


Sub lkyy2()
Dim i%, j As Byte, tol%, mx$, Star, Last, n As Byte, s$
Set d = CreateObject("Scripting.Dictionary")
Star = Application.InputBox(Prompt:="输入开始日期", Type:=1)
Last = Application.InputBox(Prompt:="输入结束日期", Type:=1)
If Star > Last Then MsgBox "开始日期比结束日期大,你玩我啊?", 0, "提示"
ar = Range("a1").CurrentRegion
ReDim br(1 To UBound(ar), 1 To 3)
For i = 2 To UBound(ar)
    Set d(ar(i, 2)) = CreateObject("Scripting.Dictionary")
Next
For i = 2 To UBound(ar)
    If ar(i, 1) >= Star And ar(i, 1) <= Last Then
        s = ar(i, 2)
        d(s)(ar(i, 3)) = d(s)(ar(i, 3)) + ar(i, 4)
    End If
Next
For i = 0 To d.Count - 1
    n = n + 1
    br(n, 1) = d.keys()(i)
    For j = 0 To d(d.keys()(i)).Count - 1
        mx = mx & d(d.keys()(i)).keys()(j) & d(d.keys()(i)).items()(j) & ","
        tol = tol + d(d.keys()(i)).items()(j)
    Next
    br(n, 2) = tol
    tol = 0
    br(n, 3) = mx
    mx = ""
Next
Application.DisplayAlerts = False
Range("g13:L100").ClearContents
[g13] = Star
[g14] = Last
Range("h13").Resize(n, 3) = br
Range("j13").Resize(n).TextToColumns comma:=True
[h13].Offset(n, 0) = "合计"
[i13].Offset(n, 0).Formula = "=sum(i13:i" & 13 + n - 1 & ")"
Application.DisplayAlerts = True
Set d = Nothing
End Sub

gh54fda.zip

15.83 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-10 13:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-6-10 15:43 | 显示全部楼层
  1. Sub yyy()
  2. Dim dx, dy, arr, i&, j&, k&, m&, n&, x&, y&, s2$, s3$, sz&, x1, y1
  3. Set dx = CreateObject("Scripting.Dictionary")
  4. Set dy = CreateObject("Scripting.Dictionary")
  5. arr = Range("a2", Cells(Rows.Count, 4).End(3)).Value
  6. x1 = Application.Min(Application.Index(arr, 0, 1))
  7. y1 = Application.Max(Application.Index(arr, 0, 1))
  8. x = Application.InputBox(Prompt:="输入开始日期", Default:=x1, Type:=1)
  9. y = Application.InputBox(Prompt:="输入结束日期", Default:=y1, Type:=1)
  10. If x > y Then MsgBox "开始日期比结束日期大,你玩我啊?", 0, "提示"
  11. ReDim brr(1 To UBound(arr) + 1, 1 To UBound(arr) + 2)
  12. brr(1, 1) = "开始-结束": brr(1, 2) = "姓名": brr(1, 3) = "销售额合计"
  13. brr(2, 1) = x: brr(3, 1) = y
  14. m = 1: n = 3
  15. For i = 1 To UBound(arr)
  16.   If arr(i, 1) >= x And arr(i, 1) <= y Then
  17.     s2 = arr(i, 2): s3 = arr(i, 3)
  18.     If Not dy.exists(s2) Then
  19.       m = m + 1
  20.       dy(s2) = m
  21.       brr(m, 2) = s2
  22.       brr(m, 3) = arr(i, 4)
  23.     Else
  24.       brr(dy(s2), 3) = brr(dy(s2), 3) + arr(i, 4)
  25.     End If
  26.     If Not dx.exists(s3) Then
  27.       n = n + 1
  28.       dx(s3) = n
  29.       brr(1, n) = s3
  30.     End If
  31.     brr(dy(s2), dx(s3)) = brr(dy(s2), dx(s3)) + arr(i, 4)
  32.     sz = sz + arr(i, 4)
  33.   End If
  34. Next
  35. brr(m + 1, 2) = "合计": brr(m + 1, 3) = sz
  36. With [G1]
  37.   .CurrentRegion.Borders.LineStyle = 0
  38.   .CurrentRegion.ClearContents
  39.   .Resize(m + 1, n) = brr
  40.   .Resize(m + 1, n).Borders.LineStyle = 1
  41. End With
  42. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2017-6-10 15:45 | 显示全部楼层
遇回复审核,请见附件       170610-你改成这个.rar (19.21 KB, 下载次数: 23)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-10 16:34 | 显示全部楼层
yaozong 发表于 2017-6-10 15:45
遇回复审核,请见附件

奇怪,你怎么挑困难题目来做,简单的题目你就不做了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 18:53 , Processed in 0.039959 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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