ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将符合条件的两个表中的数据提取至一个表的指定位置

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-5-6 18:09 | 显示全部楼层 |阅读模式
各位大神:
   我需要将符合条件的两个表中的数据提取至一个表的指定位置,但是由于水平有限,不会同时将两个表的数据一并提取,只会将其中的一个表的数据进行提取。请各位大神帮忙。

Sub 匹配()
Dim d As Object
Set d = CreateObject("scripting.dictionary")
With Sheets("DATA")
     ar = .[a1].CurrentRegion
End With
For i = 2 To UBound(ar)
     If Trim(ar(i, 1)) <> "" Then
         d(Trim(ar(i, 1))) = i
     End If
Next i
With Sheets("DATA2")
     ar = .[a1].CurrentRegion
End With
For i = 2 To UBound(ad)
     If Trim(ad(i, 1)) <> "" Then
         d(Trim(ad(i, 1))) = i
     End If
Next i
With Sheets("ZBTQ")
     rs = .Cells(Rows.Count, 1).End(xlUp).Row
     .Range("c2:e" & rs + 1) = Empty
     br = .Range("a1:f" & rs)
     For i = 2 To UBound(br)
         If Trim(br(i, 2)) <> "" Then
             xh = d(Trim(br(i, 2)))
             If xh <> "" Then
                 br(i, 3) = Val(ar(xh, 3))
                 br(i, 4) = Val(ar(xh, 4))
                 br(i, 5) = ar(xh, 10)
                 br(i, 3) = Val(ad(xh, 11))  '报错
                 br(i, 4) = Val(ad(xh, 3)) '报错
                 br(i, 5) = ad(xh, 6) '报错

             End If
         End If
     Next i
     .Range("a1:f" & rs) = br
End With
MsgBox "ok!"
End Sub


数据提取.zip

29.89 KB, 下载次数: 34

原档

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-6 21:35 | 显示全部楼层
有没有在线的老师,有空帮忙看看。谢谢啦!

TA的精华主题

TA的得分主题

