ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎么查找指定目录中的excel文件中是否存在某一字符

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-1-19 10:03 | 显示全部楼层 |阅读模式
本帖最后由 qdsky 于 2012-1-19 11:23 编辑

请教各位老师怎么用程序查找excel中某一单元值在windows中指定目录存在,如果存在,则返回一特定值。
比如,A1的值为abc,我需要查找abc是否在D盘的excel文件中用过,D盘有很多excel文件,如果有,则返回B1的值为Y,否则返回B1的值为N。而且是能查找A列的所有值。非常希望能得到各位老师的帮助。谢谢!

TA的精华主题

TA的得分主题

发表于 2012-1-19 11:48 | 显示全部楼层
建议搜索本论坛中“多工作簿查询”帖子。

TA的精华主题

TA的得分主题

发表于 2012-1-19 12:11 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-1 13:28 | 显示全部楼层
查找了一下以前的帖子,有不少帮助的信息,因为对VBA懂的不多,我拼凑了一些论坛上程序,在此向各位老师表示感谢!但是程序还没有实现自己的目的,在执行到“StrStatus = Rng.Offset(-5, 0).Value”这一句时提示错误“1004---Application-defined or object-defined error”。恳请各位老师能不吝赐教。非常感谢!
我想实现的方法是:在指定的目录(包括子目录)下中文件名包含"mm"的文件里查找当前文件F列的字符,如找到则将找到的字符所在的工作表中相应的A,D列中的信息填入到当前文件的A,D列,当前的文件的B列值设为N。

