ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用VBA进行数据对应查找

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-20 14:28 | 显示全部楼层 |阅读模式
  大神们帮忙看看下面的效果用VBA可不可以解决:

       1. 第一张表是原始数据,分为两组:A列至E列为一组,F列至J列为一组;同一组数据内有可能有相同的合同编号,但两组数据中每个同行的“合同编号+序号”在各自组内均唯一。
       2. 需要找出左边一组数据中是否有同行的“合同编号+序号”在右边一组数据中没有同行出现过,如果有的话需将这些“合同编号+序号”以及他们对应的三项费用列到“左有右无”表格。
       3. 需要找出右边一组数据中是否有同行的“合同编号+序号”在左边一组数据中没有同行出现过,如果有的话需将这些“合同编号+序号”以及他们对应的三项费用列到“右有左无”表格。
       4. 将在左右两组数据中均同行出现过的“合同编号+序号”以及他们分别在两组数据中对应的三项费用列到“左右都有”表格,“原始数据”表格中A列至E列的数据在“左右都有”表格中依然在A列至E列;“原始数据”表格中F列至J列的数据在“左右都有”表格中依然在F列至J列。
附件中只有第一张表是原始数据,后面的几张表都是希望可以达到的效果。之前试着用COUNTIFVLOOKUP函数做过,但实际情况中每组数据大概有10万条,用这两个函数的话电脑计算速度非常慢,有时还会死机,所以想问下各位大神用VBA可不可以解决。


样本.rar (10.96 KB, 下载次数: 57)

TA的精华主题

TA的得分主题

发表于 2018-8-20 15:32 | 显示全部楼层
详见附件。。。。。。。。。。

样本.zip

22.53 KB, 下载次数: 209

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-20 16:18 | 显示全部楼层
本帖最后由 henrysu 于 2018-8-20 16:21 编辑
zhangzhang 发表于 2018-8-20 15:32
详见附件。。。。。。。。。。

谢谢大神!我又把左边一组的数据复制了两行到右边(两组数据量不相等),点击按钮以后发现这两行数据还是出现在了“左有右无”表格中,请问针对两组数据数据量不相等的情况代码哪里可以优化吗? 样本2.rar (22.26 KB, 下载次数: 47)


TA的精华主题

TA的得分主题

发表于 2018-8-20 16:44 | 显示全部楼层
写的不好,清测试,可行的话给个鲜花

  1. Sub tt()
  2. Application.ScreenUpdating = False

  3. a1 = Cells(Rows.Count, 1).End(3).Row
  4. a2 = Cells(Rows.Count, 6).End(3).Row

  5. ReDim m(a1 - 2)
  6. ReDim n(a2 - 2)
  7. Set arr1 = Range(Cells(2, 1), Cells(a1, 2))
  8. Set arr2 = Range(Cells(2, 6), Cells(a2, 7))

  9. For aa1 = 2 To a1
  10.     m(aa1 - 2) = Cells(aa1, 1) & Cells(aa1, 2)
  11. Next

  12. For aa2 = 2 To a2
  13.     n(aa2 - 2) = Cells(aa2, 6) & Cells(aa2, 7)
  14. Next

  15. Cells(2, 13).Resize(a1 - 1, 1) = Application.Transpose(m)
  16. Cells(2, 14).Resize(a2 - 1, 1) = Application.Transpose(n)

  17. '----------------------------sheet2-------------------------------

  18. Dim b(100000)
  19. For Each mm In m
  20.     j = j + 1
  21.     If Columns(14).Find(mm) Is Nothing Then
  22.         b(i) = j + 1
  23.         Cells(b(i), 1).Resize(1, 5).Copy
  24.         Sheets(2).Activate
  25.         Cells(Rows.Count, 1).End(3).Offset(1, 0).Select
  26.         Sheets(2).Paste
  27.         i = i + 1
  28.         Sheets(1).Activate
  29.     End If

  30. Next

  31. '----------------------------sheet3-------------------------------

  32. i = 0
  33. j = 0

  34. Dim c(100000)
  35. For Each nn In n
  36.     j = j + 1
  37.     If Columns(13).Find(nn) Is Nothing Then
  38.         c(i) = j + 1
  39.         Cells(c(i), 6).Resize(1, 5).Copy
  40.         Sheets(3).Activate
  41.         Cells(Rows.Count, 1).End(3).Offset(1, 0).Select
  42.         Sheets(3).Paste
  43.         i = i + 1
  44.         Sheets(1).Activate
  45.     End If
  46. Next

  47. '----------------------------sheet4-------------------------------
  48. i = 0
  49. j = 0

  50. Dim d1(100000)
  51. For Each mm In m
  52.     j = j + 1
  53.     If Not Columns(14).Find(mm) Is Nothing Then
  54.         d1(i) = j + 1
  55.         Cells(d1(i), 1).Resize(1, 5).Copy
  56.         Sheets(4).Activate
  57.         Cells(Rows.Count, 1).End(3).Offset(1, 0).Select
  58.         Sheets(4).Paste
  59.         i = i + 1
  60.         Sheets(1).Activate
  61.     End If
  62. Next

  63. i = 0
  64. j = 0

  65. Dim d2(100000)
  66. For Each nn In n
  67.     j = j + 1
  68.     If Not Columns(13).Find(nn) Is Nothing Then
  69.         d2(i) = j + 1
  70.         Cells(d2(i), 6).Resize(1, 5).Copy
  71.         Sheets(4).Activate
  72.         Cells(Rows.Count, 6).End(3).Offset(1, 0).Select
  73.         Sheets(4).Paste
  74.         i = i + 1
  75.         Sheets(1).Activate
  76.     End If
  77. Next

  78. '----------------------------End-------------------------------

  79. Sheets(1).Columns("M:N").ClearContents
  80. Set arr1 = Nothing
  81. Set arr2 = Nothing
  82. Erase m, n, b, c, d1, d2
  83. MsgBox "End!"
  84. Application.ScreenUpdating = True

  85. End Sub
复制代码

评分

1

查看全部评分

头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-8-20 16:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-20 17:28 | 显示全部楼层
mikezhan 发表于 2018-8-20 16:45
Sub test()
Dim arr, brr, LR(), L(), R(), shLR1(), shLR2(), shL(), shR()

谢谢大神了

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-20 17:29 | 显示全部楼层
liujialin0o0 发表于 2018-8-20 16:44
写的不好,清测试,可行的话给个鲜花

谢谢大神。
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-8-20 21:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-8-21 08:43 | 显示全部楼层
mikezhan 发表于 2018-8-20 21:04
对单元格的直接读写是败笔

还在学习之中,有什么更好的更快速的方法情指教,谢谢

TA的精华主题

TA的得分主题

发表于 2018-8-21 08:48 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 13:23 , Processed in 0.028778 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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