Amit的文件夹包含数百个Excel工作簿。他需要在所有工作簿中搜索一些特定的文本,并想知道是否存在一种方法可以搜索所有工作簿并确定包含所需文本的工作簿的名称以及包含该文本的工作簿中的单元格。

查找哪些工作簿包含所需的文本相对容易。您所需要做的就是使用Windows的“搜索”功能在单个文件夹中查找包含所需文本的文件。虽然它不会告诉您单元格的位置,但它将在文件列表中向下滚动。

当然,您可以使用宏进行搜索。 (使用宏来完成冗长而繁琐的工作,否则通常要手动完成,这始终是一个好主意。)以下内容将逐步浏览文件夹中的所有工作簿,并搜索要查找的内容。它将打开任何以xls *结尾的文件(后缀星号表示它将搜索xls,xlsx和xlsm文件)。

Sub SearchFolders()

Dim fso As Object     Dim fld As Object     Dim strSearch As String     Dim strPath As String     Dim strFile As String     Dim wOut As Worksheet     Dim wbk As Workbook     Dim wks As Worksheet     Dim lRow As Long     Dim rFound As Range     Dim strFirstAddress As String

On Error GoTo ErrHandler     Application.ScreenUpdating = False

'Change as desired     strPath = "c:\MyFolder"

strSearch = "Specific text"



Set wOut = Worksheets.Add     lRow = 1     With wOut         .Cells(lRow, 1) = "Workbook"

.Cells(lRow, 2) = "Worksheet"

.Cells(lRow, 3) = "Cell"

.Cells(lRow, 4) = "Text in Cell"

Set fso = CreateObject("Scripting.FileSystemObject")

Set fld = fso.GetFolder(strPath)



strFile = Dir(strPath & "\.xls")

Do While strFile <> ""

Set wbk = Workbooks.Open _               (Filename:=strPath & "\" & strFile, _               UpdateLinks:=0, _               ReadOnly:=True, _               AddToMRU:=False)



For Each wks In wbk.Worksheets                 Set rFound = wks.UsedRange.Find(strSearch)

If Not rFound Is Nothing Then                     strFirstAddress = rFound.Address                 End If                 Do                     If rFound Is Nothing Then                         Exit Do                     Else                         lRow = lRow + 1                         .Cells(lRow, 1) = wbk.Name                         .Cells(lRow, 2) = wks.Name                         .Cells(lRow, 3) = rFound.Address                         .Cells(lRow, 4) = rFound.Value                     End If                     Set rFound = wks.Cells.FindNext(After:=rFound)

Loop While strFirstAddress <> rFound.Address             Next

wbk.Close (False)

strFile = Dir         Loop         .Columns("A:D").EntireColumn.AutoFit     End With     MsgBox "Done"



ExitHandler:

Set wOut = Nothing     Set wks = Nothing     Set wbk = Nothing     Set fld = Nothing     Set fso = Nothing     Application.ScreenUpdating = True     Exit Sub

ErrHandler:

MsgBox Err.Description, vbExclamation     Resume ExitHandler End Sub

要根据需要定制例程,请更改strPath变量以反映要处理的文件夹的路径,并更改strSearch以反映要搜索的文本。宏将创建一个新的工作表,并将“匹配项”放入每一行。 A列包含工作簿名称,B列包含工作表名称,C列包含单元格地址,D列包含该单元格的内容。

显然,像这样的任何宏都需要花费很多时间才能运行。您可以通过减少搜索所需的文件数量来稍微缩短时间。最好的方法是使用Windows Search方法(在本技巧开始时介绍)来标识所需文本所在的工作簿。将那些工作簿移动到它们自己的文件夹,然后在该文件夹上进行宏搜索。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(5598)适用于Microsoft Excel 97、2000、2002和2003。