ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 跨工作簿查找并填充数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-2 13:00 | 显示全部楼层 |阅读模式
本帖最后由 lengyifei 于 2019-12-2 16:28 编辑

新人求助:用vlookup公式如下,=IF(COUNTIF('D:\审核\小学\双语小学2017-2018年工资表\双语小学2017-2018年工资表\2017年人代工资表汇总\[2017年03月人事代理工资表.xlsx]小学'!$C$3:$C$240,$C$5:$C$245),VLOOKUP(C5,'D:\审核\小学\双语小学2017-2018年工资表\双语小学2017-2018年工资表\2017年人代工资表汇总\[2017年03月人事代理工资表.xlsx]小学'!$C$3:$AC$240,26,0))

因为不想每次都打开原工作簿,所以想用vba代替,但不懂,所以,麻烦各位给个代码,谢谢,如果附上说明更好,因为还有好多表需要处理,万分感谢!


附件已上传,就是将源工作簿中第AB列的对应数据填到目标工作簿中第W列,如果目标工作簿中的姓名在源工作簿中没有,则为空或零,源工作簿中有四个表,最好都将已交税金对应到目标工作簿,谢谢

跨工作簿.rar

165.28 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2019-12-2 16:02 | 显示全部楼层
最好上传附件,否则没有人解答

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-3 08:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-3 09:47 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-3 10:52 | 显示全部楼层
就是将源表中的已交税金数据,对应复制到目标表中的已交税金,如果原表中没有这个人,就显示为空

TA的精华主题

TA的得分主题

发表于 2019-12-3 11:16 | 显示全部楼层
已交税金数据是指的那列?是不是从源表里的四张工作表查询目标表的姓名这个对应关系?然后呢,把源表的哪列对应填过来?

TA的精华主题

TA的得分主题

发表于 2019-12-3 12:07 | 显示全部楼层
简单的字典匹配问题,如果格式一致非常简单。
只是源工作簿中四个表,个人所得税有四个列,名字也不一样。
按这个格式写出的代码不具有通用性,也不能用到别的表上。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-3 16:30 | 显示全部楼层
syhuzh 发表于 2019-12-3 12:07
简单的字典匹配问题,如果格式一致非常简单。
只是源工作簿中四个表,个人所得税有四个列,名字也不一样。 ...

嗯,确实,列不同,不通用,所以我让他们把源表四个表合一起了,然后我自己按照网上的代码改了改,可以引用了,但我还有个问题,如果目标表格中的姓名,在源表中不存在或没找到,让他显示零,这句代码怎么写?加到哪儿?
Sub 跨工作簿查询201701()
    Dim Sht As Worksheet
    Dim wkb_data As Workbook
    Dim fullpath As String
    Dim i As Long
    fullpath = ThisWorkbook.Path & "\2017年02月人事代理工资表.xlsx"
    Application.ScreenUpdating = False
   
    Set Sht = ThisWorkbook.Sheets("201701")
    Set wkb_data = Workbooks.Open(fullpath)
   
    With Sheets("小学")
        For i = 5 To 279
            For j = 3 To 283
                If Sht.Cells(i, 3) = .Cells(j, 3) Then
                   Sht.Cells(i, 23) = .Cells(j, 29)
                   Exit For
                End If
            Next
        Next
End With

wkb_data.Close False
Set wkb_data = Nothing
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2019-12-3 20:51 | 显示全部楼层
把代码放到模块中,此代码只对附件,变动地方自行修改。

Sub 跨工作簿取数()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set d = CreateObject("scripting.dictionary")

Set wb = Workbooks.Open(ThisWorkbook.Path & "\源工作簿.xlsx")
For Each sh In wb.Sheets
    arr = sh.[a1].CurrentRegion
    For j = 1 To UBound(arr, 2)
        If InStr(arr(2, j), "个人所得税") Then k = j: Exit For
    Next
    For i = 3 To UBound(arr)
        d(arr(i, 3)) = arr(i, k)
    Next
Next
wb.Close


For i = 5 To 451        '451自行修改
    Cells(i, 23) = d(Cells(i, 3).Value)
Next

Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

TA的精华主题

TA的得分主题

发表于 2019-12-3 20:53 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 06:38 , Processed in 0.046817 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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