Цикл и сканирование списка, например, 200 строк по столбцу со строковыми данными (Excel, VBA, Macros) - PullRequest
0 голосов
/ 18 февраля 2020

В меру своих усилий (новичок в VBA) я пытался написать, используя стек и другие ресурсы, макрос, который позволил бы мне сканировать данный список строк в Excel по сравнению с другим гораздо большим списком для возможных частичных совпадений (Vlookup кажется, не делает трюк и Instr намного лучше для этого кажется). Мне удалось заставить работать некоторый код, который использует al oop для сканирования определенного диапазона c и поиска единственной интересующей строки. Например, допустим, у меня есть 20 ячеек в столбце C с различными названиями фруктов и овощей, и я хотел бы выделить только те, которые мне интересны c. В приведенном ниже примере кода я включил строку «Cher» (для Cherry) для поиска по диапазону, который, если найден, создает попадание справа от столбца поиска.

Мой главный вопрос: настроить код так, чтобы я мог не только искать одну строку, например «Cherry», но и как запустить ее для очень длинного списка, например, из 200 элементов при работе с парой тысяч строк данных?

Sub listchecker()

    Dim cell As Range
        For Each cell In Range("C2:C20")
            If InStr(cell.Value, "Cher") > 0 Then
                cell.Offset(0, 1).Value = cell.Value
            End If
        Next cell

    End Sub

Заранее благодарю за помощь!

Спасибо NautMeg и SRJ за предложения, приведенные ниже. Я изменил код, и теперь он работает с массивом, как указано ниже (ура)

Dim wordsArray() As Variant
wordsArray = Worksheets("Keywords").Range("B2:B439").Value
Dim word As Variant


  Dim cell As Range
       For Each cell In Worksheets("Normalized").Range("J2:J49010")
           For Each word In wordsArray
               If InStr(cell.Value, word) > 0 Then
                   cell.Offset(0, -1).Value = cell.Value
               End If
           Next word
       Next cell

Единственное, что я сейчас понял, это то, что было бы лучше для 'cell.Offset (0). , -1) .Value = cell.Value 'фактически для заполнения соответствием массива (ключевым словом), а не значением ячейки. Это потому, что ключевое слово может быть слишком широким или слишком общим c и приводить к ложным срабатываниям. Возврат значения ячеек вместо совпадения из массива усложняет жизнь для поиска неисправностей / выявления плохого ключевого слова broad / generi c, например, ("is").

1 Ответ

0 голосов
/ 18 февраля 2020

, как SJR упоминает выше, вы можете сохранить 200 элементов поиска в массиве, а затем изменить свой код следующим образом:

    Dim cell As Range
        For Each cell In Range("C2:C20")
            '// Add Another For Loop here to loop through your words array 
            For Each wrd in wordsArray
                If InStr(cell.Value, wrd) > 0 Then
                    cell.Offset(0, 1).Value = cell.Value
                End If
            Next word
        Next cell
    End Sub

Возможная проблема с этим типом поиска заключается в том, что он подхватит первое совпадение, например поиск «mang», может привести к появлению «man go» или «mangetout» в зависимости от того, какой элемент появляется в списке первым. Это может или не может быть желательным, но что-то, чтобы высматривать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...