ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 字典嵌套应用一例——拆分数据到分表

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-2-3 21:17 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数组集合和字典
本帖最后由 zhaogang1960 于 2013-2-18 22:36 编辑

前几日回复了一个问题,按照“营业厅”字段,将“辅助列”数据拆分数据到分表,要求按照“科目名称”中的一级、二级科目和分表中的“辅助列”对齐。原题目如下:
将原始数据表中的辅助列的数字,分别填到对应的分表大东,大东一,大东二中,原始数据科目名称要和分表中的辅助列明细相对应,月份也需要对应
http://club.excelhome.net/thread-977947-5-1.html

下面采用字典嵌套拆分,希望能对相似题目有指导作用:
  1. Sub Macro1()
  2.     Dim d As Object, ds As Object, sh As Worksheet, a, arr, brr, i&, j&, l&, s$, t, temp$
  3.     Set d = CreateObject("scripting.dictionary") '创建字典对象
  4.     arr = Sheets("原始数据").Range("A1").CurrentRegion '数据写入数组
  5.     For i = 2 To UBound(arr) '逐列数据
  6.         If Len(arr(i, 2)) Then '如果营业厅列不为空
  7.             If Not d.Exists(arr(i, 2)) Then Set d(arr(i, 2)) = CreateObject("scripting.dictionary") '创建该营业厅字典对象
  8.             If Len(arr(i, 3)) = 4 Then '如果科目编码为4位数,即为一级科目
  9.                 d(arr(i, 2))(arr(i, 4)) = d(arr(i, 2))(arr(i, 4)) & "," & i '一级科目对应的“科目名称”添加到字典键值,即字典记住行号
  10.                 temp = arr(i, 4) '一级科目对应的“科目名称”
  11.             Else '二级科目
  12.                 d(arr(i, 2))(temp & Chr(9) & arr(i, 4)) = d(arr(i, 2))(temp & Chr(9) & arr(i, 4)) & "," & i   ''一级科目对应的“科目名称”和二级科目连接后添加到字典键值,字典记住行号
  13.             End If
  14.         End If
  15.     Next
  16.     k = d.Keys '字典键值写入数组k,即不重复的营业厅
  17.     On Error Resume Next '避免不重复的营业厅对应的工作表不存在时出错提示
  18.     For l = 0 To d.Count - 1 '逐个营业厅
  19.         Set sh = Sheets(k(l)) '把该营业厅工作表赋值给变量sh
  20.         If Not sh Is Nothing Then '
  21.             Set ds = d(k(l)) 'ds是个临时变量,代表该营业厅的字典对象,为了书写方便
  22.             With sh.Range("A3").CurrentRegion '分表数据区域
  23.                 .Offset(1, 3).ClearContents '清除原数据
  24.                 brr = .Value '写入数组
  25.                 For i = 2 To UBound(brr) '逐行
  26.                     If Len(brr(i, 1)) Then '如果第一列不为空,即为一级科目
  27.                         s = brr(i, 1) '临时变量记住一级科目
  28.                         temp = s '同上
  29.                     Else '二级科目
  30.                         s = temp & Chr(9) & brr(i, 3)  '一级科目连接二级科目
  31.                     End If
  32.                     t = ds(s) '字典条目
  33.                     If t <> "" Then '字典存在
  34.                         a = Split(t, ",") '拆分行号
  35.                         For j = 1 To UBound(a) '逐个行号
  36.                             brr(i, arr(a(j), 1) + 3) = arr(a(j), 7) '月份对应的列写入辅助列数值
  37.                         Next
  38.                     End If
  39.                 Next
  40.                 .Value = brr '处理后的数组写回数据区域
  41.             End With
  42.         End If
  43.     Next
  44. End Sub
复制代码

字典套字典按照营业厅将一级项目和二级项目拆分到分表.rar (24.84 KB, 下载次数: 1578)


该贴已经同步到 zhaogang1960的微博

评分

11

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-4 01:28 | 显示全部楼层
本帖最后由 liuyuyu880210 于 2013-2-4 01:31 编辑

又学习了,谢谢赵老师,正是我需要的,手里正好有这样的工作啊   谢谢啊

TA的精华主题

TA的得分主题

发表于 2013-2-4 03:11 | 显示全部楼层
谢谢了,下载收藏,学习领会。

TA的精华主题

TA的得分主题

发表于 2013-2-4 08:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-18 22:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
版主,用了一下,不对,机场发货费、机场提货费怎么都与一级科目的金额相同了?1月、2月均如此,请版主检查一下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-18 22:34 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-2-18 22:38 编辑
cqcbc 发表于 2013-2-18 22:21
版主,用了一下,不对,机场发货费、机场提货费怎么都与一级科目的金额相同了?1月、2月均如此,请版主检查一下 ...


谢谢提醒,没有考虑各分表辅助列空单元格的影响,加一个分隔符Chr(9):

  1. d(arr(i, 2))(temp & Chr(9) & arr(i, 4)) = d(arr(i, 2))(temp & Chr(9) & arr(i, 4)) & "," & i

  2. s = temp & Chr(9) & brr(i, 3)
复制代码
1楼代码和附件已经更新

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-18 22:51 | 显示全部楼层
新加功能:

各分表中每个科目占用2列,其中第二列为所占比例,计算公式为:
公式为
=E5/$D$4
=E6/$D$4
=E7$D$4
=E8/$D$4
.....................以此类推
字典套字典按照营业厅将一级项目和二级项目拆分到分表(扩展)—计算所占比例.rar (75.68 KB, 下载次数: 433)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-2-20 12:00 | 显示全部楼层
不错,再次请问:如果要拆分1-12月的数据,如何修改代码,谢谢.

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-2-20 12:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cqcbc 发表于 2013-2-20 12:00
不错,再次请问:如果要拆分1-12月的数据,如何修改代码,谢谢.

本例不同于一般拆分,需要把分表做好——即向分表拆分数据

TA的精华主题

TA的得分主题

发表于 2013-2-20 14:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
赵老师这字典 数组用的真是牛~
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 01:12 , Processed in 0.048609 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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