2013-11-08 1 views
1

У меня есть две колонки на два отдельных листа. В первом, C1, у меня есть 1000 строк, содержащих текст, во втором столбце C2 У меня есть 2000 строк, содержащих также текст.Поиск ячеек с по крайней мере одним и тем же текстом, присутствующим в других ячейках (Excel)

Что мне нужно сделать, это выбрать все C2 строки, которые содержат по крайней мере (точно) весь текст, содержащийся в любом из C1 строк.

Например, предположим, что данные, как это:

C1   C2 
Eval 1  Eval 101 doc 
Eval 1  Eval 1 project 
Eval 100 Eval 1 doc 
Ev 1  Eval 19 
Eval1  Ev 2 

В конце концов, я хотел бы, чтобы выбрать только следующие ячейки во втором листе:

C2 
Eval 1 doc 
Eval 1 project 

Я не очень хорошо знаком с Excel, но я произвел следующую функцию:

=IF(ISNUMBER(FIND(<C1 cell>, <C2 cell>)),"OK", "Not OK") 

, а затем он должен быть просто матовой r фильтрующих данных в соответствии с «ОК».

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

Я также думал использовать ВПР, но то, что мне нужно, это не то C2 значения прекрасно сочетающегося с C1 значениями, но, как я уже говорил, те, которые по крайней мере содержать весь текст C1 клеток ..

Любое предложение будет высоко оценен,

Стефано

+0

Возможно, вы захотите попробовать VBA [regex] (http://stackoverflow.com/questions/4556910/how-do-i-get-regex-support-in-excel-via-a-function-or-custom -функция) – zx8754

ответ

1

Хорошо, попробуйте это, это не хорошо, но я думаю, что это будет работать для вас:

Добавьте следующий код книги в стандартном модуле, и сохраните книгу

Public LookInCollection As New Collection 

Function SetUpCollection(range) 
'Load data into collection 
    On Error Resume Next 
    For Each Cell In range 
     LookInCollection.Add 1, Cell.Text 
    Next 
    On Error GoTo 0 
End Function 

Function MatchValue(Value) 
    Dim ValueArray As Variant 
    Dim Lenght As Long 

    ValueArray = Split(Value, " ") 

    'Loop String backwars remving words each time 
    For i = 0 To UBound(ValueArray) 
     If InCollection(Left(Value, Len(Value) - Lenght)) Then 
      MatchValue = 1 
      Exit Function 
     End If 
     Lenght = Len(ValueArray(UBound(ValueArray) - i)) + 1 
    Next 

    MatchValue = 0 'Cound not match 
End Function 

Private Function InCollection(Key) As Variant 
    On Error Resume Next 
    InCollection = LookInCollection(Key) 
End Function 

Далее на странице с колонки 2 на нем добавить одну формулу, как этот

= SetUpCollection (Column1_Range)

затем добавить Forumla рядом с каждой ячейкой в ​​С2,

= MatchValue (ReftoCelltoCheck)


Обновление на основе комментариев

код состоит из 3 частей. Первая функция создает коллекцию, которая используется основной функцией, поэтому она используется только один раз. Последняя функция просто проверяет, находится ли ключ в коллекции.

Вторая функция выполняет работу.Он получает значение для проверки и загрузки каждого слова в массив, это функция разделения. Цикл for работает в обратном порядке, считая значение, удаляя слова из исходного значения и проверяя это новое значение на ключи в коллекции. Матч возвращает 1, и мы выходим из функции, иначе продолжаем движение, пока не будут проверены все слова.

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – Mureinik

+0

@Mureuink - Да, извините, я испортил, я дал приличный (иш) ответ сейчас – Ross

+0

намного лучше, спасибо. Модераторы - я не мог найти способ удалить свой флаг, пожалуйста, проигнорируйте его. – Mureinik