ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
123
返回列表 发新帖
楼主: lele400024

[求助] [特殊字典查询]根据数据源表中数据,在查询表对应行利用字典查询并插入行合并单元格

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-13 11:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1016373263 发表于 2020-10-11 00:21
考虑周全后代码量不会很少

之前一直不明白字典嵌套原理,谢谢老师您的指导,太感谢了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-13 12:23 | 显示全部楼层
1016373263 发表于 2020-10-11 00:21
考虑周全后代码量不会很少

老师,您好,照你的方法实施具体案例的时候,第一个重复字段合并后就一直出现如图这个问题,由于数据隐私的问题,不方便把数据传上来,能加你个QQ吗,谢谢 图片.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-13 12:37 | 显示全部楼层
1016373263 发表于 2020-10-11 00:21
考虑周全后代码量不会很少

老师,您好,实际数据运行过程中,存在一个问题,当查询表第二列名称中,劳务数据表不存在一一对应的名称,代码就会报错,不知道怎么修改这个代码呢。例如把下图中Z3改成Z2,就直接报错了。
图片.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-13 15:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1016373263 发表于 2020-10-11 00:21
考虑周全后代码量不会很少
  1. Private Sub CommandButton1_Click()
  2. Application.ScreenUpdating = False
  3. Dim d As Object, sht As Worksheet, arr, file As String, n%, k%
  4. Set d = CreateObject("scripting.dictionary")
  5. Set sht = Worksheets("查询表")
  6. file = Dir(ThisWorkbook.Path & "\*.xlsx")
  7.     Do While file <> ""
  8.         If file <> ThisWorkbook.Name Then
  9.             Workbooks.Open ThisWorkbook.Path & "" & file
  10.             n = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
  11.             arr = ActiveWorkbook.Worksheets(1).Range("b2:d" & n)
  12.                 For i = 1 To UBound(arr)
  13.                     If Not d.exists(arr(i, 1)) Then
  14.                         Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  15.                     End If
  16.                     d(arr(i, 1))(arr(i, 2)) = arr(i, 3)
  17.                 Next i
  18.             ActiveWorkbook.Close False
  19.         End If
  20.         file = Dir
  21.     Loop
  22. 'v = 2
  23. 'k = d.Count - 1
  24. r = sht.[c65536].End(xlUp).Row
  25.     For j = 0 To r - 1
  26.       If d.exists(sht.Cells(j + 2, 2).Value) Then
  27.         If d(sht.Cells(j + 2, 2).Value).Count = 1 Then
  28.             sht.Cells(j + 2, 6) = d(sht.Cells(j + 2, 2).Value).keys
  29.             sht.Cells(j + 2, 7) = d(sht.Cells(j + 2, 2).Value).items
  30.             'v = v + 1
  31.         Else
  32.             sht.Rows(j + 2 + 1).EntireRow.Resize(d(sht.Cells(j + 2, 2).Value).Count - 1).Insert
  33.             sht.Cells(j + 2, 6).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d(sht.Cells(j + 2, 2).Value).keys)
  34.             sht.Cells(j + 2, 7).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d(sht.Cells(j + 2, 2).Value).items)
  35.                 For Z = 2 To 5
  36.                     sht.Cells(j + 2, Z).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1).MergeCells = True
  37.                 Next Z
  38.             'v = v + d(sht.Cells(j + 2, 2).Value).Count
  39.         End If
  40.       End If
  41.     Next
  42. Application.ScreenUpdating = True
  43. End Sub
复制代码
根据实际数据情况,根据老师您提供的代码,进行了修改,再次感谢。

TA的精华主题

TA的得分主题

发表于 2020-10-13 15:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lele400024 发表于 2020-10-13 12:23
老师,您好,照你的方法实施具体案例的时候,第一个重复字段合并后就一直出现如图这个问题,由于数据隐私 ...

1016373263

TA的精华主题

TA的得分主题

发表于 2020-10-13 15:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lele400024 发表于 2020-10-13 12:37
老师,您好,实际数据运行过程中,存在一个问题,当查询表第二列名称中,劳务数据表不存在一一对应的名称 ...

字典中没有,当然出错,需处理下,on error resume next

TA的精华主题

TA的得分主题

发表于 2020-10-13 15:38 | 显示全部楼层
1016373263 发表于 2020-10-13 15:35
字典中没有,当然出错,需处理下,on error resume next

