ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 从其他文件中读取符合条件的数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-3-27 15:09 | 显示全部楼层 |阅读模式
每周要对相关数据进行统计,因数据量较大,希望能用VBA解决:

1、附件中材料登记中不是固定的,有可能有三个,也可能只有两个;
2、提取数据时姓名表中姓名也不固定,有可能增加,也可能减少;

目前的做法是打开每一个材料登记表,通过VLOOKUP函数找出符合条件的数据,复制粘贴到一张新表中。但是一方面数据量较大,另一方面碰到材料登记表多时很容易搞漏。
我也试过将多个登记表合并后进行筛选,由于每个材料表中有近三万条记录,最多只能合并2-3个表,无济无事。

请高手帮忙用VBA解决问题,谢谢

附件.rar

8.16 KB, 下载次数: 54

TA的精华主题

TA的得分主题

发表于 2011-3-27 15:29 | 显示全部楼层
Sub Macro1()
    Dim arr, brr(1 To 60000, 1 To 4), d As Object, MyPath$, MyName$, i&, j&, m&
    Set d = CreateObject("scripting.dictionary")
    arr = Sheets("姓名").[a1].CurrentRegion
    For i = 1 To UBound(arr)
        d(arr(i, 1)) = ""
    Next
    MyPath = ThisWorkbook.Path & "\"
    MyName = Dir(MyPath & "*.xls")
    Application.ScreenUpdating = False
    [a1].CurrentRegion.Offset(1).ClearContents
    Do While MyName <> ""
        If MyName <> ThisWorkbook.Name Then
            With GetObject(MyPath & MyName)
                arr = .Sheets(1).[a1].CurrentRegion
                .Close False
            End With
            For i = 2 To UBound(arr)
                If d.Exists(arr(i, 3)) Then
                    m = m + 1
                    For j = 1 To 4
                        brr(m, j) = arr(i, j)
                    Next
                End If
            Next
        End If
        MyName = Dir
    Loop
    [a2].Resize(m, 4) = brr
    Application.ScreenUpdating = True
End Sub

[ 本帖最后由 zhaogang1960 于 2011-3-27 15:31 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-3-27 15:30 | 显示全部楼层
附件.rar (15.22 KB, 下载次数: 138)

[ 本帖最后由 zhaogang1960 于 2011-3-27 15:31 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-3-27 15:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
try.......

附件.rar

16.65 KB, 下载次数: 57

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-27 15:44 | 显示全部楼层
怎么改后说下标越界?

[ 本帖最后由 zzw20070711 于 2011-3-27 17:34 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-3-27 15:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 zzw20070711 于 2011-3-27 15:44 发表
请问下,实际中我的姓名处于第14列,应该改哪个数值
If d.Exists(arr(i, 3)) Then
                    m = m + 1
                    For j = 1 To 4
                        brr(m, j) = arr(i, j)
       ...

根据需要修改 brr(1 To 60000, 1 To 4)中的4

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-27 16:03 | 显示全部楼层
本人愚笨,改不了。再次麻烦修改一下

附件.rar

15.8 KB, 下载次数: 80

TA的精华主题

TA的得分主题

发表于 2011-3-27 16:10 | 显示全部楼层
原帖由 zzw20070711 于 2011-3-27 16:03 发表
本人愚笨,改不了。再次麻烦修改一下

Sub qushu()
Dim arr, brr(1 To 65500, 1 To 15), d, mp$, mf$, wb As Workbook
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set d = CreateObject("scripting.dictionary")
arr = Sheet2.Range("a1:a" & Sheet2.[a65536].End(3).Row)
For i = 1 To UBound(arr)
    d(arr(i, 1)) = ""
Next
mp = ThisWorkbook.Path & "\"
mf = Dir(mp & "*.xls")
While Len(mf) > 0
   If mf <> ThisWorkbook.FullName Then
       Set wb = GetObject(mp & mf)
       arr = wb.Sheets(1).Range("A2:O" & wb.Sheets(1).Range("a65536").End(xlUp).Row)
       For i = 1 To UBound(arr)
           If d.exists(arr(i, 14)) Then
              m = m + 1
              For j = 1 To UBound(arr, 2)
                 brr(m, j) = arr(i, j)
              Next
            End If
       Next
    End If
mf = Dir
Wend
Set wb = Nothing
Set d = Nothing
Sheet1.[a2:d65536] = ""
If m > 1 Then Sheet1.[a2].Resize(m, 15) = brr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-3-27 17:29 | 显示全部楼层
感谢老师,运行速度很快
太感谢了

TA的精华主题

TA的得分主题

发表于 2011-3-27 18:13 | 显示全部楼层
原帖由 zzw20070711 于 2011-3-27 17:29 发表
感谢老师,运行速度很快
太感谢了

楼主你修改我的代码出错了:
If MyName <> ThisWorkbook.Name Then文件名不等于本文本名

你修改的:
If mf <> ThisWorkbook.FullName Then文件名不等于本文本“全名”,FullName 是包含路径的,会导致这一句无效
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 20:46 , Processed in 0.027048 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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