ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] VBA两表合并

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-21 10:55 | 显示全部楼层 |阅读模式
本帖最后由 hjd528 于 2024-1-22 15:41 编辑

如果Sheet1和Sheet2两个表的第2列姓名和第3列班级相同时,则将两表数据合并到Sheet3中(模拟表中只有一个班级,实际上有多个班级)。表中代码借用了https://club.excelhome.net/thread-1201390-1-1.html二楼linyh1742595842老师的代码,但运行时有卡顿,4楼hlly888老师的代码运行快一些,但无法修改。请各位大侠帮忙解决。谢谢!

截图.png

两表合并.rar (12.65 KB, 下载次数: 12)

TA的精华主题

TA的得分主题

发表于 2024-1-21 11:29 | 显示全部楼层
参与一下。。。
  1. Sub ykcbf()   '//2024.1.21
  2.     Dim arr, d, sht
  3.     Application.ScreenUpdating = False
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     Set d1 = CreateObject("Scripting.Dictionary")
  6.     Set Sh = ThisWorkbook.Sheets("合并")
  7.     For Each sht In Sheets
  8.         If sht.Name <> Sh.Name Then
  9.             With sht
  10.                 r = .Cells(.Rows.Count, "a").End(xlUp).Row
  11.                 c = .UsedRange.Columns.Count
  12.                 arr = .[a1].Resize(r, c)
  13.             End With
  14.             For j = 1 To UBound(arr, 2)
  15.                 s = arr(1, j)
  16.                 d1(s) = ""
  17.             Next
  18.             For i = 2 To UBound(arr)
  19.                 For j = 4 To UBound(arr, 2)
  20.                     s = arr(i, 2) & "|" & arr(i, 3)
  21.                     If Not d.Exists(s) Then Set d(s) = CreateObject("Scripting.Dictionary")
  22.                     d(s)(arr(1, j)) = arr(i, j)
  23.                 Next
  24.             Next
  25.         End If
  26.     Next
  27.     ReDim brr(1 To d.Count, 1 To 3)
  28.     For Each k In d.keys
  29.         m = m + 1
  30.         brr(m, 1) = m
  31.         brr(m, 2) = Split(k, "|")(0)
  32.         brr(m, 3) = Split(k, "|")(1)
  33.     Next
  34.     With Sh
  35.         .UsedRange.Clear
  36.         .[a1].Resize(1, d1.Count) = d1.keys
  37.         .[a2].Resize(m, 3) = brr
  38.         arr = .[a1].Resize(m + 1, d1.Count)
  39.         .[a1].Resize(m + 1, d1.Count).Borders.LineStyle = 1
  40.         For i = 2 To UBound(arr)
  41.             For j = 4 To UBound(arr, 2)
  42.                 s = arr(i, 2) & "|" & arr(i, 3)
  43.                 If d.Exists(s) Then
  44.                     arr(i, j) = d(s)(arr(1, j))
  45.                 End If
  46.             Next
  47.             With .[a1].Resize(m + 1, d1.Count)
  48.                 .Value = arr
  49.                 .Borders.LineStyle = 1
  50.                 .HorizontalAlignment = xlCenter
  51.                 .VerticalAlignment = xlCenter
  52.             End With
  53.         Next
  54.     End With
  55.     Set d = Nothing
  56.     Set d1 = Nothing
  57.     Application.ScreenUpdating = True
  58.     MsgBox "OK!"
  59. End Sub
复制代码


TA的精华主题

TA的得分主题

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

附件供参考。。。

两表合并.7z

14.89 KB, 下载次数: 13

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-21 12:13 | 显示全部楼层
本帖最后由 hjd528 于 2024-1-21 12:20 编辑
ykcbf1100 发表于 2024-1-21 11:31
附件供参考。。。

谢谢老师的帮助,但合并表少了三科的成绩。还得麻烦老师抽空改一下。

QQ截图20240121121203.png

TA的精华主题

TA的得分主题

发表于 2024-1-21 12:19 | 显示全部楼层
hjd528 发表于 2024-1-21 12:13
老师,合并表少了三科的成绩。还得麻烦你改一改。

改好了。。。

两表合并.7z

14.89 KB, 下载次数: 18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-21 12:22 | 显示全部楼层
如果班级相同 学生还是那些学生 也就是不相同的学生名都在就可以这样 自定义jsa 宏代码
function test(){
        var arr=maxArray_Z("Sheet2!b1:k1").map2d_Z(x=>Number(String(x).replace(/\D+/g,"")),"f1");
        var arr1=zip_Z([maxArray_Z("Sheet1!a1:k1"),sortByCols_Z(arr,"f1",1).deleteCols_Z("f1,f2")])
        arr1.toRange_Z("合并!t1").加边框().自动行高列宽()
}

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-21 12:26 | 显示全部楼层
本帖最后由 hjd528 于 2024-1-21 16:08 编辑

谢谢老师!Sheet1和Sheet2的学科任意互换或增加,无需修改代码,都可以将两表合并,适合V小白使用。

TA的精华主题

TA的得分主题

发表于 2024-1-21 12:34 | 显示全部楼层
本帖最后由 zjdh 于 2024-1-21 13:49 编辑


其实将原来的的代码改成数组处理,运行速度是很快的!

两表合并2.rar (19.57 KB, 下载次数: 16)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-21 13:11 | 显示全部楼层
本帖最后由 excel玉米 于 2024-1-21 13:45 编辑

image.png
以此附件为准!
image.png

两表合并.7z

12.59 KB, 下载次数: 13

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-21 15:39 | 显示全部楼层
cjc209 发表于 2024-1-21 12:22
如果班级相同 学生还是那些学生 也就是不相同的学生名都在就可以这样 自定义jsa 宏代码
function test(){
...

谢谢回帖!电脑没有安装WPS。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-5 15:35 , Processed in 0.050859 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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