ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-9-28 23:38 来自手机 | 显示全部楼层
语虚何以言知 发表于 2020-9-28 18:13
时间关系,字典的我就随便写了下,供您参考吧,表间关系还是建议用ado,是专门处理这个的

思路就是 ...

太感谢了,我再仔细看看代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-9-30 11:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

  1. Sub 字典()
  2. Set d = CreateObject("Scripting.Dictionary")

  3. arr = Sheets("查询表").[a1].CurrentRegion

  4. Set f = Workbooks.Open(ThisWorkbook.Path & "\劳务数据表.xlsx")
  5. brr = ActiveWorkbook.Sheets("sheet1").[a1].CurrentRegion
  6. ActiveWorkbook.Close


  7. For i = 2 To UBound(arr)
  8.     For ii = 2 To UBound(brr)
  9.         If arr(i, 2) = brr(ii, 2) Then d(arr(i, 1) & "-" & arr(i, 2) & "-" & arr(i, 3) & "-" & arr(i, 4) & "-" & arr(i, 5) & "-" & brr(ii, 3) & "-" & brr(ii, 4)) = ""
  10.         '如果查询表中名称等于劳务数据表名称,则将查询表中所有列+劳务数据表劳务单位和定额合并写入字典key
  11.     Next
  12. Next

  13. crr = d.keys   '将字典Key写入数组crr
  14. d.RemoveAll    '清除字典

  15. With Sheets("结果")
  16.     .Cells.Clear
  17.     ar = Split("序号,名称,合同金额,报送金额,终审金额,劳务单位,金额", ",")  '将标题写入数组ar
  18.     .[a1].Resize(1, UBound(ar) + 1) = ar          '将ar写入单元格
  19.     For i = 0 To UBound(crr)                      '遍历数组crr每行
  20.         .Range("a" & i + 2).Resize(1, UBound(Split(crr(i), "-")) + 1) = Split(crr(i), "-")
  21.         '将单元格a列第2行开始,扩大列区域为“split数组crr有多少列+1”列,数据等于split数组crr(i)各列数据
  22.     Next
  23.    
  24.     r = .[b65536].End(3).Row

  25.    
  26.    
  27.     .Range("a2:a" & r) = "=ROW()-1"
  28.     For i = 2 To r
  29.         If .Range("B" & i) <> .Range("B" & i - 1) And WorksheetFunction.CountIf(.Range("b2:b" & r), .Range("b" & i)) > 1 Then
  30.         '举例:if range("b6")<>range("b5") and countif(range("b2:b10"),range("b6")>1  then
  31.         'n=n+1
  32.         '首行=6
  33.         '末行=首行+countif(range("b2:b10"),range("b6"))-1
  34.             n = n + 1
  35.             首行 = i
  36.             末行 = 首行 + WorksheetFunction.CountIf(.Range("b2:b" & r), .Range("b" & i)) - 1 '从首行开始,countif查找有几行重复行-1,则为某行行号
  37.             For ii = 1 To 4
  38.                 d(.Range(Chr(ii + 97) & 首行 & ":" & Chr(ii + 97) & 末行)) = ""    'chr(1+97)B列,chr(2+97)C列;将对应列重复行写入字典key;
  39.             Next
  40.         End If
  41.     Next
  42. End With

  43. drr = d.keys    '将字典key写入数组drr

  44. For i = 0 To UBound(drr)     '遍历数组
  45.     drr(i).Merge             '数组合并
  46. Next


  47. End Sub
复制代码


附上来自语虚何以言知的代码解释,感谢

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-9-30 12:06 | 显示全部楼层
lele400024 发表于 2020-9-30 11:16
附上来自语虚何以言知的代码解释,感谢

46行是将需要合并的单元格区域装入字典
46对应的45行至47行的循环就是:依次将需要合并的单元格区域装入字典

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-9-30 13:24 | 显示全部楼层
语虚何以言知 发表于 2020-9-30 12:06
46行是将需要合并的单元格区域装入字典
46对应的45行至47行的循环就是:依次将需要合并的单元格区域装入 ...

