Поиск по многим книгам (Microsoft Excel)
У Амита есть папка, в которой хранятся сотни книг 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), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (5598) относится к Microsoft Excel 97, 2000, 2002 и 2003.