ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA关于多工作簿查询包含指定的字符的应用(很难的)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-8-15 13:00 | 显示全部楼层
kevinchengcw 发表于 2010-10-28 20:32
Sub test()
Dim Dic, Wb As Workbook, Ws As Worksheet, Arr, N&, FN$, Str$, Rng As Range
Set Dic = Cr ...

kevinchengcw老师,您好
我的工作和楼主的工作内容很像,但我只需要被查询字符所在的工作表名(如果是重复的工作表名,我只需要它出现1次).您的代码应该怎样进行修改,请您抽空给我指导一下,谢谢

PS:前两天我发了张贴,little key版主建议我用VBA遍历工作簿中的内容,返回工作簿名称,这两天一直在想怎么编这些代码,今天有幸正好搜索到您关于这类问题的回复.我刚学VBA不久,知道用VBA实现,但不知道代码怎么编,呵,很多初学者的弊病.最后附带我前天提出的问题的帖,希望您给予指导,谢谢http://club.excelhome.net/thread-905702-1-1.html

TA的精华主题

TA的得分主题

发表于 2012-8-15 14:12 | 显示全部楼层
zhouxiao 发表于 2012-8-15 13:00
kevinchengcw老师,您好
我的工作和楼主的工作内容很像,但我只需要被查询字符所在的工作表名(如果是重复的 ...
  1. Sub test()
  2. Dim Dic As Object, Ws As Worksheet, Arr, Arr2, Result, N&, I!, FN$, Str$, Str2$
  3. Set Dic = CreateObject("scripting.dictionary")
  4. Str = InputBox("查找内容:", "输入")
  5. If Str = "" Then Exit Sub
  6. Application.ScreenUpdating = False
  7. FN = Dir(ThisWorkbook.Path & "\*.xls?")
  8. Do While FN <> ""
  9.     If FN <> ThisWorkbook.Name Then
  10.         With GetObject(ThisWorkbook.Path & "" & FN)
  11.             For Each Ws In .Worksheets
  12.                 Set Rng = Ws.Cells.Find(Str)
  13.                 If Not Rng Is Nothing Then
  14.                     Str2 = Left(.Name, InStrRev(.Name, ".") - 1) & vbTab & Ws.Name & vbTab & Rng.Value
  15.                     If Not Dic.exists(Str2) Then Dic(Str2) = ""
  16.                     Set Rng = Nothing
  17.                 End If
  18.             Next Ws
  19.             .Close False
  20.         End With
  21.     End If
  22.     FN = Dir
  23. Loop
  24. With Worksheets("查询")
  25.     .Rows("3:" & .Rows.Count).Clear
  26.     If Dic.Count > 0 Then
  27.         Arr = Dic.keys
  28.         ReDim Result(1 To Dic.Count, 1 To 3)
  29.         For N = LBound(Arr) To UBound(Arr)
  30.             Arr2 = Split(Arr(N), vbTab)
  31.             For I = LBound(Arr2) To UBound(Arr2)
  32.                 Result(N + 1, I + 1) = Arr2(I)
  33.             Next I
  34.         Next N
  35.         With .[a3].Resize(UBound(Dic.Count, 3))
  36.             .Value = Result
  37.             .Borders.LineStyle = 1
  38.         End With
  39.         MsgBox "查找完成"
  40.     Else
  41.         MsgBox "不存在你要搜索的内容"
  42.     End If
  43. End With
  44. Set Dic = Nothing
  45. Application.ScreenUpdating = True
  46. End Sub
复制代码
是这个意思吗?

TA的精华主题

TA的得分主题

发表于 2012-8-15 14:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
kevinchengcw 发表于 2012-8-15 14:12
是这个意思吗?

谢谢您,我先试一上看

TA的精华主题

TA的得分主题

发表于 2012-8-15 15:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zhouxiao 于 2012-8-15 15:16 编辑
kevinchengcw 发表于 2012-8-15 14:12
是这个意思吗?


老师,您好,您修改后的代码我试过了,到with .[a3].resize(ubound(dic.count,3))这句的时候,类型不匹配,报错(见下图)
报错.jpg
下面这张图片是我要的结果,用您修改前的代码运行的结果,总共有708行数据
但我只需要其中的30行数据,因为其它的文件名都是重复的,如下图(我删除重复项以后的结果)
查询结果2.jpg

TA的精华主题

TA的得分主题

发表于 2012-8-15 16:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. With .[a3].Resize(UBound(Dic.Count, 3))
复制代码
手误,应为
  1. With .[a3].Resize(Dic.Count, 3)
复制代码
工作表名重复还是工作簿名重复?

TA的精华主题

TA的得分主题

发表于 2012-8-17 09:08 | 显示全部楼层
kevinchengcw 发表于 2012-8-15 16:54
手误,应为工作表名重复还是工作簿名重复?

工作簿名重复

TA的精华主题

TA的得分主题

发表于 2012-8-17 09:57 | 显示全部楼层
  1. Sub test()
  2. Dim Dic As Object, Ws As Worksheet, Arr, Arr2, Result, N&, I!, FN$, Str$, Str2$
  3. Set Dic = CreateObject("scripting.dictionary")
  4. Str = InputBox("查找内容:", "输入")
  5. If Str = "" Then Exit Sub
  6. Application.ScreenUpdating = False
  7. FN = Dir(ThisWorkbook.Path & "\*.xls?")
  8. Do While FN <> ""
  9.     If FN <> ThisWorkbook.Name Then
  10.         With GetObject(ThisWorkbook.Path & "" & FN)
  11.             For Each Ws In .Worksheets
  12.                 Set Rng = Ws.Cells.Find(Str)
  13.                 If Not Rng Is Nothing Then
  14.                     Str2 = Left(.Name, InStrRev(.Name, ".") - 1)
  15.                     Dic(Str2) = ""
  16.                     Set Rng = Nothing
  17.                 End If
  18.             Next Ws
  19.             .Close False
  20.         End With
  21.     End If
  22.     FN = Dir
  23. Loop
  24. With Worksheets("查询")
  25.     .Rows("3:" & .Rows.Count).Clear
  26.     If Dic.Count > 0 Then
  27.         With .[a3].Resize(Dic.Count)
  28.             .Value = Application.Transpose(Dic.keys)
  29.             .Borders.LineStyle = 1
  30.         End With
  31.         MsgBox "查找完成"
  32.     Else
  33.         MsgBox "不存在你要搜索的内容"
  34.     End If
  35. End With
  36. Set Dic = Nothing
  37. Application.ScreenUpdating = True
  38. End Sub
复制代码
试这个

TA的精华主题

TA的得分主题

发表于 2012-8-17 13:56 | 显示全部楼层
kevinchengcw 发表于 2012-8-17 09:57
试这个

老师辛苦了,谢谢

TA的精华主题

TA的得分主题

发表于 2012-8-25 09:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 工作状态 于 2012-8-25 09:42 编辑
kevinchengcw 发表于 2012-8-17 09:57
试这个

太谢谢kevinchengcw老师了,这个方法解决了工作中很大的劳动量,十分感谢!我和楼主遇到的问题很相像,但是比楼主多一个工作内容,就是要把包含关键字符所在的整行也提取出来。kevinchengcw老师可不可以教一下怎么在满足楼主现有要求的前提下,即在序号-工作簿名-工作表名-单元格地址-单元格内容后面把关键字符所在的整行也提取出来。至于备注,就不需要了,因为现在提取整行,已经把原来网友增加备注功能(后2个单元格内容)满足了。工作中大量需要,求kevinchengcw老师指点!万分感谢!

TA的精华主题

TA的得分主题

发表于 2012-8-25 10:09 | 显示全部楼层
工作状态 发表于 2012-8-25 09:20
太谢谢kevinchengcw老师了,这个方法解决了工作中很大的劳动量,十分感谢!我和楼主遇到的问题很相像,但 ...

试下附件 工作簿1.rar (19.53 KB, 下载次数: 141)

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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