ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用vba代码提取指定列内容生成总表及分项表?

如何用vba代码提取指定列内容生成总表及分项表?

作者:绿色风 分类: 时间:2022-08-17 浏览:183
楼主
kevinchengcw
Q: 如何用vba代码提取指定列内容生成总表及分项表?
A: 实现代码如下:
  1. Sub test()
  2. Dim Rule, Arr, Arrt, Result, N&, I&, T&, A&, Dic As Object, Str$
  3. Rule = Split("CWB_CWB_NO,CWB_SVCE_TYP_CD,CWB_TOTAL_WT_KG,CWB_TOTAL_VOL_WT_UT_KG,CWBTR_FRCHRG_DUTY_BILL_TYP,CWBDU_FRCHRG_DUTY_BILL_TYP,CCHG_TR_CURR_CD,CCHG_TR_AMT,MAWB_NO,CWB_DST_STA_CD", ",")   '拆分生成指定列数组
  4. Set Dic = CreateObject("scripting.dictionary")   '创建字典项目
  5. For N = LBound(Rule) To UBound(Rule)   '将列标题装入字典中以代替循环判断
  6.     Dic(Rule(N)) = ""
  7. Next N
  8. With ActiveSheet
  9.     Arr = .UsedRange.Value  '提取活动工作表使用区数据
  10. End With
  11. ReDim Result(LBound(Arr) To UBound(Arr), 1 To UBound(Rule) + 1)  '根据提取到的数据定义结果数组
  12. T = 0: A = 0  '初始化数组列号记录及拆分列号记录
  13. For N = LBound(Arr, 2) To UBound(Arr, 2)  '循环源数据数组列
  14.     Str = Trim(Arr(1, N))  '取得列标题
  15.     If Dic.exists(Str) Then  '如果存在该字典项,则
  16.         T = T + 1  '列号加1
  17.         For I = LBound(Arr) To UBound(Arr)  '将源数据当前列内容写入对应的结果数组列中
  18.             Result(I, T) = Arr(I, N)
  19.         Next I
  20.     If Str = "CWB_DST_STA_CD" Then A = T   '如果是标题是拆分列的标题,则记录下在结果数组中的列号
  21.     End If
  22. Next N
  23. Dic.RemoveAll  '清空字典项目
  24. T = Application.SheetsInNewWorkbook  '提取新建工作簿中的工作表数量当前值
  25. Application.SheetsInNewWorkbook = 1  '设定新建工作簿中工作表数量为1
  26. With Workbooks.Add  '添加新工作簿
  27.     Application.SheetsInNewWorkbook = T   '恢复原新建工作簿中的工作表数量值
  28.     With .ActiveSheet  '向新添加的工作簿的活动工作表写入数据
  29.         .[a1].Resize(UBound(Result), UBound(Result, 2)).Value = Result  '写入结果数组数据
  30.         .Columns.AutoFit  '列宽自适应
  31.         .Name = "Total"   '表名命名为Total
  32.     End With
  33.     If A > 0 Then  '如果存在需拆分的关键列,则
  34.         For N = LBound(Result) + 1 To UBound(Result)  '循环结果数组中除标题外的各行
  35.             Str = Trim(Result(N, A))   '提取当前行对应的关键列值
  36.             If Dic.exists(Str) Then  '如果已存在该字典项,则
  37.                 Arr = Dic(Str)  '提取出字典ITEM对应的数组
  38.                 Arr(Arr(0) + 1) = N  '数组第一位记录总记录数的下一单元的值记录当前行号
  39.                 Arr(0) = Arr(0) + 1  '数组总记录数加1
  40.             Else  '不存在该字典项,则
  41.                 ReDim Arr(0 To UBound(Result))  '重定义比结果数组总行数多1项的一维数组,数组第一项用来记录总记录数
  42.                 Arr(0) = 1  '总记录数初始为1
  43.                 Arr(1) = N  '记录下对应的行号
  44.             End If
  45.             Dic(Str) = Arr  '数组写回字典对应项
  46.         Next N
  47.         Arr = Dic.keys  '提取字典keys
  48.         For N = LBound(Arr) To UBound(Arr)  '循环各个key
  49.             With Worksheets.Add(, Worksheets(Worksheets.Count))   '在全部工作表后添加新工作表
  50.                 .Name = Arr(N)   '依key值命名
  51.                 Rule = Dic(Arr(N))  '提取储存行号的数组
  52.                 ReDim Arrt(1 To Rule(0) + 1, LBound(Result, 2) To UBound(Result, 2))  '重定义保存结果的数组,行数加1用来写标题行
  53.                 For T = LBound(Result, 2) To UBound(Result, 2)  '循环写入标题行
  54.                     Arrt(1, T) = Result(1, T)
  55.                 Next T
  56.                 For I = 1 To Rule(0)  '循环储存行号的数组中的有效项
  57.                     For T = LBound(Result, 2) To UBound(Result, 2)  '提取对应行的数据到结果数组中
  58.                         Arrt(I + 1, T) = Result(Rule(I), T)
  59.                     Next T
  60.                 Next I
  61.                 .[a1].Resize(UBound(Arrt), UBound(Arrt, 2)).Value = Arrt   '向添加的分项工作表中写入数据
  62.                 .Columns.AutoFit  '列宽自适应
  63.             End With
  64.         Next N
  65.     End If
  66.     .SaveAs ThisWorkbook.Path & "\Result", ThisWorkbook.FileFormat  '将工作簿保存为当前工作簿目录下,命名为Result,文件格式与当前工作簿相同
  67.     .Close False  '关闭工作簿
  68. End With
  69. Set Dic = Nothing  '清空字典项目
  70. End Sub
详见附件及素材源帖.


范例.rar
2楼
后知
太复杂了 这个帖子需要在学习几遍               
3楼
zhouzhongchi
数据源能简单点就好了,英文的头大呀。不知道是干嘛的。
4楼
icenotcool


5楼
kszcs
版主,原帖在哪?
6楼
老糊涂
下载学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap