VBA小程序--Find返回值(以及不适用On Error GOTO 方式处理的异常方式)遍历所有工作表 + 遍历文件夹内所有文件 查找是否有所需要搜索/检索的关键词

本文介绍了一款VBA小程序,能批量搜索Excel表格中的特定关键词。程序分为两部分,一是搜索当前工作簿所有工作表的关键词;二是遍历文件夹内所有Excel文件,搜索每个文件所有工作表的关键词。程序考虑了隐藏和筛选格式的影响,确保搜索结果准确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我这里是关键词是 "测试",逻辑是:现实情况中,不方便/不允许使用On Error的情况下,我们可换一个思路,可以判断是不是Nothing

业务场景(代码诞生原因):因为文件夹内有一堆表格,在要这一堆表格里面找是否含有别的厂家的名字...我有一百多个表格,一个个打开累死啦,所以就写了这个,替我进行搜索

说明文档:

1、仅对文件进行搜索,不会改动文件,保留文件完整性

2、中间加了分号,格式为:(工作簿;工作表;是否找到)加分号的意义在于方便分列,容易看出哪个表存在关键词

3、没有设定屏幕锁定,如果别人在你面前,屏幕不停闪烁运作,可以显得你很牛逼...

F、如果需更改关键词,直接把 “测试” 改成你需要的即可

5、如果需要其他的搜索条件,如搜索值,搜索公式等等,可以先录制宏,将Find代码替换掉即可~有问题亦可留言,看到会协助处理,谢谢~

6、目前仅适用于单层文件夹,不适合文件夹内嵌套文件夹的文件操作...递归我还不太会...

7、敲重点:请留意,因为个人本身业务场景情况需要,考虑到隐藏,和筛选等格式不规范,可能造成的影响,所以程序会取消筛选和隐藏

1、先说第一种情况:遍历所有工作表,是否存在某一个关键词

Sub VBA小程序_针对本工作簿所有工作表_搜索相关内容()
    Dim sht As Worksheet, a
    For Each sht In Worksheets
        sht.Activate
        '取消筛选,取消隐藏
        sht.AutoFilterMode = False
        Cells.EntireRow.Hidden = False
        Cells.EntireColumn.Hidden = False
        
        Set a = Cells.Find(What:="测试")
        'Debug.Print(),可以在立即窗口中查看返回内容,如果找不到,可以百度一下:VBA立即窗口怎么看,一看就会了?
        If Not a Is Nothing Then
            Debug.Print (ActiveWorkbook.name & ";" & sht.name & ";找到")
        Else
            Debug.Print (ActiveWorkbook.name & ";" & sht.name & ";找不到")
        End If
    Next
End Sub

2、第二种情况,再说遍历所有文件夹内所有文件,循环判断文件夹里 所有文件里面的 所有Sheet(工作表)是否存在某一个关键词(会弹窗提示用户选择文件夹路径,目前仅适用于单层文件夹,对于文件夹内还有文件夹的情况,暂时不适用


Sub VBA小程序_遍历文件夹内所有文件_搜索相关内容()
    Dim myPath$, myFile$, myPath1$, myPath2$, WB As Workbook, new_book As Workbook, yes_no '这个$ 是相当于定义字符串
    
    '调用函数,获取用户选择的文件夹,并且在最后加上一个反斜杠,用于下面的文件列表获取
    myPath2 = ChooseFolder  '这里的路径是没有加入最后的"\"的
    myPath = myPath2 & "\"
    
    myPath1 = InStrRev(myPath2, "\") '从右向左查找"\",返回其所在的位置,返回值是一个数字,但是最后会变成一个字符串,所以定义的时候也定义了一个字符串
    If myPath1 = 0 Then
        myPath1 = ""    '如果找不到"\",那么就说明用户选择是主硬盘,如:C:\\等,这样就 返回空值
    Else
        myPath1 = Right(myPath2, Len(myPath2) - myPath1) & "_" '如果不是空值,那么就直接可以使用Right提取,使用最开始没有"\"的myPath2这个变量,
    End If
    
    myFile = Dir(myPath & "*.xls*") '依次找寻指定路径中的*.xls,或者xlsx文件
    
    Do While myFile <> "" '当指定路径中有文件时进行循环
        If myFile <> ThisWorkbook.name Then     '如果我们这个宏文件在需要处理的文件夹之中,这个判断就会跳过下面的操作
            Set WB = Workbooks.Open(Filename:=myPath & myFile, UpdateLinks:=0) '打开符合要求的文件,并且如果遇到需要更新链接的时候,默认不更新
            Call 搜索确认
            WB.Close 0  '不保存关闭文件
        End If
        myFile = Dir '找寻下一个*.xls,或者xlsx文件
    Loop
    Set WB = Nothing    '释放变量内存
    MsgBox ("兄台,已完成")
End Sub

Public Function ChooseFolder() As String    '定义函数,用于下面的调用
    '定义并新建一个对话框对象
    Dim dlgOpen As FileDialog
    Set dlgOpen = Application.FileDialog(msoFileDialogFolderPicker)
    '如果当前没有对话框显示,就让他弹出对话框
    If dlgOpen.Show = -1 Then ChooseFolder = dlgOpen.SelectedItems(1)
    Set dlgOpen = Nothing
End Function

Function 搜索确认()
    Dim sht As Worksheet
    For Each sht In Worksheets
        sht.Activate
        '取消筛选,取消隐藏
        sht.AutoFilterMode = False
        Cells.EntireRow.Hidden = False
        Cells.EntireColumn.Hidden = False
        
        Set a = Cells.Find(What:="测试")
        If Not a Is Nothing Then
            Debug.Print (ActiveWorkbook.name & ";" & sht.name & ";找到")
        Else
            Debug.Print (ActiveWorkbook.name & ";" & sht.name & ";找不到")
        End If
    Next
End Function

 

<think>好的,用户想要将同一文件夹内的所有Excel文件汇总到一个工作簿中,需要使用VBA来实现。首先,我需要确认用户的需求:他们希望遍历某个文件夹中的所有Excel文件,然后将每个文件中的数据合并到一个主工作簿的工作表中,或者可能合并到同一个工作表中。过根据常见的需求,可能是每个文件的数据放到单独的工作表,或者全部合并到一个工作表。但用户的问题描述比较笼统,可能需要进一步明确,但作为通用解决方案,我可以先考虑将所有文件工作表内容合并到主工作簿的工作表中,每个文件对应一个工作表,并以原文件名命名。 接下来,我需要回忆VBA如何操作文件系统。通常,使用FileSystemObject或者Dir函数遍历文件夹中的文件。考虑到Excel版本兼容性,Dir函数可能更可靠,但FileSystemObject需要引用库,过可能在代码中后期绑定,使用CreateObject("Scripting.FileSystemObject")来避免引用问题。 然后,需要打开每个Excel文件,复制其中的工作表内容。这里需要注意的是,避免屏幕刷新和提示,以提高速度和用户体验。因此,在代码开始时应该关闭屏幕更新和警告提示,处理完后再恢复。 另外,处理过程中可能会遇到隐藏文件或者非Excel文件,需要过滤,只处理.xlsx、.xlsm、.xls等扩展名的文件。同时,需要排除主工作簿自身,否则会导致循环打开自身的问题。 接下来,代码的大致流程应该是: 1. 获取目标文件夹路径,可以使用Application.FileDialog来选择,方便用户操作。 2. 遍历文件夹中的所有Excel文件。 3. 对于每个文件,打开它,复制所有工作表内容到主工作簿的新建工作表中,并重命名工作表为原文件名。 4. 关闭打开的文件保存更改。 5. 处理完所有文件后,恢复屏幕更新和警告。 需要注意的错误处理包括:用户取消选择文件夹文件夹中没有Excel文件文件无法打开等情况,所以需要加入错误处理语句,如On Error Resume Next或者更详细的错误捕捉。 另外,是否需要合并所有数据到一个工作表?如果是的话,可能需要调整代码,遍历每个文件工作表,并将数据逐行追加到主工作表的末尾。但根据用户的问题描述,“汇总到同一工作簿内”可能意味着每个文件成为单独的工作表,因此代码应该按此处理。 现在,考虑代码的具体实现: - 使用Dir循环遍历文件,判断扩展名是否符合。 - 对于每个文件,使用Workbooks.Open打开,然后循环其工作表,复制到主工作簿。 - 这里可能需要避免复制整个工作表,而是复制数据区域,或者直接复制工作表。直接复制工作表会更高效,但需要注意名称冲突,因此可能需要重命名。 例如: For Each ws In wb.Worksheets ws.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) Next ws 然后,将新复制的工作表重命名为原文件名,但需要处理可能的重复名称和长度限制(工作表名称最长31字符)。 或者,每个文件的所有工作表都被复制过来,但用户可能希望每个文件对应一个工作表,可能每个文件只有一个工作表的情况。但实际情况可能每个文件有多个工作表,所以需要进一步明确。但用户可能希望将每个文件的所有内容合并,可能每个文件的所有工作表都被复制到主工作簿,导致主工作簿中有多个工作表,来自文件。或者,用户希望每个文件的数据被合并到一个工作表中,管原文件有多少工作表。这部分可能需要假设,但用户的问题描述太明确。因此,可能需要两种情况都考虑,但通常可能是每个文件的所有工作表被复制到主工作簿,作为单独的工作表,并以原文件名加上原工作表名命名,或者类似的。 但考虑到用户的问题是将所有Excel文件汇总到同一工作簿,可能更常见的是每个文件的数据被合并到同一工作表,或者每个文件作为单独的工作表。这里可能需要提供两种方式的代码,或者选择一种常见的情况。例如,每个文件作为一个单独的工作表,并以其文件名命名,而管原文件有多少工作表。但原文件可能有多个工作表,因此可能需要遍历所有工作表,并将每个工作表复制到主工作簿,同时命名可能包含文件名和工作表名。 但这样可能会导致主工作簿中有大量工作表,特别是当每个文件有多个工作表时。因此,可能需要询问用户需求,但作为解决方案,可能更倾向于将所有文件的所有工作表复制到主工作簿,并保留原名称,或者进行适当的命名。 但根据用户的问题,可能更简单的情况是每个Excel文件的内容被复制到主工作簿的一个工作表中,即每个文件对应一个工作表,包含其所有数据。或者可能每个文件可能有多个工作表,每个都被复制。但为了简化,可能需要假设每个文件只有一个工作表,或者将所有工作表合并到主工作簿的工作表中。 综合考虑,给出一个通用解决方案:遍历每个Excel文件,打开后将其所有工作表复制到主工作簿,并重命名工作表为原文件名加上原工作表名,避免重复。同时,处理打开和关闭文件时的各种情况,避免错误。 此外,代码需要放置在哪里?用户需要将代码放入VBA模块中,然后运行宏。因此,在回答中需要说明如何打开VBA编辑器,插入模块,粘贴代码,并运行。 最后,测试代码是否存在问题,比如是否排除了当前工作簿,是否正确处理文件格式,是否处理了隐藏或只读文件等。可能需要加入错误处理,例如跳过无法打开的文件。 现在,将这些思考整理成一个分步骤的解答,确保代码正确,并符合用户需求。</think>以下是使用VBA汇总同一文件夹内所有Excel文件到同一工作簿的分步解决方案: --- ### **步骤说明** 1. **创建新宏** - 按 `Alt + F11` 打开VBA编辑器 - 右键点击左侧项目栏 → 插入 → 模块 - 粘贴以下代码到模块中: ```vba Sub MergeAllWorkbooks() Dim folderPath As String Dim targetFile As String Dim mainWb As Workbook Dim sourceWb As Workbook Dim ws As Worksheet '关闭屏幕刷新和警告提示 Application.ScreenUpdating = False Application.DisplayAlerts = False '获取当前工作簿 Set mainWb = ThisWorkbook '选择文件夹路径 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "请选择包含Excel文件文件夹" If .Show = -1 Then folderPath = .SelectedItems(1) & "\" Else MsgBox "未选择文件夹,操作已取消。" Exit Sub End If End With '遍历文件夹中所有Excel文件 targetFile = Dir(folderPath & "*.xls*") Do While targetFile <> "" '跳过当前工作簿自身(避免重复) If folderPath & targetFile <> mainWb.FullName Then '打开源文件 Set sourceWb = Workbooks.Open(folderPath & targetFile) '复制所有工作表到主工作簿 For Each ws In sourceWb.Worksheets ws.Copy After:=mainWb.Sheets(mainWb.Sheets.Count) '重命名工作表为"文件名_原表名" On Error Resume Next '避免名称冲突报错 mainWb.Sheets(mainWb.Sheets.Count).Name = _ Replace(targetFile, ".xlsx", "") & "_" & ws.Name On Error GoTo 0 Next ws '关闭源文件保存 sourceWb.Close SaveChanges:=False End If targetFile = Dir Loop '恢复设置 Application.ScreenUpdating = True Application.DisplayAlerts = True MsgBox "合并完成!" End Sub ``` 2. **运行宏** - 返回Excel界面 → 按 `Alt + F8` → 选择 `MergeAllWorkbooks` → 点击“运行” - 在弹出的对话框中选择目标文件夹 --- ### **代码功能说明** 1. **自动选择文件夹** 使用系统对话框让用户自由选择文件夹,避免手动输入路径错误。 2. **遍历所有Excel文件** 支持 `.xlsx`, `.xlsm`, `.xls` 等常见格式,自动过滤非Excel文件。 3. **复制并重命名工作表** - 将每个文件的所有工作表复制到主工作簿末尾 -工作表命名格式为 `原文件名_原表名`(如 `销售数据_Sheet1`) 4. **防错处理** - 自动跳过当前工作簿自身 - 遇到重命名冲突时自动保留默认名称(如 `Sheet1 (2)`) --- ### **注意事项** 1. **文件兼容性** - 如果文件夹中包含Excel 97-2003格式的 `.xls` 文件,需确保本地Excel支持打开旧版本文件。 2. **性能优化** - 处理大量文件时,关闭 `ScreenUpdating` 和 `DisplayAlerts` 可显著提升速度。 3. **数据完整性** -文件中的公式会被转换为静态值,如需保留公式可修改代码中的 `ws.Copy` 为 `ws.UsedRange.Copy` 并手动粘贴。 --- ### **扩展场景** - **合并到单个工作表** 如需将所有数据追加到同一工作表,可修改循环部分: ```vba Dim lastRow As Long For Each ws In sourceWb.Worksheets lastRow = mainWb.Sheets("汇总表").Cells(Rows.Count, 1).End(xlUp).Row + 1 ws.UsedRange.Copy Destination:=mainWb.Sheets("汇总表").Cells(lastRow, 1) Next ws ``` - **过滤特定文件名** 在 `Dir` 循环中加入条件判断,例如仅处理包含“2023”的文件: ```vba If InStr(targetFile, "2023") > 0 Then '执行合并操作 End If ``` 如需进一步调整功能,请提供具体需求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值