ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 想按照年度、月份生成报表,应该如何设置字典或数组?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-1-28 00:15 | 显示全部楼层 |阅读模式
有如下格式的数据:
原始数据.png
现在想按照任务单产生时间的年、月生成报表,报表格式如下:
报表格式.png
其中:没有批准人签字时间的就是“未出报告量 ”。
我现在想实现自动生成所有年份、月份的报表,并且自动引用上期数、自动计算年度累计数,自动填充“本月(2017/12/1-2017/12/31)”、“上月(2017/11/1-2017/11/30)”、“本年(2017/1/1-2017/12/31)”等表头数据。
系统于2016年5月7日,所以第一份报表的表头为:“本月(2016/5/7-2016/5/31)”,上月数为空,本年累计数为本月数。
以后每年第一月本年累计数取本月数(即第一月的数据),上月数取上一年12月的数据。

我先写了一段代码,实现了生成某月的“当月数”,但是在多月份、跨年度的处理上遇到了问题,不知道该用什么样的方式来设置字典或者数组?
先贴上我的初步代码,下一步想要再此代码之外加上年份月份的循环来实现上上述功能,请高手赐教。

  1. Sub count()
  2. '**********************************前期准备工作,创建字典,预先把所有报表部门写入字典备用*****************************
  3. With Sheets("报表模板")
  4.         lastrow = .Range("A" & .Rows.count).End(xlUp).Row - 2 '找到报表部门的最后一行
  5.         departmentarr = .Range("A7:A" & lastrow).Value '把所有部门赋值给数组
  6.         departmentnum = UBound(departmentarr) '部门数量
  7.     End With
  8.    
  9.     Set d = CreateObject("scripting.dictionary")
  10.     For i = 1 To departmentnum
  11.         dkey = departmentarr(i, 1)
  12.         keyvaluearr = Array(dkey, "", 0, 0) '字典键值是维度为4的数组:部门、空、产出的报告量、未产出的报告量
  13.         d(dkey) = keyvaluearr '先把所有报表部门写入字典,数据为空
  14.     Next
  15.    
  16. '*******************************************统计2017年12月份数据*******************************************
  17. With Sheets("台账")
  18.         '把原始数据写入数组
  19.         lastrow = .Range("A" & .Rows.count).End(xlUp).Row '定位最后一行
  20.         lastcol = .Cells(1, 1).End(xlToRight).Column '定位最后一列
  21.         arr = .Range(.Cells(1, 1), .Cells(lastrow, lastcol)).Value '把本月请假记录写入arr数组
  22.         
  23.         For i = 2 To lastrow '遍历所有数据
  24.             If year(taskcreatedtime) = 2017 And month(taskcreatedtime) = 12 Then '以2017年12月份数据为例
  25.                 department = arr(i, 1) '部门
  26.                 taskcreatedtime = arr(i, 2) '任务单产生时间
  27.                 approvedtime = arr(i, 3)  '无批准时间表示未出报告

  28.                 keyvaluearr = d(department)
  29.                 keyvaluearr(2) = keyvaluearr(2) + 1
  30.                 If approver = "" Then keyvaluearr(3) = keyvaluearr(3) + 1
  31.                 d(department) = keyvaluearr
  32.             End If
  33.         Next
  34.     End With
  35.         
  36. '*******************************************把统计结果写入报表*******************************************
  37.     Application.StatusBar = "正在写入统计结果……"
  38.     For Each sht In Worksheets
  39.         If sht.Name = "2017年12月报表" Then sht.Delete
  40.     Next
  41.    
  42.     Sheets("报表模板").Copy after:=Worksheets(Worksheets.count) '把模板拷贝一份
  43.     ActiveSheet.Name = "2017年12月报表"      '更改工作表名
  44.     With Sheets("2017年12月报表")
  45.         lastrow = d.count
  46.         .Range("A7").Resize(lastrow, 4).Value = Application.Transpose(Application.Transpose(d.items))
  47.     End With
  48. End Sub
复制代码



汇总表.rar (1.81 MB, 下载次数: 17)

TA的精华主题

TA的得分主题

发表于 2018-1-28 01:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
建议用SQL
月报用Month(xxx)=12
年报用Year(xxx)=2017
快、准、狠
:)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-28 07:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
码农熊 发表于 2018-1-28 01:25
建议用SQL
月报用Month(xxx)=12
年报用Year(xxx)=2017

谢谢回答。
为了能够让大家看起来更轻松,我把实际问题经过了简化处理。
实际情况是这样,汇总的时候某些部门是合并在一起汇总的。
举个例子:
龙岗部数据包括:龙岗部、坪山部、大亚湾。
特种部包括:特种部、特种二部。
所以用SQL可能会比较折腾。
我之前也一直在考虑使用SQL,现在想想,用SQL确实比较方便,计数、求和、最大最小值基本都不用写程序了,用一段查询语言就搞定。回头我试试看。

TA的精华主题

TA的得分主题

发表于 2018-1-28 10:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-1-28 14:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zorsite 发表于 2018-1-28 07:11
谢谢回答。
为了能够让大家看起来更轻松,我把实际问题经过了简化处理。
实际情况是这样,汇总的时候某 ...

部门     科室
龙岗部 龙岗
龙岗部 坪山
龙岗部 大亚湾
特种部 特种1
特种部 特种2
怎么会比较折腾,你取的名称就把自己给绕进去了。
按照这样的方式,可以按部门或者科室汇总都行,想怎么汇就怎么汇 :)

TA的精华主题

TA的得分主题

发表于 2018-1-28 15:31 | 显示全部楼层
zorsite 发表于 2018-1-28 07:11
谢谢回答。
为了能够让大家看起来更轻松,我把实际问题经过了简化处理。
实际情况是这样,汇总的时候某 ...

我写了个帖子和我简化处理的思路,也许不是你想要的:),抛砖引玉吧。

http://club.excelhome.net/thread-1394908-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-2 23:33 | 显示全部楼层
码农熊 发表于 2018-1-28 15:31
我写了个帖子和我简化处理的思路,也许不是你想要的:),抛砖引玉吧。

http://club.excelhome.net/th ...

我自己写了一段代码可以按年、月、部门汇总。代码如下:
  1. Sub SQL_Excel()
  2.     Dim cnn, SQL$
  3.     Set cnn = CreateObject("adodb.connection")
  4.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 12.0;HDR=yes';Data Source=" & ThisWorkbook.FullName
  5.     SQL = "SELECT year(任务单产生时间) ,month(任务单产生时间),所属部门,count(任务单产生时间) as 产生的报告量 ,count(批准人签字时间) as 已出报告量 FROM [台账$] group by 所属部门,year(任务单产生时间) ,month(任务单产生时间) order by year(任务单产生时间) ,month(任务单产生时间)"
  6.     Sheets("结果").Range("a2").CopyFromRecordset cnn.Execute(SQL)
  7.     cnn.Close
  8.     Set cnn = Nothing
  9. End Sub
复制代码

可是还有两个问题没解决:
1.报表中需要统计“未出报告量”,这个可以通过“count(批准人签字时间='')”来查询,但是我通过代码无法实现,也尝试了sum等方法,但都不成功。
2.在您的帖子中没有发现SQL语句,目前还是不知道如何把部分部门合并。请您指点一二。
汇总表.rar (1.82 MB, 下载次数: 6)

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

本版积分规则

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

GMT+8, 2024-12-4 16:52 , Processed in 0.053645 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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