模拟数据过少,特殊情况未列出,所以未考虑

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-13 15:44 | 显示全部楼层
1016373263 发表于 2020-10-13 15:38
模拟数据过少,特殊情况未列出,所以未考虑
  1. Private Sub CommandButton1_Click()
  2. Application.ScreenUpdating = False
  3. Dim d As Object, d1 As Object, d2 As Object, d3 As Object, sht As Worksheet, arr, file As String, n%, k%
  4. Set d = CreateObject("scripting.dictionary")
  5. Set d1 = CreateObject("scripting.dictionary")
  6. Set d2 = CreateObject("scripting.dictionary")
  7. Set d3 = CreateObject("scripting.dictionary")
  8. Set sht = Worksheets("查询表")
  9. file = Dir(ThisWorkbook.Path & "\*.xlsx")
  10.     Do While file <> ""
  11.         If file <> ThisWorkbook.Name Then
  12.             Workbooks.Open ThisWorkbook.Path & "" & file
  13.             n = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
  14.             arr = ActiveWorkbook.Worksheets(1).Range("b2:g" & n)
  15.                 For i = 1 To UBound(arr)
  16.                     If Not d.exists(arr(i, 1)) Then
  17.                         Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  18.                         Set d1(arr(i, 1)) = CreateObject("scripting.dictionary")
  19.                         Set d2(arr(i, 1)) = CreateObject("scripting.dictionary")
  20.                         Set d3(arr(i, 1)) = CreateObject("scripting.dictionary")
  21.                     End If
  22.                     d(arr(i, 1))(arr(i, 2)) = arr(i, 3)
  23.                     d1(arr(i, 1))(arr(i, 2)) = arr(i, 4)
  24.                     d2(arr(i, 1))(arr(i, 2)) = arr(i, 5)
  25.                     d3(arr(i, 1))(arr(i, 2)) = arr(i, 6)
  26.                     
  27.                 Next i
  28.             ActiveWorkbook.Close False
  29.         End If
  30.         file = Dir
  31.     Loop
  32. 'v = 2
  33. 'k = d.Count - 1
  34. r = sht.[c65536].End(xlUp).Row
  35.     For j = 0 To r - 1
  36.       If d.exists(sht.Cells(j + 2, 2).Value) Then
  37.         If d(sht.Cells(j + 2, 2).Value).Count = 1 Then
  38.             sht.Cells(j + 2, 6) = d(sht.Cells(j + 2, 2).Value).keys
  39.             sht.Cells(j + 2, 7) = d(sht.Cells(j + 2, 2).Value).items
  40.             sht.Cells(j + 2, 8) = d1(sht.Cells(j + 2, 2).Value).items
  41.             sht.Cells(j + 2, 9) = d2(sht.Cells(j + 2, 2).Value).items
  42.             sht.Cells(j + 2, 10) = d3(sht.Cells(j + 2, 2).Value).items
  43.             'v = v + 1
  44.         Else
  45.             sht.Rows(j + 2 + 1).EntireRow.Resize(d(sht.Cells(j + 2, 2).Value).Count - 1).Insert
  46.             sht.Cells(j + 2, 6).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d(sht.Cells(j + 2, 2).Value).keys)
  47.             sht.Cells(j + 2, 7).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d(sht.Cells(j + 2, 2).Value).items)
  48.             sht.Cells(j + 2, 8).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d1(sht.Cells(j + 2, 2).Value).items)
  49.             sht.Cells(j + 2, 9).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d2(sht.Cells(j + 2, 2).Value).items)
  50.             sht.Cells(j + 2, 10).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1) = Application.Transpose(d3(sht.Cells(j + 2, 2).Value).items)
  51.                 For Z = 2 To 5
  52.                     sht.Cells(j + 2, Z).Resize(d(sht.Cells(j + 2, 2).Value).Count, 1).MergeCells = True
  53.                 Next Z
  54.             'v = v + d(sht.Cells(j + 2, 2).Value).Count
  55.         End If
  56.       End If
  57.     Next
  58. Application.ScreenUpdating = True
  59. End Sub
复制代码
劳务数据查询-修改.rar (30.61 KB, 下载次数: 3) 谢谢老师,根据需要,对原始数据及格式,修改了下,然后把自己想要的结果,根据老师您的代码修改了下,感谢。

TA的精华主题

TA的得分主题

发表于 2020-10-13 16:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lele400024 发表于 2020-10-13 15:44
谢谢老师,根据需要,对原始数据及格式,修改了下,然后把自己想要的结果,根据老师您的代码修改了下, ...

不容易,很行的

TA的精华主题

TA的得分主题

发表于 2020-10-14 16:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 21:11 , Processed in 0.046951 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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