1

У меня есть инструмент поиска, который я разрабатываю в Excel. В столбце "ЕС" у меня есть ячейки, каждая из которых содержит строку из 124 цифр. Эти строки состоят из 0 и 1. У меня есть 124 характеристики, которые выдают 1 или 0 ..., и пользователи могут захотеть найти 1,2,3,4,5 и т.д. Характеристики. Для простоты, скажем, в EU1 есть строка 0100100011 ..... и я хочу найти любую ячейку, содержащую 0100100000 или, возможно, 0000100010 и т.д. Другими словами, я хочу найти любую строку, содержащую "1", в определенном месте цифры, возможно несколько единиц в нескольких разрядах .......... Пример я хочу проверить, если какая-либо из этих 3 комбинаций .....

0000010000000001000000000000010010000010000000100000010010010000000000101100100000100000000000000000000000000000000000000100 0000000000001010001000000010010010010010000000100000010010010000000000100100100000100100000100000000000000000000000001000100 0000000000000110000010000010001001010000010000100000010010010000000000100100100001000100000100000000000000000000000001000100

есть 1 в этих местах ......

1000000000000000000000000000000000000000000000000000000000000000000001000000000000000000001000100000000000000000000000000000

если в других местах есть 1, то это нормально, но если тестовое условие имеет 1, а в проверенных местах есть ноль в этой цифре.


Другими словами, используя более понятные примеры, представьте, что мои строки имеют длину всего пять символов, а мои первые пять строк

EU1       10000
EU2       10001
EU3       11000 
EU4       11011
EU5       00001

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

Например, чтобы найти строки, первые две цифры которых равны 1 с (безразлично к остальным), я бы хотел указать 11000 и получить совпадения со строками EU3 и EU4.  (Это может представлять собой поиск объектов, которые имеют тип A ngular AND B lue.)  Поиск по 10000 (все объекты , которые являются ngular) должны совпадать по всем струнам , чьи первые цифра 1 а именно : EU1, EU2, EU3 и EU4.  11100 (все объекты , которые являются ngular И В LUE И С ircular) не должны давать ни одного совпадения, потому что никакие строки не содержат 1 в месте третьей цифры.  И наоборот, 00000 должен соответствовать всем строкам, потому что строка поиска со всеми нулями является подстановочным знаком.

В форме таблицы:

Search string:   11000       10000       11100       00000
                 ↓↓          ↓           ↓↓↓
EU1              10000     → 10000       10000     → 10000
EU2              10001     → 10001       10001     → 10001
EU3            → 11000     → 11000       11000     → 11000
EU4            → 11011     → 11011       11011     → 11011
EU5              00001       00001       00001     → 00001
                                        (none)       (all)

2 ответа2

0

Для простоты я поместил ваши данные в столбец E , начиная со строки 2.  Я поместил строку поиска в ячейку D2 .  (Конечно, D2 и столбец E должны быть отформатированы как текст, или вы должны вводить одиночную кавычку (') перед каждым числом.)

Я выбрал подход с использованием собственных возможностей поиска в Excel.  Строка поиска 11000 означает, что мы ищем значения, где первая цифра - 1 , вторая цифра - 1 , а символы с третьего по пятый - что угодно.  Как вы сказали, нули в переменной (строке поиска) являются символами подстановки.

Стандартное представление этого шаблона - 11??? - поэтому я установил ячейку D3 в

=SUBSTITUTE(D2, "0", "?")

Вопрос не уточнил, как должны быть представлены результаты.  Для каждого значения в столбце E можно указать, является ли оно совпадением.  Мы можем сделать это путем поиска ИНГ каждого значения E для строки подстановки.  Если он найден, SEARCH возвращает 1, в противном случае он возвращает ошибку.  Таким образом, мы можем получить соответствующее значение TRUE или FALSE , поставив

=NOT(ISERROR(SEARCH($D$3, E2)))

в F2 , и перетащить его вниз, чтобы покрыть все данные E  (Обратите внимание, что FIND не допускает подстановочные знаки.)

Но может быть удобнее иметь список индексов совпадающих значений.  Мы можем получить это, используя MATCH для поиска в столбце.  Я положил 1 в ячейку G1 и

=MATCH($D$3, INDEX($E$2:$E$99, G1):$E$99, 0) + G1

в ячейку G2 (с настройкой 99 с, чтобы соответствовать последней строке данных) и перетащите / заполните его.  Это ищет подстановочную строку (которая находится в D3) в столбце E , начиная с точки предыдущего совпадения.  Это возвращает номер строки совпадений; например, «Строка D» (11011 , которая находится в ячейке E5), указывается как 5.  Если вы хотите, чтобы «String D» указывалось как 4, это простая настройка.

Вот результаты для предложенных вами образцов данных:

     11 000
     10000
     11100
     00000

Конечно, ячейки D3 и G1 могут быть скрыты.  И, если вам действительно нужно запустить данные в строке 1, это можно организовать.

PS Я проверил это с длинными значениями из 124 символов, и обе части ответа, кажется, работают.

0

Скажем, у нас есть данные в столбце EU от EU1 до EU100. Чтобы найти ячейки с вашим шаблоном соответствия, используйте:

Sub Finderr()
   For i = 1 To 100
      v = Cells(i, "EU").Text
      If Mid(v, 1, 1) = "1" And Mid(v, 70, 1) = "1" And Mid(v, 91, 1) = "1" Then
         MsgBox i
      End If
   Next i
End Sub

выведет какие строки, содержащие совпадения.

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