ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-10-30 03:05 | 显示全部楼层

回复 16楼 wangzhongtu 的帖子

我本来是打算一次就打开的,因为我的系统是win7,打开相同的程序都组合在一起了,没注意到同时打开很多workbook任务栏的问题。我已经按照修改了下程序了。另谢谢楼上的那个getobject函数,这个得确好用。

2010 - Copy.rar

65.03 KB, 下载次数: 199

TA的精华主题

TA的得分主题

发表于 2010-10-30 10:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
21楼的速度快,20楼的把“A1"单元的搜索排除在外了,
对位的思路学习了!

TA的精华主题

TA的得分主题

发表于 2010-10-30 10:51 | 显示全部楼层
Sub test()
Dim Dic, Wb As Workbook, Ws As Worksheet, Arr, N&, FN$, Str$, Rng As Range, Str2$
Set Dic = CreateObject("scripting.dictionary")
Str = InputBox("查找内容:", "输入")
If Str = "" Then Exit Sub
Application.ScreenUpdating = False
FN = Dir(ThisWorkbook.Path & "\*.xls*")
Do While FN <> ""
    If FN <> ThisWorkbook.Name Then
        Set Wb = GetObject(ThisWorkbook.Path & "\" & FN)
        With Wb
            For Each Ws In .Worksheets
                With Ws
                    If WorksheetFunction.CountIf(.UsedRange, "*" & Str & "*") <> 0 Then
                        Set Rng = .UsedRange.Find(Str)
                        Do
                            Str2 = Left(Wb.Name, InStrRev(Wb.Name, ".") - 1) & vbTab & Ws.Name & vbTab & Replace(Rng.Address, "$", "") & vbTab & Rng.Value & vbTab & Rng.Offset(0, 2).Value
                            If Not Dic.exists(Str2) Then Dic.Add Str2, ""
                            Set Rng = .UsedRange.Find(Str, Rng)
                        Loop While .UsedRange.Find(Str).Address <> Rng.Address
                    End If
                End With
            Next Ws
        End With
        Wb.Close False
    End If
    FN = Dir
Loop
Set Wb = Nothing
With Worksheets("查询")
    .Rows("3:" & .Rows.Count).Clear
    If Dic.Count > 0 Then
        Arr = Dic.keys
        For N = LBound(Arr) To UBound(Arr)
            .Cells(N + 3, 1) = N + 1
            .Cells(N + 3, 2).Resize(1, 5) = Split(Arr(N), vbTab)
        Next N
        .[a3].Resize(N, 6).Borders.LineStyle = 1
    End If
End With
Set Dic = Nothing
Application.ScreenUpdating = True
MsgBox "查找完成"
End Sub

继续优化

TA的精华主题

TA的得分主题

发表于 2010-10-30 15:11 | 显示全部楼层
无意走进了VAB,路过,本人很菜,看不懂代码,不过很喜欢EXCELHOME这个家的这个感觉!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-10-30 19:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复21楼 ericjon

1.你的程序测试我5月份的100份工作簿,非常成功,用时49.32秒
2.当测试到其它月份的几十份工作簿时,却发现问题:
If Len(tempCell.Value) > 0 Then提示这句代码出错
出错001-1.jpg
出错001-2.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-10-30 20:03 | 显示全部楼层

回复23楼 kevinchengcw

我找了好久的病因,排除了n份工作簿没问题,最终确定了其中一份工作簿不能成功,刚想上传发现23楼还有你修改过的程序代码,现在用过感觉特别好用,暂时没发现其它什么问题

刚才用你的程序测试我5月份的100份工作簿,非常成功,用时43.97秒
对其它的月份的工作簿测试过也很成功!!!

对了,能否再增加一个简单的提示:如果查找不到要搜索的关键字,那么程序结束前提示“你要搜索的信息不存在!”的对话框,这样看起来会更好点!!!

[ 本帖最后由 wangzhongtu 于 2010-10-30 20:06 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-10-30 20:06 | 显示全部楼层
Sub test()
Dim Dic, Wb As Workbook, Ws As Worksheet, Arr, N&, FN$, Str$, Rng As Range, Str2$
Set Dic = CreateObject("scripting.dictionary")
Str = InputBox("查找内容:", "输入")
If Str = "" Then Exit Sub
Application.ScreenUpdating = False
FN = Dir(ThisWorkbook.Path & "\*.xls*")
Do While FN <> ""
    If FN <> ThisWorkbook.Name Then
        Set Wb = GetObject(ThisWorkbook.Path & "\" & FN)
        With Wb
            For Each Ws In .Worksheets
                With Ws
                    If WorksheetFunction.CountIf(.UsedRange, "*" & Str & "*") <> 0 Then
                        Set Rng = .UsedRange.Find(Str)
                        Do
                            Str2 = Left(Wb.Name, InStrRev(Wb.Name, ".") - 1) & vbTab & Ws.Name & vbTab & Replace(Rng.Address, "$", "") & vbTab & Rng.Value & vbTab & Rng.Offset(0, 2).Value
                            If Not Dic.exists(Str2) Then Dic.Add Str2, ""
                            Set Rng = .UsedRange.Find(Str, Rng)
                        Loop While .UsedRange.Find(Str).Address <> Rng.Address
                    End If
                End With
            Next Ws
        End With
        Wb.Close False
    End If
    FN = Dir
Loop
Set Wb = Nothing
With Worksheets("查询")
    .Rows("3:" & .Rows.Count).Clear
    If Dic.Count > 0 Then
        Arr = Dic.keys
        For N = LBound(Arr) To UBound(Arr)
            .Cells(N + 3, 1) = N + 1
            .Cells(N + 3, 2).Resize(1, 5) = Split(Arr(N), vbTab)
        Next N
        .[a3].Resize(N, 6).Borders.LineStyle = 1
        MsgBox "查找完成"
    else
        msgbox "不存在你要搜索的内容"
    End If
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub

[ 本帖最后由 kevinchengcw 于 2010-10-30 20:08 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-10-30 20:42 | 显示全部楼层
太好了 非常感谢!!!

TA的精华主题

TA的得分主题

发表于 2010-10-30 22:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
已经下载使用,的确非常好,21楼的运行发生错误,是那句宽度属性样有问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-11-4 12:41 | 显示全部楼层

请高手帮助解释下代码中的以下几个问题:

请高手帮助解释下程序代码中的以下几个问题:

1.这句的函数什么意思?怎么使用?
InStrRev(Wb.Name, ".") - 1
2.两句什么意思?有什么区别:
&nbsp;Set Rng = .UsedRange.Find(Str)
Set Rng = .UsedRange.Find(Str, Rng)
3.为什么后面带上“, ""”符号,起到什么作用
If Not Dic.exists(Str2) Then Dic.Add Str2, ""
"4.句中Split(Arr(N), vbTab)的函数不是向右截掉vbTab的开始的所有内容吗,
这个vbTab符号在Str中出现了很多,按理说应该只保留工作簿名呀,请解释下"
.Cells(N + 3, 2).Resize(1, 5) = Split(Arr(N), vbTab)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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