ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 有关字典嵌套数据汇总问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-9 10:55 | 显示全部楼层 |阅读模式
老师:

我想学习字典嵌套方法。通过字典嵌套汇总数据。代码如下:

Sub 字典嵌套数据汇总()

Set psht1 = Sheets("原始数据")
Set psht2 = Sheets("数据汇总")

psht1.Select
phj = psht1.Range("A:A").Cells.Find("合计").Row
'数组应包括标题行标题列
arr = psht1.Range("a1:E" & phj - 1)
'以项目序号定义父字典
Set Dic = CreateObject("scripting.dictionary")
'再以项目序号关键字创建子字典
For xhxh = 2 To UBound(arr, 1)
    If Not Dic.Exists(arr(xhxh, 1)) Then
        Set Dic(arr(xhxh, 1)) = CreateObject("scripting.dictionary")
    End If
    '通过字典获取不重名项目序号
    Dic(arr(xhxh, 1)) = ""
Next
'利用字典嵌套多列求和
'第1行为标题行
For xhxh1 = 2 To UBound(arr, 1)
    '第1、第2列为项目序号、名称,不求和
    For xhxh2 = 1 To UBound(arr, 2) - 2
        Dic(arr(xhxh1, 1))(arr(1, xhxh2 + 1)) = Dic(arr(xhxh1, 1))(arr(1, xhxh2 + 1)) + arr(xhxh1, xhxh2 + 1)
    Next
Next
psht2.Select
prwb = psht2.UsedRange.Rows.Count
Range("a2").Resize(Dic.Count, 1) = Application.Transpose(Dic.keys)
'利用字典嵌套填入求和数据
'第1行为标题行
For xhxh1 = 2 To prwb - 1
    '第1、第2列为项目序号、名称,不求和
    For xhxh2 = 2 To UBound(arr, 2)
        Cells(xhxh1 + 2, xhxh2 + 1) = Dic(Cells(xhxh1 + 1, 1))(Cells(1, xhxh2 + 1))
    Next
Next
End Sub


标为红色的语句 浮标提示  “类型不匹配”
将此句修改为:Dic(arr(xhxh1, 1).Value)(arr(1, xhxh2 + 1)) = Dic(arr(xhxh1, 1).Value)(arr(1, xhxh2 + 1)) + arr(xhxh1, xhxh2 + 1)后
浮标提示  “要求对象”

请老师,帮看看,指导,谢谢 字典嵌套数据汇总.zip (17.12 KB, 下载次数: 25)


TA的精华主题

TA的得分主题

发表于 2024-5-9 12:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
字典的例子:
2024-5-9字典.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-9 12:48 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-9 13:56 | 显示全部楼层
感谢蓝桥玄霜老师!感谢taller老师!向两位老师致敬!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-9 14:31 | 显示全部楼层
taller老师
您的代码,帮我实现了目标,也找到了标红语句 类型不匹配 的原因是多了以下 这句
dic(arr(xhxh, 1)) = ""  
去掉这句,问题消除了。
原本我想通过这一语句,获取表中序号列序号唯一值,填入表2。而这一目标通过以下语句实现
dic(arr(xhxh1, 1))(arr(1, xhxh2)) = dic(arr(xhxh1, 1))(arr(1, xhxh2)) + arr(xhxh1, xhxh2)
Range("a2").Resize(dic.Count, 1) = Application.Transpose(dic.keys)

dic(arr(xhxh, 1)) = ""  这句是多余的

请教taller 老师,为何多了这句,导致 dic(arr(xhxh1, 1))(arr(1, xhxh2)) = dic(arr(xhxh1, 1))(arr(1, xhxh2)) + arr(xhxh1, xhxh2) 这句出现类型不匹配错误。

谢谢taller老师!

TA的精华主题

TA的得分主题

发表于 2024-5-9 15:08 | 显示全部楼层
本帖最后由 ykcbf1100 于 2024-5-9 15:12 编辑

参与一下,一个字典

字典嵌套数据汇总.7z

20.86 KB, 下载次数: 19

TA的精华主题

TA的得分主题

发表于 2024-5-9 15:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
参与一下。。。

  1. Sub ykcbf()   '//2024.5.9
  2.     Dim arr, brr, d
  3.     Application.ScreenUpdating = False
  4.     Set d = CreateObject("scripting.dictionary")
  5.     With Sheets("原始数据")
  6.         r = .Cells(Rows.Count, 1).End(3).Row
  7.         arr = .[a1].Resize(r, 5)
  8.     End With
  9.     ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2) + 1)
  10.     For i = 2 To UBound(arr) - 1
  11.         s = arr(i, 1)
  12.         If Not d.Exists(s) Then
  13.             m = m + 1
  14.             d(s) = m
  15.             brr(m, 1) = s
  16.             For j = 2 To UBound(arr, 2)
  17.                 brr(m, j) = arr(i, j)
  18.             Next
  19.         Else
  20.             r = d(s)
  21.             For x = 2 To UBound(arr, 2)
  22.                 brr(r, x) = brr(r, x) + arr(i, x)
  23.             Next
  24.         End If
  25.     Next
  26.     With Sheets("数据汇总")
  27.         .UsedRange.Offset(1) = ""
  28.         .Range("a2").Resize(m, 6) = brr
  29.         .Range("a1").Resize(m + 2, 6).Borders.LineStyle = 1
  30.         r = .Cells(Rows.Count, 1).End(3).Row
  31.         For i = 2 To m + 1
  32.             For j = 2 To 5
  33.                 .Cells(i, 6) = Application.WorksheetFunction.Sum(.Cells(i, 2).Resize(1, 4))
  34.             Next
  35.         Next
  36.         .Cells(r + 1, 1) = "合计"
  37.         .Cells(r + 1, 2).Resize(1, 5).FormulaR1C1 = "=SUM(R2C:R" & "[-1]C)"
  38.     End With
  39.     Set d = Nothing
  40.     Application.ScreenUpdating = True
  41.     MsgBox "OK!"
  42. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-9 15:29 | 显示全部楼层
一个字典,写法2,全表自动生成。

{295156A2-361C-420d-9480-20D4DB194DA6}.png

字典嵌套数据汇总2.7z

21.79 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2024-5-9 15:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
参与一下。。。

  1. Sub ykcbf2()  '//2024.5.9   全表自动生成
  2.     Dim arr, brr, d
  3.     Application.ScreenUpdating = False
  4.     Application.DisplayAlerts = False
  5.     Set d = CreateObject("scripting.dictionary")
  6.     With Sheets("原始数据")
  7.         r = .Cells(Rows.Count, 2).End(3).Row
  8.         arr = .Range("a1").Resize(r, 5)
  9.     End With
  10.     ReDim brr(1 To UBound(arr), 1 To 100)
  11.     brr(1, 1) = arr(1, 1)
  12.     m = 1: n = 1
  13.     For i = 2 To UBound(arr) - 1
  14.         s = arr(i, 1)
  15.         If Not d.exists(s) Then
  16.             m = m + 1
  17.             d(s) = m
  18.             brr(m, 1) = s
  19.         End If
  20.         r = d(arr(i, 1))
  21.         For j = 2 To UBound(arr, 2)
  22.             s = arr(1, j)
  23.             If Not d.exists(s) Then
  24.                 n = n + 1
  25.                 d(s) = n
  26.                 brr(1, n) = arr(1, j)
  27.             End If
  28.             c = d(arr(1, j))
  29.             brr(r, c) = brr(r, c) + arr(i, j)
  30.         Next
  31.     Next
  32.     With Sheets("数据汇总")
  33.         .UsedRange.Clear
  34.         .[a1].Resize(1, n + 1).Interior.Color = 49407
  35.         .[a2].Resize(m - 1, 1).Interior.Color = 5296274
  36.         With .[a1].Resize(m + 1, n + 1)
  37.             .Value = brr
  38.             .Borders.LineStyle = 1
  39.             .HorizontalAlignment = xlCenter
  40.             .VerticalAlignment = xlCenter
  41.             With .Font
  42.                 .Name = "微软雅黑"
  43.                 .Size = 11
  44.             End With
  45.         End With
  46.         .Cells(1, n + 1) = "合计"
  47.         For i = 2 To m + 1
  48.             .Cells(i, n + 1) = Application.WorksheetFunction.Sum(.Cells(i, 2).Resize(1, 4))
  49.         Next
  50.         m = m + 1
  51.         .Cells(m, "a") = "合计"
  52.         .Cells(m, "b").Resize(1, n).FormulaR1C1 = "=SUM(R2C:R" & "[-1]C)"
  53.     End With
  54.     Set d = Nothing
  55.     MsgBox "OK!"
  56. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-5-9 17:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 shiruiqiang 于 2024-5-9 17:31 编辑

sql

image.jpg

字典嵌套数据汇总2.rar

18.63 KB, 下载次数: 12

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 13:25 , Processed in 0.043880 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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