谢谢您的补充

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-9-30 16:27 来自手机 | 显示全部楼层
语虚何以言知 发表于 2020-9-30 12:06
46行是将需要合并的单元格区域装入字典
46对应的45行至47行的循环就是:依次将需要合并的单元格区域装入 ...

如果存在brr(ii,2)<>arr(i,2)的情况,也就是说,有一些项目名称没有劳务数据,是写
else if brr(ii,2)<>arr(i,2) then
then后面这里应该写什么啊,
我试了用字典加key和新增一个数组写入再导出,始终和之前字典的数据是重复的,导出的是整个brr的数据。
可能是for ii=1 to ubound(brr)
                for i=1 to ubound(arr)关系没有搞清楚

TA的精华主题

TA的得分主题

发表于 2020-10-10 17:16 | 显示全部楼层
本帖最后由 语虚何以言知 于 2020-10-10 17:26 编辑
lele400024 发表于 2020-9-30 16:27
如果存在brr(ii,2)arr(i,2)的情况,也就是说,有一些项目名称没有劳务数据,是写
else if brr(ii,2)arr( ...

项目名称是什么?没见到这个字段
才下你指的是查询表中b列的名称列
image.png
建议你手敲,你要做的是做以查询表为基准的左连接,所以匹配上的最后两个用brr的值,匹配补上brr就改为空格就完事了
image.png

还是建议sql方法,常用sql语句并不复杂,ado代码也是固定套路的,基本上就改数据源引用和sql语句。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-10-11 00:20 | 显示全部楼层
本帖最后由 1016373263 于 2020-10-11 08:34 编辑

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim d As Object, sht As Worksheet, arr, file As String, n%, k%
Set d = CreateObject("scripting.dictionary")
Set sht = Worksheets("查询表")
file = Dir(ThisWorkbook.Path & "\*.xlsx")
    Do While file <> ""
        If file <> ThisWorkbook.Name Then
            Workbooks.Open ThisWorkbook.Path & "\" & file
            n = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Row
            arr = ActiveWorkbook.Worksheets(1).Range("b2:d" & n)
                For i = 1 To UBound(arr)
                    If Not d.exists(arr(i, 1)) Then
                        Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
                    End If
                    d(arr(i, 1))(arr(i, 2)) = arr(i, 3)
                Next i
            ActiveWorkbook.Close False
        End If
        file = Dir
    Loop
v = 2
k = d.Count - 1
    For j = 0 To k
        If d(sht.Cells(v, 2).Value).Count = 1 Then
            sht.Cells(v, 6) = d(sht.Cells(v, 2).Value).keys
            sht.Cells(v, 7) = d(sht.Cells(v, 2).Value).items
            v = v + 1
        Else
            sht.Rows(v + 1).EntireRow.Resize(d(sht.Cells(v, 2).Value).Count - 1).Insert
            sht.Cells(v, 6).Resize(d(sht.Cells(v, 2).Value).Count, 1) = Application.Transpose(d(sht.Cells(v, 2).Value).keys)
            sht.Cells(v, 7).Resize(d(sht.Cells(v, 2).Value).Count, 1) = Application.Transpose(d(sht.Cells(v, 2).Value).items)
                For Z = 2 To 5
                    sht.Cells(v, Z).Resize(d(sht.Cells(v, 2).Value).Count, 1).MergeCells = True
                Next Z
            v = v + d(sht.Cells(j + 2, 2).Value).Count
        End If
    Next
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

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

劳务数据查询.zip

31.06 KB, 下载次数: 9

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-10-11 00:23 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-13 11:00 | 显示全部楼层
语虚何以言知 发表于 2020-10-10 17:16
项目名称是什么?没见到这个字段
才下你指的是查询表中b列的名称列

太感谢了,谢谢您的建议
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-1 23:07 , Processed in 0.044409 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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