ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 用字典模拟Vlookup匹配取数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-24 21:31 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 excel1202 于 2024-8-25 19:12 编辑

字典入门求助:
字典模拟Vlookup匹配取数求助:用表一中的“姓名+单位”去查找表二中的“姓名+单位”,找到后就把表二中的 D列、E列的金额 分别 加到 表一的 E列、F列中原有的金额中;
表一中找不到的如“刘二、腾讯”就添加到表一A列、B列的最后一行,并把表二中对应的 D列、E列的金额分别填在表一最后一行的 E列、F列中。
数据有几万行,除写入结果外,请用字典+数组的方法。




表一和表二.jpg

TA的精华主题

TA的得分主题

发表于 2024-8-24 22:35 | 显示全部楼层
比较简单的一题字典+数组题

2024-08-24_223437.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-24 22:39 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-24 22:59 | 显示全部楼层

需要的是取表二的数,加回到表一中,不是替换掉表一的数,请问如何修改代码,谢谢!

TA的精华主题

TA的得分主题

发表于 2024-8-24 23:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
试试。。。。。。

用字典模拟Vlookup匹配取数求助.rar

10.67 KB, 下载次数: 22

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

发表于 2024-8-25 00:17 | 显示全部楼层
  1. Sub test()
  2. Dim Dic(1 To 2) As Object, Arr, i&, j&, tmPstr$, Trr
  3. For i = 1 To UBound(Dic)
  4.     Set Dic(i) = CreateObject("scripting.dictionary")
  5. Next i
  6. Arr = Sheet2.[a1].CurrentRegion
  7. For i = 2 To UBound(Arr, 1)
  8.     tmPstr = Arr(i, 1) & Chr(10) & Arr(i, 2)
  9.     Dic(1)(tmPstr) = Dic(1)(tmPstr) + Arr(i, 4)
  10.     Dic(2)(tmPstr) = Dic(1)(tmPstr) + Arr(i, 5)
  11. Next i
  12. With Sheet1
  13.     Arr = .[a1].CurrentRegion
  14.     For i = 2 To UBound(Arr, 1)
  15.         tmPstr = Arr(i, 1) & Chr(10) & Arr(i, 2)
  16.         If Dic(1).exists(tmPstr) Then
  17.             Arr(i, 5) = Arr(i, 5) + Dic(1)(tmPstr)
  18.             Arr(i, 6) = Arr(i, 6) + Dic(2)(tmPstr)
  19.             Dic(1).Remove tmPstr: Dic(2).Remove tmPstr
  20.         End If
  21.     Next i
  22.     .[a1].Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr
  23.    
  24.     If Dic(1).Count Then
  25.         '追补新人
  26.         i = UBound(Arr, 1)
  27.         For Each d In Dic(1).keys
  28.             i = i + 1
  29.             Trr = Split(d, Chr(10))
  30.             .Cells(i, 1) = Trr(0): .Cells(i, 2) = Trr(1)
  31.             .Cells(i, 5) = Dic(1)(d): .Cells(i, 6) = Dic(2)(d)
  32.         Next d
  33.     End If
  34. End With
  35. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-25 07:07 | 显示全部楼层
本帖最后由 一招秒杀 于 2024-8-25 07:09 编辑

Full Join  1句全搞定,唉,比上面的代码简单太多了,简直是不要不要的。
FullJoin2.png

TA的精华主题

TA的得分主题

发表于 2024-8-25 07:30 | 显示全部楼层
Sub qs()
Dim arr, i, dic
Set dic = CreateObject("scripting.dictionary")
arr = Sheet2.Range("a1").CurrentRegion.Value
For i = 2 To UBound(arr)
    s = arr(i, 1) & "|" & arr(i, 2)
    dic(s) = Array(arr(i, 3), arr(i, 4))
Next
With Sheet1
    brr = .Range("a1").CurrentRegion.Value
    For j = 2 To UBound(brr)
    ss = brr(j, 1) & "|" & brr(j, 2)
    If dic.exists(ss) Then
        tt = dic(ss)
        brr(j, 4) = tt(0): brr(j, 5) = tt(1)
        dic.Remove ss
    End If
    Next
   
    ReDim crr(1 To UBound(brr), 1 To UBound(brr, 2))
For Each k In dic.keys
    m = m + 1
    k2 = Split(k, "|")
    crr(m, 1) = k2(0): crr(m, 2) = k2(1)
    crr(m, 4) = dic(k)(0): crr(m, 5) = dic(k)(1)
Next
.Range("a1").Resize(UBound(brr), UBound(brr, 2)) = brr
.Range("a" & UBound(brr) + 1).Resize(10000, UBound(brr, 2)).ClearComments
.Range("a" & UBound(brr) + 1).Resize(m, UBound(brr, 2)) = crr
End With
Set dic = Nothing
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-25 07:31 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 17:23 , Processed in 0.048524 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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