2015-09-30 4 views
1

У меня есть лист Excel с двумя столбцами. Первый столбец - ключевая фраза, а вторая - сообщения. Ключевая фраза может возникать в столбце сообщений. Мне нужно знать, сколько раз ключевая фраза произошла в столбце сообщений. пожалуйста, предложите хороший и удобный способ поиска.Count and Highlight ключевые слова в фразах

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

+1

Если данные Excel являются результатом SQL-запроса, я бы рекомендовал вылепить T-SQL с подзапросом или разделом, который доставляет результаты вместе с остальными данными. – Jeeped

+0

В столбце сообщений может быть более одной ключевой фразы, которая присутствует в первом столбце. E, g, если ключевая фраза говорит «это нужно протестировать», то эта строка может встречаться в столбце сообщений как подстрока во многих строках. е.g "hello world, это должно быть проверено, и это также проверяется". этот вид значений доступен в столбце B. – Megha

+0

Да, это то, что делает запрос в выражении SELECT. – Jeeped

ответ

1

Возможно, вы сможете собрать эффективный счет с модулем sub, который выполняет все математические операции в массивах памяти¹ и возвращает отсчеты на рабочий лист.

Counts keywords in phrases sample data

Я использовал некоторые стандартные Lorem Ipsum ключевые слова и фразы, чтобы создать вышеупомянутые выборочные данные.

Нажмите Alt + F11 и при открытии VBE, немедленно использовать выпадающие меню Вставка ► модуля (Alt + I, M). Вставьте следующее в новый код кода модуля, который называется Book1 - Module1 (код).

Option Explicit 

Sub count_strings_inside_strings() 
    Dim rw As Long, lr As Long 
    Dim k As Long, p As Long, vKEYs As Variant, vPHRASEs As Variant, vCOUNTs As Variant 

    ReDim vKEYs(0) 
    ReDim vPHRASEs(0) 

    With Worksheets("Sheet1") '<~~ set to the correct worksheet name\ 
     'populate the vKEYs array 
     For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 
      vKEYs(UBound(vKEYs)) = LCase(.Cells(rw, 1).Value2) 
      ReDim Preserve vKEYs(UBound(vKEYs) + 1) 
     Next rw 
     ReDim Preserve vKEYs(UBound(vKEYs) - 1) 

     'populate the vPHRASEs array 
     For rw = 2 To .Cells(Rows.Count, 2).End(xlUp).Row 
      vPHRASEs(UBound(vPHRASEs)) = LCase(.Cells(rw, 2).Value2) 
      ReDim Preserve vPHRASEs(UBound(vPHRASEs) + 1) 
     Next rw 
     ReDim Preserve vPHRASEs(UBound(vPHRASEs) - 1) 
     ReDim vCOUNTs(0 To UBound(vPHRASEs)) 

     'perform the counts 
     For p = LBound(vPHRASEs) To UBound(vPHRASEs) 
      For k = LBound(vKEYs) To UBound(vKEYs) 
       vCOUNTs(p) = CInt(vCOUNTs(p)) + _ 
        (Len(vPHRASEs(p)) - Len(Replace(vPHRASEs(p), vKEYs(k), vbNullString)))/Len(vKEYs(k)) 
      Next k 
     Next p 

     'return the counts to the worksheet 
     .Cells(2, 3).Resize(UBound(vCOUNTs) + 1, 1) = Application.Transpose(vCOUNTs) 

     'run the helper procedure to Blue|Bold all of the found keywords within the phrases 
     Call key_in_phrase_helper(vKEYs, .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp))) 

    End With 
End Sub 

Sub key_in_phrase_helper(vKYs As Variant, rPHRSs As Range) 
    Dim p As Long, r As Long, v As Long 

    With rPHRSs 
     For r = 1 To rPHRSs.Rows.Count 
      .Cells(r, 1) = .Cells(r, 1).Value2 
      For v = LBound(vKYs) To UBound(vKYs) 
       p = 0 
       Do While CBool(InStr(p + 1, .Cells(r, 1).Value2, vKYs(v), vbTextCompare)) 
        p = InStr(p + 1, .Cells(r, 1).Value2, vKYs(v), vbTextCompare) 
        Debug.Print vKYs(v) 
        With .Cells(r, 1).Characters(Start:=p, Length:=Len(vKYs(v))).Font 
         .Bold = True 
         .ColorIndex = 5 
        End With 
       Loop 
      Next v 
     Next r 
    End With 
End Sub 

Вы, возможно, придется переименовать рабочий лист для обработки в строке кода 5 й. Я также включил вспомогательную подпрограмму, которая идентифицирует ключевые слова в фразах с синим шрифтом Bold. Прокомментируйте или удалите строку Call key_in_phrase_helper(...) в нижней части первой процедуры, если это нежелательно.

Нажмите Alt + Q, чтобы вернуться на рабочий лист. Нажмите Alt + F8 открыть Макросы диалоговые и Run процедура суб. Если данные похожи на данные образца, которые я собрал вместе, вы должны иметь похожие результаты.

Counts keys in phrases


¹ Таковы некоторые современные методы, но я чувствую, что они также являются лучшим способом решения проблемы. Если у вас есть конкретные вопросы, что ваши собственные исследования не дают достаточного объяснения, я попытаюсь обратиться к ним в разделе «Комментарии». Образец рабочей книги, созданной мной для создания этого решения, может быть предоставлен по запросу.

+0

Это потрясающе. Большое спасибо за ответ. Он работает отлично. – Megha

+0

Это здорово. Я должен был сделать некоторые предположения во время процесса, но кажется, что я догадался, что правильно. – Jeeped

+0

Требуется еще одна помощь. Некоторые ключевые фразы содержат несколько дат и цифр, которые в исходном сообщении могут отличаться, но остальное сообщение остается таким же. например, ключевая фраза: «Создание идентификатора xx-xx-xx не выполняется», и сообщение «Id create 9823023 failed». Не могли бы вы помочь мне в этом, чтобы он игнорировал число при сопоставлении. – Megha

0

Вы можете использовать эту формулу COUNTIF(B:B;"*"&A2&"*"), начиная со второй строки.

+0

Не могли бы вы помочь мне разобраться в этом. Вы не очень часто пользуетесь преимуществом. – Megha

+0

'B: B' - это ссылка на весь столбец B, где у вас есть сообщения. Формула будет смотреть на нее. 'A2' - это ссылка на ячейку во второй строке столбца A, где у вас есть ключ. Asterisk ('*') является подстановочным знаком для поиска. Амперсанд (&) является оператором для конкатенации строк. F. e., Если у вас есть ключ «excel» в столбце A и сообщение «Excel 2016 совместимо с Windows 10» в столбце B, вам нужно построить шаблон поиска '* excel *'. Вот почему вы используете строки '' * "' в начале и конце вашего параметра формулы. И вы объединяете его с ключом, используя '&'. –

+0

Спасибо, но извините, у меня есть одно сомнение. Будет ли это сравнение только одного элемента, который является A2 со всей колонкой B: B ?. Мне нужно сравнить все значения столбца A со всеми значениями связи B. – Megha

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