发表于 2022-5-6 22:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub cao()
  2.     Dim arr, brr, crr, d,i%
  3.     arr = Sheet2.[a1].CurrentRegion: brr = Sheet3.[a1].CurrentRegion
  4.     ReDim crr(1 To UBound(arr) + UBound(brr) - 2, 1 To 2)
  5.     For i = 2 To UBound(arr)
  6.         crr(i - 1, 1) = arr(i, 1)
  7.         crr(i - 1, 2) = arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 10)
  8.     Next
  9.     For i = 2 To UBound(brr)
  10.         crr(UBound(arr) + i - 2, 1) = brr(i, 1)
  11.         crr(UBound(arr) + i - 2, 2) = brr(i, 11) & "|" & brr(i, 3) & "|" & brr(i, 6)
  12.     Next
  13.     Set d = CreateObject("Scripting.Dictionary")
  14.     For i = 1 To UBound(crr)
  15.         d(crr(i, 1)) = crr(i, 2)
  16.     Next
  17.     With Sheet1
  18.         arr = .Range("b2:e" & .Cells(Rows.Count, 2).End(xlUp).Row)
  19.         For i = 1 To UBound(arr)
  20.             arr(i, 2) = Val(Split(d(arr(i, 1)), "|")(0))
  21.             arr(i, 3) = Val(Split(d(arr(i, 1)), "|")(1))
  22.             arr(i, 4) = Val(Split(d(arr(i, 1)), "|")(2))
  23.         Next
  24.         [b2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  25.     End With
  26. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-6 22:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-7 08:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
tel3033 发表于 2022-5-6 22:52
代码审核中……

    老师:
    早上好!
万分感谢有您。
这里我有一点不太明白,redim这里要-2,crr也是要-1, crr(UBound(arr) + i - 2
是因为有表头的原因吗,总共有二个表,所以要-2是这样理解吗。

ReDim crr(1 To UBound(arr) + UBound(brr) - 2, 1 To 2)
    For i = 2 To UBound(arr)
        crr(i - 1, 1) = arr(i, 1)
        crr(i - 1, 2) = arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 10)
    Next
    For i = 2 To UBound(brr)
        crr(UBound(arr) + i - 2, 1) = brr(i, 1)
        crr(UBound(arr) + i - 2, 2) = brr(i, 11) & "|" & brr(i, 3) & "|" & brr(i, 6)

TA的精华主题

TA的得分主题

发表于 2022-5-7 10:09 | 显示全部楼层
sunnyliner2018 发表于 2022-5-6 21:35
有没有在线的老师,有空帮忙看看。谢谢啦!

重写了一下,感觉上一个有点繁琐。
  1. Sub cao()
  2.     Dim arr, brr, d, i%, j%
  3.     arr = Sheet2.[a1].CurrentRegion: brr = Sheet3.[a1].CurrentRegion
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     For i = 2 To UBound(arr)
  6.         d(arr(i, 1)) = arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 10)
  7.     Next
  8.     For i = 2 To UBound(brr)
  9.         d(brr(i, 1)) = brr(i, 11) & "|" & brr(i, 3) & "|" & brr(i, 6)
  10.     Next
  11.     With Sheet1
  12.         arr = .Range("b2:e" & .Cells(Rows.Count, 2).End(xlUp).Row)
  13.         For i = 1 To UBound(arr)
  14.             For j = 0 To 2
  15.                 arr(i, j + 2) = Val(Split(d(arr(i, 1)), "|")(j))
  16.             Next
  17.         Next
  18.         [b2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  19.     End With
  20. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-7 10:11 | 显示全部楼层
本帖最后由 tel3033 于 2022-5-7 10:56 编辑

第2种
  1. Sub cao()
  2.     Dim arr, brr, d, i%, j%
  3.     arr = Sheet2.[a1].CurrentRegion: brr = Sheet3.[a1].CurrentRegion
  4.     Set d = CreateObject("Scripting.Dictionary")
  5.     For i = 2 To UBound(arr) + UBound(brr) - 1
  6.         j = UBound(arr)
  7.         If i <= j Then
  8.             d(arr(i, 1)) = arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 10)
  9.         Else
  10.             d(brr(i - j + 1, 1)) = brr(i - j + 1, 11) & "|" & brr(i - j + 1, 3) & "|" & brr(i - j + 1, 6)
  11.         End If
  12.     Next
  13.     With Sheet1
  14.         arr = .Range("b2:e" & .Cells(Rows.Count, 2).End(xlUp).Row)
  15.         For i = 1 To UBound(arr)
  16.             For j = 0 To 2
  17.                 arr(i, j + 2) = Val(Split(d(arr(i, 1)), "|")(j))
  18.             Next
  19.         Next
  20.         [b2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  21.     End With
  22. End Sub
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-7 11:11 | 显示全部楼层
tel3033 发表于 2022-5-7 10:09
重写了一下,感觉上一个有点繁琐。

调用数据.7z
老师,
我用自已的模板修改出现了错误。提示“下界超标”,您有时间帮我看一下。
Sub cao2()
    Dim arr, brr, d, i, j%
    arr = Sheets("数据源-料件").[a2].CurrentRegion: brr = Sheets("数据源-成品").[a5].CurrentRegion
    Set d = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(arr)
        d(arr(i, 2)) = arr(i, 3) & "|" & arr(i, 9) & "|" & arr(i, 2)
    Next
    For i = 6 To UBound(brr)
        d(brr(i, 10)) = brr(i, 2) & "|" & brr(i, 5) & "|" & brr(i, 16)
    Next
    With Sheets("库存")
        arr = .Range("b2:ao" & .Cells(Rows.Count, 2).End(xlUp).Row)
        For i = 3 To UBound(arr)
            For j = 0 To 2
                arr(i, j + 2) = Val(Split(d(arr(i, 1)), "|")(j))
            Next
        Next
        [b2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    End With
End Sub

TA的精华主题

TA的得分主题

发表于 2022-5-7 11:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sunnyliner2018 发表于 2022-5-7 08:58
老师:
    早上好!
万分感谢有您。

ReDim crr(1 To UBound(arr) + UBound(brr) - 2, 1 To 2)
arr和brr各减去了一个标题行,所以减2
新建的crr没考虑设标题行,循环是从2开始的,要将数据写在第一行,所以2-1=1

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-7 12:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
tel3033 发表于 2022-5-7 11:20
ReDim crr(1 To UBound(arr) + UBound(brr) - 2, 1 To 2)
arr和brr各减去了一个标题行,所以减2
新建的 ...

老师:
   如果我再增加一个关键值的情况下,会提示报错。

副本数据提取.7z
Sub cao22()
    Dim arr, brr, d, i%, j%
    arr = Sheet2.[a1].CurrentRegion: brr = Sheet3.[a1].CurrentRegion
    Set d = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(arr)
        d(arr(i, 1) & arr(i, 2)) = arr(i, 3) & "|" & arr(i, 4) & "|" & arr(i, 10)
         '把关键值从第1列改为2列
        
    Next
   
    For i = 2 To UBound(brr)
        d(brr(i, 1) & brr(i, 12)) = brr(i, 11) & "|" & brr(i, 3) & "|" & brr(i, 6)
        '把关键值从第1列改为2列
    Next
   With Sheet1
        arr = .Range("a2:o" & .Cells(Rows.Count, 1).End(xlUp).Row)
        For i = 1 To UBound(arr)
            For j = 0 To 2
                arr(i, j + 10) = Split(d(arr(i, 8) & arr(i, 9)), "|")(j)
                '把关键值从第1列改为2列
            Next
        Next
'        [b2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
        Sheets("ZBTQ").Range("a2:o" & UBound(arr)) = arr
    End With
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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