ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > [菜鸟笔记]用字典汇总一例

[菜鸟笔记]用字典汇总一例

作者:绿色风 分类: 时间:2022-08-18 浏览:89
楼主
wjc2090742
要求:根据字段4、字段8,两者都相同的,汇总其字段7,并将page1表更新为汇总结果,然后将page1表、附件表拷贝到新工作簿,生成指定名称问题,并隐藏本表中page1、附件表俩表。
第一次写注释,写个菜鸟笔记,留个纪念,高手莫笑。速度方面就不要太跟我计较了哈
  1. Sub tt()
  2. t = Timer: m = 0                                                            't用做计时,如果不需要知道程序运行时间,可删。初始化m,用于下面的ar,可放到下面
  3. Application.ScreenUpdating = False                                          '关闭屏幕刷新
  4. Application.DisplayAlerts = False                                           '关闭提示框,因为生成的文件有可能原来已存在,关闭后可以直接覆盖
  5. Dim N%                                                                      '定义N为短整,用于工作表计数
  6. For N = Sheets.Count To 1 Step -1                                           '因为要删除page1表,此处反向循环。step -1表示步长为-1
  7.     Sheets(N).Visible = True                                                '取消各表的隐藏
  8.     If Sheets(N).Name = "Page1" Then Sheets(N).Delete                       '删除原page1表,与原代码不同处。因为数量大时,整表数据复制会占据较多时间
  9. Next
  10. Dim arr(), ar(), i&, di, dic, s$, str$                                      '定义相关变量。arr用于装sheet1中所有数据,ar用于装汇总后数据
  11. Set di = CreateObject("Scripting.Dictionary")                               '创建字典,属后期绑定
  12. Set dic = CreateObject("Scripting.Dictionary")                              '与上同。用2个字典,不好处是多了一个对象,好处是后期不用循环arr
  13. arr() = [a1].CurrentRegion.Value                                            '给arr赋值。currentregion表示当前区域,即10版中选中a1,按ctrl+a选中区域
  14. For i = 1 To UBound(arr, 1)                                                 '在arr中循环,i计数,ubound为数组上标,ubound中,1表示行上标,如果要表示列上标用2
  15.     s = arr(i, 4) & arr(i, 8)                                               '将字段4、8连接为一个字符串s,用作di、dic的key
  16.     If Not di.exists(s) Then                                                'exists方法,判断字典di中指定的关键字是否存在,存在返回true。not取反
  17.         di.Add s, arr(i, 7)                                                 '如果不存在,则di添加s为新key,对应item为字段7
  18.         str = ""                                                            '初始化str
  19.         For j = 1 To 8
  20.             str = str & "★" & arr(i, j)                                    '将字段1-8连接为1个字符串str,用作dic的item,中用某种符号隔开,对应下面split分解
  21.         Next
  22.         dic.Add s, str                                                      'dic添加s为新key,对应item为str,dic与di有同样的key
  23.     Else                                                                    '上句写在di中不存在s关键字条件下,因为只需要保留s第一次出现时的各字段内容
  24.         di(s) = di(s) + arr(i, 7)                                           '当s关键字已存在,di中对应item累加字段7值
  25.     End If
  26. Next
  27. For Each k In di.keys                                                       '循环di中的key
  28.     m = m + 1                                                               '每循环一个key,m都+1,用作ar的第二维上标
  29.     ReDim Preserve ar(1 To 8, 1 To m)                                       '重定义ar,能重定义的只有数组最后一维,preserve表示重定义时保留原有数据
  30.     kk = Split(dic(k), "★")                                                'split按照特定符号拆分dic中item为下标为0的一维数组
  31.     For j = 1 To 8                                                          '循环,将split得到的字段1-8以及di中的item装入ar,此处至下面也可以1-8一行一行来写
  32.         If j = 4 Then
  33.             If Val(kk(j)) Then                                              'val返回包含于字符串内的数字,如val("26dbd598")返回26598,判断字段4是否含有数字
  34.                 ar(j, m) = "‘" & kk(j)                                     '为了验证,这里用中文半角单引,用时可以自己修改
  35.             Else: ar(j, m) = kk(j)                                          '如果不含有数字,则不加半引
  36.             End If
  37.         ElseIf j = 7 Then ar(7, m) = di(k)                                  'j=7时,即字段7,从di的item取值
  38.         Else: ar(j, m) = kk(j)                                              'kk是一个一维数组,通过循环,将其装入ar中
  39.         End If
  40.     Next
  41. Next
  42. Set di = Nothing: Set dic = Nothing                                         '清除字典,释放内存
  43. ActiveWorkbook.Sheets.Add                                                   '与上面删除page1表对应,sheets.add方法增加新工作表
  44. With ActiveSheet
  45.     .Name = "Page1"                                                         '新表默认名为sheetN,设置name属性,自定义工作表名
  46.     .[a1].Resize(UBound(ar, 2), 8) = WorksheetFunction.Transpose(ar)        '将ar填入page1表中,调用工作表函数transpose转置ar
  47. End With
  48. With Workbooks.Add(xlWBATWorksheet)                                         '创建新工作簿,括号中为XlWBATemplate常量,这里用的值表示创建的是工作表
  49.     ThisWorkbook.Sheets(Array("Page1", "附件表")).Copy After:=.Sheets(1)    '将本工作簿中page1、附件表拷贝到新创建表中,位置在第1个表之后
  50.     .Sheets(1).Delete                                                       '删除第1个工作表
  51.     .SaveAs Filename:=ThisWorkbook.Path & "\导入标准凭证.xls"               '另存为本工作簿所在目录下,名称为...的新文件
  52.     .Close                                                                  '关闭新建工作簿
  53. End With
  54. For N = Sheets.Count To 1 Step -1
  55.     If Sheets(N).Name <> "Sheet1" Then Sheets(N).Visible = xlSheetHidden    '隐藏除sheet1之外的其它工作表
  56. Next
  57. Application.DisplayAlerts = True                                            '恢复提示框弹出设置,此处2句与上面关闭对应
  58. Application.ScreenUpdating = True                                           '恢复屏幕刷新
  59. MsgBox "程序运行完成!" & Chr(10) & "全程历时:" & Timer - t & "秒!" & Chr(10)
  60. End Sub

bb.rar
2楼
纵鹤擒龙水中月
学习了
3楼
kangguowei
这么长.

免责声明

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

评论列表
sitemap