ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 如何运用vba快速提取表1、表2的相同记录到表3呢?

如何运用vba快速提取表1、表2的相同记录到表3呢?

作者:绿色风 分类: 时间:2022-08-18 浏览:147
楼主
0Mouse
Q:如何运用vba快速提取表1、表2的相同记录到表3呢?
示例:
表1记录:

 
表2记录:

 
提取至表3的相同记录:

 
A:可以采用数组+双字典解决,代码如下:
  1. Sub 取同()
  2. Dim arr, brr, d1 As Object, d2 As Object, i%, j%
  3. arr = Sheet1.Range("A1").CurrentRegion
  4. brr = Sheet2.Range("A1").CurrentRegion
  5. Set d1 = CreateObject("scripting.dictionary")
  6. Set d2 = CreateObject("scripting.dictionary")
  7. For i = 1 To UBound(arr)
  8.     d1(arr(i, 1) & arr(i, 2) & arr(i, 3) & arr(i, 4) & arr(i, 5) & arr(i, 6)) = ""
  9. Next
  10. For j = 1 To UBound(brr)
  11.     If d1.Exists(brr(j, 1) & brr(j, 2) & brr(j, 3) & brr(j, 4) & brr(j, 5) & brr(j, 6)) Then
  12.         d2(j) = Application.Index(brr, j)
  13.     End If
  14. Next
  15. Sheet3.Range("A1").Resize(d2.Count, 6) = Application.Transpose(Application.Transpose(d2.items))
  16. Set arr = Nothing
  17. Set brr = Nothing
  18. Set d1 = Nothing
  19. Set d2 = Nothing
  20. End Sub
示例附件:
提取表1、表2相同记录到表3.rar
2楼
angel928
跟着小千 学习VBA。
3楼
亡者天下
过来学习一下
4楼
猴子
学习以下啊、、、
5楼
LOGO
补充一个利用高级筛选的:
  1. Sub 宏1()
  2.     Sheet3.Cells.Clear
  3.     Sheet1.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
  4.     CriteriaRange:=Sheet2.Range("A1").CurrentRegion, _
  5.     CopyToRange:=Sheet3.Range("a1"), Unique:=true
  6. End Sub
6楼
LOGO
提取表1有而表2没有的数据:
  1. Sub 表1有而表2没有的数据()
  2.     Dim ar
  3.     Sheet1.Copy , Worksheets(Worksheets.Count)
  4.     arr = Sheet1.Range("A1").CurrentRegion
  5.         Sheet1.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
  6.     CriteriaRange:=Sheet2.Range("A1").CurrentRegion, _
  7.     CopyToRange:=Worksheets(Worksheets.Count).Cells(1, UBound(arr, 2) + 2), Unique:=True
  8.         Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, _
  9.     CriteriaRange:=Cells(1, UBound(arr, 2) + 2).Range("A1").CurrentRegion, _
  10.      Unique:=True
  11.         Application.DisplayAlerts = False
  12.         Range("A1").CurrentRegion.Offset(1, 0).Delete
  13.         ActiveSheet.ShowAllData
  14.         Cells(1, UBound(arr, 2) + 2).CurrentRegion.clear
  15. End Sub
7楼
LOGO
提取表2有而表1没有的数据:
  1. Sub 表2有而表1没有的数据()
  2.     Dim arr
  3.     Sheet2.Copy , Worksheets(Worksheets.Count)
  4.     arr = Sheet2.Range("A1").CurrentRegion
  5.         Sheet2.Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
  6.     CriteriaRange:=Sheet1.Range("A1").CurrentRegion, _
  7.     CopyToRange:=Worksheets(Worksheets.Count).Cells(1, UBound(arr, 2) + 2), Unique:=True
  8.         Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterInPlace, _
  9.     CriteriaRange:=Cells(1, UBound(arr, 2) + 2).Range("A1").CurrentRegion, _
  10.      Unique:=True
  11.         Application.DisplayAlerts = False
  12.         Range("A1").CurrentRegion.Offset(1, 0).Delete
  13.         ActiveSheet.ShowAllData
  14.         Cells(1, UBound(arr, 2) + 2).CurrentRegion.clear
  15. End Sub
8楼
LOGO
在一些书上看到的案例中:
  1. Application.DisplayAlerts = False
  1. Application.DisplayAlerts = True
都是成对出现的,但是实际测试中,好像不用加
  1. Application.DisplayAlerts = True
这个警示框也会自动恢复.
9楼
0Mouse
这个倒是没有认真测试过,也许你测试的情况可以,难说也有不能恢复默认的情况,但反正加上是不会错的,也是一种良好的习惯。就好比一个变量在二次赋值的时候是否需要先清空的问题一样,整形变量不用,会直接替换,但string类型的变量在二次赋值前最好是先清空一下,否则结果可能会出错,我是碰到过,你可以留意看看。
10楼
LOGO
有道理,那还是加上为好。谢谢!
11楼
tiger2003
学学,谢谢!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap