Я пытаюсь создать формулу, чтобы получить строку текста, указанную в A3 (текст T1234-1234), и найти эту строку в другой книге по указанной строке, но на всех листах, пока не найдено совпадение, и вернуть другое ячейка в листе, в котором выполняется поиск.

Ниже то, что я работаю до сих пор. Эта формула может только искать указанный лист (4372666_A.TXT) в ячейке A6 и возвращать значение, расположенное в ячейке A7 только если A3 находится в ячейке A6 на листе 4372666_A.TXT .

Там будет примерно 100 листов, которые нужно искать за один раз.

=IF(ISNUMBER(SEARCH(A3,'[EDICONFTESTEXCEL.xlsm]4372666_A.TXT'!$A$6)),LEFT(RIGHT('[EDICONFTESTEXCEL.xlsm]4372666_A.TXT'!$A$7,9),7),A3)

2 ответа2

0

Я хотел бы предложить вам код VBA, который будет искать текстовую строку во всех рабочих книгах любой выбранной папки и возвращать полную информацию, такую как имя рабочей книги, имя листа, адрес ячейки и текстовая строка.

Введите приведенный ниже код в качестве модуля на любой существующий лист.

    Sub SearchWorkbooks()

    Dim xFso As Object
    Dim xFld As Object
    Dim xStrSearch As String
    Dim xStrPath As String
    Dim xStrFile As String
    Dim xOut As Worksheet
    Dim xWb As Workbook
    Dim xWk As Worksheet
    Dim xRow As Long
    Dim xFound As Range
    Dim xStrAddress As String
    Dim xFileDialog As FileDialog
    Dim xUpdate As Boolean
    Dim xCount As Long

    On Error GoTo ErrHandler

    Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    xFileDialog.AllowMultiSelect = False
    xFileDialog.Title = "Select the forlder"
    If xFileDialog.Show = -1 Then
        xStrPath = xFileDialog.SelectedItems(1)
    End If

    If xStrPath = "" Then Exit Sub
    xStrSearch = "Ravi"
    xUpdate = Application.ScreenUpdating
    Application.ScreenUpdating = False
    Set xOut = Worksheets.Add
    xRow = 1
    With xOut
        .Cells(xRow, 1) = "Workbook"
        .Cells(xRow, 2) = "Worksheet"
        .Cells(xRow, 3) = "Cell"
        .Cells(xRow, 4) = "Text in Cell"

        Set xFso = CreateObject("Scripting.FileSystemObject")
        Set xFld = xFso.GetFolder(xStrPath)
        xStrFile = Dir(xStrPath & "\*.xlsm*")

        Do While xStrFile <> ""
            Set xWb = Workbooks.Open(Filename:=xStrPath & "\" & xStrFile, UpdateLinks:=0, ReadOnly:=True, AddToMRU:=False)
            For Each xWk In xWb.Worksheets
                Set xFound = xWk.UsedRange.Find(xStrSearch)
                If Not xFound Is Nothing Then
                    xStrAddress = xFound.Address
                End If
                Do
                    If xFound Is Nothing Then
                        Exit Do
                    Else
                        xCount = xCount + 1
                        xRow = xRow + 1
                        .Cells(xRow, 1) = xWb.Name
                        .Cells(xRow, 2) = xWk.Name
                        .Cells(xRow, 3) = xFound.Address
                        .Cells(xRow, 4) = xFound.value
                    End If
                    Set xFound = xWk.Cells.FindNext(After:=xFound)
                Loop While xStrAddress <> xFound.Address
            Next
            xWb.Close (False)
            xStrFile = Dir
        Loop
        .Columns("A:D").EntireColumn.AutoFit
    End With
    MsgBox xCount & "cells have been found", , "Search String Across WBKs"
ExitHandler:
    Set xOut = Nothing
    Set xWk = Nothing
    Set xWb = Nothing
    Set xFld = Nothing
    Set xFso = Nothing
    Application.ScreenUpdating = xUpdate
    Exit Sub
ErrHandler:
    MsgBox Err.Description, vbExclamation
    Resume ExitHandler
End Sub

Как это устроено:

  • Запустите этот макрос.
  • Откроется диалоговое окно «Диспетчер файлов».
  • Выберите папку, в которой хранятся все рабочие книги.
  • Готово с ОК.

Excel отобразит окно сообщения о том, сколько текстовых строк было найдено. Наконец, новый лист будет создан для отображения результатов, как показано ниже.

NB

  • xStrSearch = "Рави", а также.Столбцы ("A:D").EntireColumn.AutoFit, доступны для редактирования.

  • Вы можете заменить "Ravi" другой строкой, а столбец A:D - другой.

0

Вот хороший и простой UDF, который работает аналогично встроенной функции SEARCH() , за исключением того, что он ищет все рабочие таблицы и возвращает значение другой ячейки вместо индекса:

'============================================================================================
' Module     : <any standard module>
' Version    : 0.1.0
' Part       : 1 of 1
' References : N/A
' Source     : https://superuser.com/a/1332265/763880
'============================================================================================
Option Explicit

Public Function SEARCHALLSHEETS _
                ( _
                           ByVal find_text As String, _
                           ByVal within_cell As Range, _
                           ByVal return_cell As Range _
                ) _
       As Variant

  Dim strWithinCell As String: strWithinCell = within_cell.Address
  Dim strReturnCell As String: strReturnCell = return_cell.Address

  Dim wkstWorksheet As Worksheet
  For Each wkstWorksheet In within_cell.Parent.Parent.Worksheets
    If InStr(wkstWorksheet.Range(strWithinCell), find_text) > 0 Then
      Dim varReturnValue As Variant
      varReturnValue = wkstWorksheet.Range(strReturnCell).Value2
      Exit For
    End If
  Next wkstWorksheet
  SEARCHALLSHEETS = IIf(IsEmpty(varReturnValue), CVErr(xlErrValue), varReturnValue)

End Function


Использование: SEARCHALLSHEETS(find_text, within_cell, return_cell)

После установки вы используете ее, предоставляя целевую ячейку поиска и возвращаемую ячейку на любом листе книги, и он будет искать все листы этой книги.

Если он не может найти текст поиска ни в одной из таблиц, он возвращает # #VALUE! ошибка, как это делает функция SEARCH() .


Ваша формула должна быть переписана, чтобы обнаружить ошибку, а не число, чтобы определить, было ли найдено совпадение. Кроме того, его также необходимо изменить, чтобы использовать новое возвращаемое значение.

Это ваша обновленная формула:

=IFERROR(LEFT(RIGHT(SEARCHALLSHEETS(A3,[EDICONFTESTEXCEL.xlsm]Sheet1!$A$6,[EDICONFTESTEXCEL.xlsm]Sheet1!$A$7),9),7),A3)

Существует альтернативное, более прямое преобразование вашей формулы, но оно намного дольше. Я включил его здесь для вашей справки:

=IF(NOT(ISERROR(SEARCHALLSHEETS(A3,'[EDICONFTESTEXCEL.xlsm]4372666_A.TXT'!$A$6,'[EDICONFTESTEXCEL.xlsm]4372666_A.TXT'!$A$7))),LEFT(RIGHT(SEARCHALLSHEETS(A3,'[EDICONFTESTEXCEL.xlsm]4372666_A.TXT'!$A$6,'[EDICONFTESTEXCEL.xlsm]4372666_A.TXT'!$A$7),9),7),A3)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .