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

Вопрос или проблема

Моя рабочая книга содержит 24 листа, мы занимаемся сопоставлением политик.

24-й лист (или вкладка) содержит колонку с диапазоном A2:1190 с терминами, такими как “AC-1”, “AC-2(2)”.

Я хочу искать эти отдельные термины на всех 24 листах рабочей книги и просто получить имя вкладки, на которой они встречаются; совпадение должно быть точным, потому что у нас также есть термины, такие как “A-19”, поэтому я не могу, чтобы “A-1” возвращал имя вкладки для “A-19”, это было бы серьезной ошибкой.

Результаты должны отображать как искомый термин, так и соответствующее имя листа, все выводы в новом листе, и если совпадение не найдено (что является случаем для 50% записей), то должно быть указано “нет”.

Для некоторых поисковых терминов они могут появляться на нескольких листах, и все они должны быть перечислены, было бы еще лучше, если бы мы могли перечислить каждое имя листа в новом столбце!

Я пробовал это с chatgpt, и он предложил VBA скрипт и вроде как что-то получилось, но это не очень хорошо!

Из вывода от chatgpt я чувствую, что это на 100% возможно сделать, но обработка ошибок вызывает опасения!

Например:

Допустим, у нас есть 6 листов: alphasheet, beta, gamma, theta, vega, searchsheet

На листе searchsheet: у нас есть A2:A1190 с терминами AC-1, AC-2, AC-2(1), AC-2(2), … AC-19, AC-19(2), … и так до SR-1

Нам нужно искать эти отдельные термины на других 5 листах и выводить имя листа, например:

Термин Листы с результатами Листы с результатами2
AC-1 alpha sheet beta-sheet

Это VBA скрипт от chatgpt:

Sub SearchWorksheetsWithExactMatches()
    Dim ws As Worksheet, searchWs As Worksheet
    Dim searchRange As Range, cell As Range, foundCell As Range
    Dim resultsWs As Worksheet
    Dim term As String
    Dim firstAddress As String
    Dim outputRow As Long

    ' Настройка рабочего листа для результатов
    On Error Resume Next
    Set resultsWs = ThisWorkbook.Worksheets("Результаты поиска")
    If resultsWs Is Nothing Then
        Set resultsWs = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        resultsWs.Name = "Результаты поиска"
    Else
        resultsWs.Cells.Clear ' Очистить предыдущие результаты
    End If
    On Error GoTo 0
    resultsWs.Cells(1, 1).Value = "Поисковый термин"
    resultsWs.Cells(1, 2).Value = "Найдено на листах"
    outputRow = 2

    ' Установите рабочий лист и диапазон для поисковых терминов
    Set searchWs = ThisWorkbook.Worksheets("searchingsheet") ' Обновите это до правильного имени листа
    Set searchRange = searchWs.Range("A2:A1190") ' Обновите диапазон по мере необходимости

    ' Цикл по каждому поисковому термину
    For Each cell In searchRange
        If Not IsEmpty(cell.Value) Then
            term = Trim(cell.Value)
            Dim sheetsFound As String
            sheetsFound = ""

            ' Поиск по каждому рабочему листу для термина
            For Each ws In ThisWorkbook.Worksheets
                If ws.Name <> searchWs.Name And ws.Name <> resultsWs.Name Then ' Избежать листов поиска и результатов
                    With ws.UsedRange
                        Set foundCell = .Find(What:=term, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                        If Not foundCell Is Nothing Then
                            firstAddress = foundCell.Address
                            Do
                                If InStr(sheetsFound, ws.Name) = 0 Then
                                    sheetsFound = sheetsFound & ws.Name & ", "
                                End If
                                Set foundCell = .FindNext(foundCell)
                            Loop While Not foundCell Is Nothing And foundCell.Address <> firstAddress
                        End If
                    End With
                End If
            Next ws

            ' Удаление завершающей запятой и добавление результатов на лист результатов
            If Len(sheetsFound) > 0 Then
                sheetsFound = Left(sheetsFound, Len(sheetsFound) - 2)
            Else
                sheetsFound = "Нет"
            End If

            resultsWs.Cells(outputRow, 1).Value = term
            resultsWs.Cells(outputRow, 2).Value = sheetsFound
            outputRow = outputRow + 1
        End If
    Next cell
End Sub

Ответ или решение

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

Sub SearchWorksheetsWithExactMatches()
    Dim ws As Worksheet, searchWs As Worksheet
    Dim searchRange As Range, cell As Range, foundCell As Range
    Dim resultsWs As Worksheet
    Dim term As String
    Dim firstAddress As String
    Dim outputRow As Long
    Dim sheetCount As Long

    ' Настройка рабочего листа результатов
    On Error Resume Next
    Set resultsWs = ThisWorkbook.Worksheets("Результаты Поиска")
    If resultsWs Is Nothing Then
        Set resultsWs = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        resultsWs.Name = "Результаты Поиска"
    Else
        resultsWs.Cells.Clear ' Очищаем предыдущие результаты
    End If
    On Error GoTo 0
    resultsWs.Cells(1, 1).Value = "Поисковый термин"

    ' Установим имя и диапазон для терминов на поисковом листе
    Set searchWs = ThisWorkbook.Worksheets("searchsheet") ' Обновите это на корректное имя листа
    Set searchRange = searchWs.Range("A2:A1190") ' Обновите диапазон, если необходимо

    outputRow = 2

    ' Цикл по каждому поисковому термину
    For Each cell In searchRange
        If Not IsEmpty(cell.Value) Then
            term = Trim(cell.Value)
            Dim sheetsFound As Collection
            Set sheetsFound = New Collection

            ' Поиск по всем листам
            For Each ws In ThisWorkbook.Worksheets
                If ws.Name <> searchWs.Name And ws.Name <> resultsWs.Name Then ' Избегаем поиск в поисковом и результатном листах
                    With ws.UsedRange
                        Set foundCell = .Find(What:=term, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
                        If Not foundCell Is Nothing Then
                            firstAddress = foundCell.Address
                            Do
                                On Error Resume Next
                                sheetsFound.Add ws.Name, ws.Name ' Добавляем имя листа в коллекцию (уникально)
                                On Error GoTo 0
                                Set foundCell = .FindNext(foundCell)
                            Loop While Not foundCell Is Nothing And foundCell.Address <> firstAddress
                        End If
                    End With
                End If
            Next ws

            ' Запись результатов
            resultsWs.Cells(outputRow, 1).Value = term
            If sheetsFound.Count > 0 Then
                sheetCount = 1
                For Each wsName In sheetsFound
                    resultsWs.Cells(outputRow, sheetCount + 1).Value = wsName ' Записываем имя листа в новую колонку
                    sheetCount = sheetCount + 1
                Next wsName
            Else
                resultsWs.Cells(outputRow, 2).Value = "Нет совпадений"
            End If
            outputRow = outputRow + 1
        End If
    Next cell
End Sub

Объяснение скрипта:

  1. Настройка результатов: Скрипт создает или очищает лист для результатов поиска, если он существует.

  2. Сбор терминов: Устанавливается диапазон, в котором прописаны термины для поиска (в данном случае A2:A1190 на листе "searchsheet").

  3. Поиск терминов: Скрипт проходит по всем листам. Если находится точное совпадение термина, имя листа добавляется в коллекцию, что позволяет избежать дублирования.

  4. Вывод результатов: Если совпадения найдены, имена листов записываются в столбцы, начиная с колонки B. Если совпадений не найдено, в колонке B пишется "Нет совпадений".

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

Оцените материал
Добавить комментарий

Капча загружается...