ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-2-2 10:25 | 显示全部楼层
qdsky 发表于 2012-2-2 09:20
您好,老师,程序应用在附件的例子中是完全正确的,但是今天在单位用于实际数据运行到n = d(arr(i, 6))时 ...

不用n = d(arr(i, 6))了,直接判断字典是否存在:
查找提取_赵老师.rar (22.99 KB, 下载次数: 33)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-2 12:24 | 显示全部楼层
在运行到If d.Exists(arr(i, 6)) Then语句时还是出现了同样的错误9。我试着重新建立一个目录,其中只含有要查找的字符的文件,结果只运行到With GetObject(arr_File(l))语句就出现了另外一个错误Run-time error"-2147467259(80004005):Automation error,Unspecified error".是我的文件有问题,文件的格式和例子中是一样的,就是名称是类似“1AA123456B01”这样的,或是什么别的原因,还希望老师不要烦我了,再帮帮我。谢谢!

TA的精华主题

TA的得分主题

发表于 2012-2-2 12:57 | 显示全部楼层
qdsky 发表于 2012-2-2 12:24
在运行到If d.Exists(arr(i, 6)) Then语句时还是出现了同样的错误9。我试着重新建立一个目录,其中只含有要 ...

估计是文件类型有问题,请上传出错的文件分析一下

TA的精华主题

TA的得分主题

发表于 2012-2-2 23:41 | 显示全部楼层
邮件收到,没有测试出问题,修改一句判断F列有数据试试看:
  1. Dim arr_File()
  2. Dim ary(), m As Long, mm As Long

  3. Sub Macro1()
  4.     Dim arr, brr(), n, i As Long, sh As Worksheet
  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)) = i
  10.     Next
  11.     ReDim brr(1 To i - 1, 1 To 4)
  12.     Set obmapp = CreateObject("Shell.Application").BrowseForFolder(0, "请选择文件目录:", 0, 0)
  13.     If Not obmapp Is Nothing Then
  14.         fp = obmapp.Self.Path & ""
  15.     Else
  16.         Exit Sub
  17.     End If
  18.     m = 2
  19.     ReDim ary(1 To m)
  20.     ary(1) = fp
  21.     i = 1
  22.     Do While ary(i) <> ""
  23.         dirdir (ary(i))
  24.         i = i + 1
  25.     Loop
  26.     For Each cel In ary
  27.         If cel <> "" Then Call dirf(cel)
  28.     Next
  29.     Application.ScreenUpdating = False
  30.     For l = 1 To mm
  31.         With GetObject(arr_File(l))
  32.             For Each sh In .Sheets
  33.                 If sh.[f65536].End(xlUp).Row > 1 Then 'F列有数据
  34.                     arr = sh.UsedRange
  35.                     For i = 2 To UBound(arr)
  36.                         n = d(arr(i, 6))
  37.                         If n <> "" Then
  38.                             brr(n, 1) = arr(i, 1)
  39.                             brr(n, 2) = "N"
  40.                             brr(n, 4) = arr(i, 4)
  41.                         End If
  42.                     Next
  43.                 End If
  44.             Next
  45.             .Close False
  46.         End With
  47.     Next
  48.     Range("a2:d65536").ClearContents
  49.     [a2].Resize(UBound(brr), 4) = brr
  50.     m = 0
  51.     mm = 0
  52.     Erase ary
  53.     Application.ScreenUpdating = True
  54. End Sub

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

  69. Sub dirf(My_Path)
  70.     MyFileName = Dir(My_Path & "*.xls")
  71.     Do While MyFileName <> ""
  72.         If InStr(MyFileName, "mm") Then
  73.             mm = mm + 1
  74.             ReDim Preserve arr_File(1 To mm)
  75.             arr_File(mm) = My_Path & MyFileName
  76.         End If
  77.         MyFileName = Dir
  78.     Loop
  79. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-3 11:36 | 显示全部楼层
谢谢老师不厌其烦的帮助,可能是某些文件有问题,有时还是会出现上面提到的问题,有时又不出现,我也不知道哪里设置不对。但同时我又发现一个新问题,就是如果目标文件中的要查找的字符有重复的话,查找赋值的结果只会显示在最后一行。比如aaa同时在第一和第二行,则运行程序后只会在第二行写入数据,第一行没有变化。还请老师再看看。万分感谢!!!

TA的精华主题

TA的得分主题

发表于 2012-2-3 12:26 | 显示全部楼层
qdsky 发表于 2012-2-3 11:36
谢谢老师不厌其烦的帮助,可能是某些文件有问题,有时还是会出现上面提到的问题,有时又不出现,我也不知道 ...

一般字典查询就是这样子,请上传你想要的结果

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-3 12:41 | 显示全部楼层
老师看这样的结果能不能做到?
重复值的结果.jpg

TA的精华主题

TA的得分主题

发表于 2012-2-3 17:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
qdsky 发表于 2012-2-3 12:41
老师看这样的结果能不能做到?
  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 6), n&, i As Long, sh As Worksheet
  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. '    ReDim brr(1 To i - 1, 1 To 4)
  12.     Set obmapp = CreateObject("Shell.Application").BrowseForFolder(0, "请选择文件目录:", 0, 0)
  13.     If Not obmapp Is Nothing Then
  14.         fp = obmapp.Self.Path & ""
  15.     Else
  16.         Exit Sub
  17.     End If
  18.     m = 2
  19.     ReDim ary(1 To m)
  20.     ary(1) = fp
  21.     i = 1
  22.     Do While ary(i) <> ""
  23.         dirdir (ary(i))
  24.         i = i + 1
  25.     Loop
  26.     For Each cel In ary
  27.         If cel <> "" Then Call dirf(cel)
  28.     Next
  29.     Application.ScreenUpdating = False
  30.     For l = 1 To mm
  31.         With GetObject(arr_File(l))
  32.             For Each sh In .Sheets
  33.                 If sh.[f65536].End(xlUp).Row > 1 Then 'F列有数据
  34.                     arr = sh.UsedRange
  35.                     For i = 2 To UBound(arr)
  36. '                        n = d(arr(i, 6))
  37.                         If d.Exists(arr(i, 6)) Then
  38.                             n = n + 1
  39.                             brr(n, 1) = arr(i, 1)
  40.                             brr(n, 2) = "N"
  41.                             brr(n, 4) = arr(i, 4)
  42.                             brr(n, 6) = arr(i, 6)
  43.                         End If
  44.                     Next
  45.                 End If
  46.             Next
  47.             .Close False
  48.         End With
  49.     Next
  50.     Range("a2:d65536").ClearContents
  51.     [a2].Resize(UBound(brr), 6) = brr
  52.     m = 0
  53.     mm = 0
  54.     Erase ary
  55.     Application.ScreenUpdating = True
  56. End Sub

  57. Sub dirdir(MyPath)
  58.     Dim MyName
  59.     MyName = Dir(MyPath, vbDirectory)
  60.     Do While MyName <> ""
  61.         If MyName <> "." And MyName <> ".." Then
  62.             If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
  63.                 m = m + 1
  64.                 ReDim Preserve ary(1 To m)
  65.                 ary(m - 1) = MyPath & MyName & ""
  66.             End If
  67.         End If
  68.         MyName = Dir
  69.     Loop
  70. End Sub

  71. Sub dirf(My_Path)
  72.     MyFileName = Dir(My_Path & "*.xls")
  73.     Do While MyFileName <> ""
  74.         If InStr(MyFileName, "mm") Then
  75.             mm = mm + 1
  76.             ReDim Preserve arr_File(1 To mm)
  77.             arr_File(mm) = My_Path & MyFileName
  78.         End If
  79.         MyFileName = Dir
  80.     Loop
  81. End Sub


复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-3 19:32 | 显示全部楼层
都不知道用什么词表示感谢了,再次谢谢老师!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-8 16:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 qdsky 于 2012-2-8 16:43 编辑
zhaogang1960 发表于 2012-2-3 17:10


老师,您好,这几天没有仔细测试程序,今天再测试的时候发现了一个问题。运行程序后得到的结果是:将文件的F列更改了,运行吧原文件F列中能查找到的值放到了F列,并且在源文件中查找到几次就重复几次,没找的值就没有了。问题是运行前文件的F列是需要完全保持的,只需根据查找内容赋值它的A,B,D列。F列如有相同的值,需要每行的A,B, D 列都赋值,而不是在指定目录中能找到的次数。我上传了一下运行前后的文件,希望老师能再帮助!谢谢!!! 查找提取test.zip (32.78 KB, 下载次数: 27)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 13:35 , Processed in 0.046807 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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