Sub cztq()
Dim MyName, Dic, Did, I, J, Jrow, MyFileName
Dim Wb As Workbook, Ws As Worksheet, Rng As Range, StrStatus$, StrNew$, StrType$, Arr, N&, Findstr$, Sht1 As Worksheet

   Set Dic = CreateObject("Scripting.Dictionary")
   Dic.Add ("D:\"), ""
    I = 0
    Do While I < Dic.Count
        Ke = Dic.keys
        MyName = Dir(Ke(I), vbDirectory)
        Do While MyName <> ""
            If MyName <> "." And MyName <> ".." Then
                If (GetAttr(Ke(I) & MyName) And vbDirectory) = vbDirectory Then
                    Dic.Add (Ke(I) & MyName & "\"), ""
                End If
            End If
            MyName = Dir
        Loop
        I = I + 1
    Loop

Set Sht1 = ActiveSheet
Jrow = Sht1.[F65536].End(xlUp).Row
For J = 2 To Jrow
   Findstr = Cells(J, 6).Value
     For Each Ke In Dic.keys
        MyFileName = Dir(Ke & "*mm*.xls")
        Do While MyFileName <> "" And MyFileName <> ThisWorkbook.Name
            Set Wb = GetObject(Ke & MyFileName)
            With Wb
                 For Each Ws In .Worksheets
                  With Ws
                   If WorksheetFunction.CountIf(.UsedRange, Findstr) <> 0 Then
                      Set Rng = .UsedRange.Find(Findstr)
                      StrStatus = Rng.Offset(-5, 0).Value
                      StrNew = "N"
                      StrType = Rng.Offset(-2, 0).Value
                      Do
                       With Sht1
                            .Cells(J, 1) = StrStatus
                            .Cells(J, 2) = StrNew
                            .Cells(J, 4) = StrType
                       End With
                      Loop While .UsedRange.Find(Findstr).Address <> Rng.Address
                   End If
                  End With
                 Next Ws
             End With
             Wb.Close False
          MyFileName = Dir
        Loop
     Next
Next
    Application.ScreenUpdating = True

End Sub

查找提取.zip

23.38 KB, 下载次数: 62

TA的精华主题

TA的得分主题

发表于 2012-2-1 16:50 | 显示全部楼层
本帖最后由 zhaogang1960 于 2012-2-1 16:51 编辑

短信收到,请测试:
  1. Dim arr_File()
  2. Dim ary(), m As Long, mm As Long

  3. Sub Macro1()
  4.     Dim arr, brr(1 To 60000, 1 To 4), n As Long, i As Long
  5.     Dim fp$, obmapp As Object, d As Object
  6.     Set d = CreateObject("scripting.dictionary")
  7.     arr = Range("f2:f" & Range("f65536").End(xlUp).Row)
  8.     For i = 1 To UBound(arr)
  9.         d(arr(i, 1)) = ""
  10.     Next
  11.     Set obmapp = CreateObject("Shell.Application").BrowseForFolder(0, "请选择文件目录:", 0, 0)
  12.     If Not obmapp Is Nothing Then
  13.         fp = obmapp.Self.Path & ""
  14.     Else
  15.         Exit Sub
  16.     End If

  17.     m = 2
  18.     ReDim ary(1 To m)
  19.     ary(1) = fp
  20.     i = 1
  21.     Do While ary(i) <> ""
  22.         dirdir (ary(i))
  23.         i = i + 1
  24.     Loop
  25.     For Each cel In ary
  26.         If cel <> "" Then Call dirf(cel)
  27.     Next
  28.     Application.ScreenUpdating = False
  29.     For l = 1 To mm
  30.         With GetObject(arr_File(l))
  31.             arr = .Sheets(1).UsedRange
  32.             .Close False
  33.         End With
  34.         For i = 2 To UBound(arr)
  35.             If d.Exists(arr(i, 6)) Then
  36.                 n = n + 1
  37.                 brr(n, 1) = arr(i, 1)
  38.                 brr(n, 2) = "N"
  39.                 brr(n, 4) = arr(i, 4)
  40.             End If
  41.         Next
  42.     Next
  43.     Range("a2:d65536").ClearContents
  44.     If n > 0 Then [a2].Resize(n, 4) = brr
  45.     m = 0
  46.     mm = 0
  47.     Erase ary
  48.     Application.ScreenUpdating = True
  49. End Sub

  50. Sub dirdir(MyPath)
  51.     Dim MyName
  52.     MyName = Dir(MyPath, vbDirectory)
  53.     Do While MyName <> ""
  54.         If MyName <> "." And MyName <> ".." Then
  55.             If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
  56.                 m = m + 1
  57.                 ReDim Preserve ary(1 To m)
  58.                 ary(m - 1) = MyPath & MyName & ""
  59.             End If
  60.         End If
  61.         MyName = Dir
  62.     Loop
  63. End Sub

  64. Sub dirf(My_Path)
  65.     MyFileName = Dir(My_Path & "*.xls")
  66.     Do While MyFileName <> ""
  67.         If InStr(MyFileName, "mm") Then
  68.             mm = mm + 1
  69.             ReDim Preserve arr_File(1 To mm)
  70.             arr_File(mm) = My_Path & MyFileName
  71.         End If
  72.         MyFileName = Dir
  73.     Loop
  74. End Sub


复制代码

TA的精华主题

TA的得分主题

发表于 2012-2-1 16:53 | 显示全部楼层
请看附件:
查找提取.rar (19.92 KB, 下载次数: 90)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-1 20:55 | 显示全部楼层
非常感谢老师的无私帮助。我测试了一下程序,还有一些需要老师的指教:
1.有些数据和源文件mm1的不相符;2.第二个源文件mm2中的数据未提取;3.在实际运用中,目录是固定的(子目录不固定),是不是可以直接在程序里指定目录比如D:\项目 料单(不知道目录名可不可以带空格?);4.目的文件中的要查找的单元值有可能在多个源文件中存在,可以只调用第一次找到的或最后一次找的数值。5.目的文件的当前工作表名字不一定是sheets(1),可以指定名字吗比如"shuju"。问题有点多。希望老师还能继续支持,非常感谢!!!

查找提取_赵老师.rar

22.29 KB, 下载次数: 29

TA的精华主题

TA的得分主题

发表于 2012-2-1 21:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
qdsky 发表于 2012-2-1 20:55
非常感谢老师的无私帮助。我测试了一下程序,还有一些需要老师的指教:
1.有些数据和源文件mm1的不相符;2 ...

理解错了:
查找提取_赵老师.rar (22.88 KB, 下载次数: 127)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-1 21:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
老师真是太棒了!那么快就更新了,非常感谢!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-2 09:20 | 显示全部楼层
zhaogang1960 发表于 2012-2-1 21:12
理解错了:

您好,老师,程序应用在附件的例子中是完全正确的,但是今天在单位用于实际数据运行到n = d(arr(i, 6))时出现了报错“Run-time error "9"---Subscript out of range。不知道是什么原因,实际文件是比较多的,大概100多个,每个文件的工作表也比较多,有十来个,子目录也有很多。我尝试把例子中的文件和工作表都增加了不少,程序是没问题的。不知道为什么运用在单位的数据是报了这样的错。还望老师有空能帮忙看看。多谢了!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 11:44 , Processed in 0.041861 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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