2013-06-17 2 views
1

Мой вопрос довольно сложный, поэтому я постараюсь сделать его максимально ясным.Excel - VBA: матч с двумя комбинированными ячейками?

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

Например: цель enter image description here

моей программы, чтобы найти спички, чтобы определить место. До сих пор вот что он делает: он активирует ячейку из базы данных и сравнивается с каждой ячейкой «elementListRange», которая представляет собой выбор элементов из столбца (так что на моем рисунке «B2: B7»). Когда есть матч, он добавляет счет 12 на линии.

'loop in the DATABASE 
    For i = a To b 
Range("B" & i).Activate 

    'try to find a match btwn active cell and one of the elements from parsed address 
For Each cell In elementsListRange.Cells 

    If Match(ActiveCell.Value, cell.Value) Then 
    Range("K" & i).Value = Range("K" & i).Value + 12 
    Else 
    Range("K" & i).Value = Range("K" & i).Value + 0 
    End If 
Next 

Таким образом, в данном случае, есть матч в три раза, с ячейкой 1 (корпоративной), ячейка 2 (в центре) и ячейки 3 (зданий), что делает в общей сложности 36 очков.

Вот что я хочу сделать: сейчас, я хочу сделать его более точным, принимая во внимание положение слов. Поэтому, если ячейкой в ​​базе данных является «Корпоративный центр здания», а слова Corporate/Center and Building отображаются в том же порядке, это добавит больше очков. Идея такова: если между активной ячейкой и ячейкой 1 (корпоративный) есть совпадение, добавьте 12 пунктов и выполните еще одну проверку: если соответствие между активной ячейкой и ячейкой 1 + ячейка 2 (корпоративный центр), добавьте 10 дополнительных точек и сделайте другое If: Если соответствие между активной ячейкой и ячейкой 1 + ячейка 2 + ячейка 3 (Corporate Center Building), добавьте 15 дополнительных точек и так далее.

Таким образом, он не только найдет совпадения, но и придаст значение позиции слов. Поэтому, если ввод «Корпоративный центр здания», и у вас есть как «Корпоративное здание центра», так и «Создание корпоративного центра» в базе данных, в правильном матче будет дано больше очков.

Что-то вроде этого:

'loop in the DATABASE 
    For i = a To b 
Range("B" & i).Activate 

    'try to find a match btwn active cell and one of the elements from parsed address 
For Each cell In elementsListRange.Cells 

    If Match(ActiveCell.Value, cell.Value) Then 
    Range("K" & i).Value = Range("K" & i).Value + 12 

     If Match(ActiveCell.Value, cell.Value + cell.offest(1,0).Value) Then 
     Range("K"&i).Value = Range("K"&i).Value + 10 

       If Match(ActiveCell.Value, cell.Value + cell.offest(1,0).Value + cell.offset(2,0).Value) Then 
       .... ..... ..... + 15 
       and so on 

       Else 
       End If 

     Else 
     End If 

    Else 
    Range("K" & i).Value = Range("K" & i).Value + 0 
    End If 
Next 

И, наконец, вот мой вопрос:

К сожалению, мы не можем записать это так:

If Match(ActiveCell.Value, cell.Value + cell.offest(1,0).Value) 

Do вы знаете, как выразить эту идею? Спасибо заранее.

ответ

1

если вы хотите присоединиться строки вы должны использовать амперсанд & вместо знака плюс +, так, чтобы соединить два значения
Cstr(cell.Value & cell.offest(1,0).Value).
+ в основном используется в математических операциях, как сложение двух чисел, увеличивая итератор и т.д.
Амперсанд & используется для соединения строк вместе, например:

Dim stringA As String, stringB as String, finalString as String 
stringA = "hello" 
stringB = "world!" 
finalString = stringA & " " & stringB 
msgbox finalString 


Теперь в вашем случае вам нужно измените подход, потому что то, что вы думаете, что вы делаете, не работает.
Начало знаком с знаком Split() и InStr() функций. Разделите предложение из столбца F (база данных) в массив Variant. Затем проведите по столбцу B, чтобы найти первое совпадение. Если совпадение найдено, посмотрите, совпадает ли следующее совпадение и оценка по результатам матча.

+0

спасибо за ваше объяснение, очень полезно. Я пробовал это: если Match (ActiveCell.Value, cell.Value & cell.Offset (1,0) .Value), и он действительно не работает, он по-прежнему не распознает комбинацию слов, то есть он будет забивать даже если только второе слово замечено, а не целое слово word2. Я не понимаю, почему, когда он ищет совпадение «word1», он работает, но для «word1 word2» он не работает. Это не так ... Я собираюсь взглянуть на ваше другое предложение, но я боюсь, что это слишком сложно для меня, моя база данных огромна, и я не знаю, как работать с массивом и т. Д. – Phalanx

+1

концепция из массивов слишком сложно - см. [эту ссылку] (http://www.cpearson.com/excel/vbaarrays.htm) –

+0

Спасибо за ссылку, закончите читать ее после этого сообщения. Это кажется сложным, хотя моя идея очень проста. Вот что я сделал: "Dim StringData() As переменной Для я = а к Ь Range (" B "& I) .Activate StringData = Split (ActiveCell.Value", ")" Я сейчас попробую найти способ петли в элементе моего массива и использовать что-то похожее на смещение для сравнения элементов по элементам. – Phalanx

Смежные вопросы