2015-10-05 3 views
-2

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

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

например. сообщение «Сделка закрыта 08-Oct-2014, поэтому дальнейшие транзакции не разрешены», а ключевая фраза «Сделка закрыта (xx-xxx-xxxx)». Также есть сообщения как «Номер сделки 4238428DDSSD имеет проблемы», а ключевая фраза «Номер сделки xxxxxxxx hass problems». Требуется сопоставление регулярных выражений.

+1

Можете ли вы показать нам, какой прогресс вы уже сделали? Возможно, вам стоит взглянуть на [этот пост] (http://stackoverflow.com/a/22542835/4600127), подробно объясняя регулярные выражения в VBA! – Verzweifler

ответ

2

Вы можете выбрать несколько ключевых фраз, создать для них шаблон регулярных выражений, а затем закодировать фразы, чтобы на них можно было использовать Range.Replace method, чтобы заменить соответствующую маску шаблона RegEx на ключевую фразу.

В дальнейшем, я использовал X00000000X, XSHORTDATEX и XDEALNMBRX в качестве заполнителей в рамках ключевых слов. Они будут заменены на [0-9, -] {7,8}, [0-9, -] {3} [az] {3} [0-9, -] {3,5} и [0- 9] {7} [az] {5} соответственно.

X00000000X предназначен для обработки всего, что выглядит как или * 99-11-00 *. XSHORTDATEX будет обрабатывать даты в формате дд-ммм-YY или DD-MMM-YYYY (после преобразования в нижний регистр) и XDEALNMBRX будет найти буквенно-цифровые шаблоны, аналогичные 4238428DDSSD.

Этот код требует, чтобы Microsoft VBScript Regular Expression библиотека будет добавлена ​​в проект VBA с инструментами в VBE в ► команду References.

Sub count_strings_inside_strings_rgx() 
    Dim rw As Long, lr As Long 
    Dim k As Long, p As Long, vKEYs As Variant, vPHRASEs As Variant, vCOUNTs As Variant 
    Dim sPATTERN As String, vbaRGX As New RegExp, cMATCHES As MatchCollection 

    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)) 

     For p = LBound(vPHRASEs) To UBound(vPHRASEs) 
      For k = LBound(vKEYs) To UBound(vKEYs) 
       sPATTERN = Replace(vKEYs(k), "x00000000x", "[0-9,\-]{7,8}") 
       sPATTERN = Replace(sPATTERN, "xshortdatex", "[0-9,\-]{3}[a-z]{3}[0-9,\-]{3,5}") 
       sPATTERN = Replace(sPATTERN, "xdealnmbrx", "[0-9]{7}[a-z]{5}") 
       sPATTERN = Replace(sPATTERN, "xshortwrapdatex", "\([0-9,\-]{3}[a-z]{3}[0-9,\-]{3,5}\)") 
       With vbaRGX 
        .Global = True 
        .Pattern = sPATTERN 
        Set cMATCHES = .Execute(vPHRASEs(p)) 
       End With 
       vCOUNTs(p) = vCOUNTs(p) + cMATCHES.Count 
      Next k 
     Next p 

     .Cells(2, 3).Resize(UBound(vCOUNTs) + 1, 1) = Application.Transpose(vCOUNTs) 

     Call key_in_phrase_helper_rgx(vKEYs, .Range(.Cells(2, 2), .Cells(Rows.Count, 2).End(xlUp))) 

    End With 

    Set cMATCHES = Nothing 
    Set vbaRGX = Nothing 

End Sub 

Sub key_in_phrase_helper_rgx(vKYs As Variant, rPHRSs As Range) 
    Dim c As Long, m As Long, p As Long, r As Long, v As Long, sPTTRN As String 
    Dim vbaRGX As New RegExp, cMATCHES As MatchCollection 

    With rPHRSs 
     For r = 1 To rPHRSs.Rows.Count 
      With .Cells(r, 1) 
       .ClearFormats 
       For v = LBound(vKYs) To UBound(vKYs) 
        sPTTRN = Replace(vKYs(v), "x00000000x", "[0-9,\-]{7,8}") 
        sPTTRN = Replace(sPTTRN, "xshortdatex", "[0-9,\-]{3}[a-z]{3}[0-9,\-]{3,5}") 
        sPTTRN = Replace(sPTTRN, "xdealnmbrx", "[0-9]{7}[a-z]{5}") 
        sPTTRN = Replace(sPTTRN, "xshortwrapdatex", "\([0-9,\-]{2,3}[a-z]{3}[0-9,\-]{3,5}\)") 
        c = 5 + CBool(vKYs(v) <> sPTTRN) * 2 
        Debug.Print sPTTRN 
        With vbaRGX 
         .Global = True 
         .Pattern = sPTTRN 
        End With 
        Set cMATCHES = vbaRGX.Execute(LCase(.Value2)) 
        For m = 0 To cMATCHES.Count - 1 
         p = 0 
         Do While CBool(InStr(p + 1, .Value2, cMATCHES.Item(m), vbTextCompare)) 
          p = InStr(p + 1, .Value2, cMATCHES.Item(m), vbTextCompare) 
          'Debug.Print vKYs(v) 
          With .Characters(Start:=p, Length:=Len(cMATCHES.Item(m))).Font 
           .Bold = True 
           .ColorIndex = c 
          End With 
         Loop 
        Next m 
       Next v 
      End With 
     Next r 
    End With 

    Set cMATCHES = Nothing 
    Set vbaRGX = Nothing 

End Sub 

В следующем изображении результатов анализа пробы мной, то Staight элементы местоположения отмечены жирным шрифтом} синий и соответствующий шаблон RegEx отмечен жирным шрифтом | красным.

regex keyword from phrases

Вы можете изменять и добавлять дополнительные ключевые слова, фразы и шаблоны RegEx.

+0

Я столкнулся с некоторыми проблемами во время его запуска. – Megha

+0

Я добавил указания для включения в проект необходимой библиотеки. Если это не решит проблему, предоставьте более подробную информацию о том, какую ошибку вы получаете и на какой строке указана ошибка. [LINK] (https://www.dropbox.com/s/e7n24qv9gbvn4bb/count_strings_in_strings_and_highlight.xlsb?dl=0) в мою рабочую книгу. – Jeeped

+0

Не могли бы вы проверить один раз, сопоставление шаблонов не работает для дат. «Дата вступления в силу» (30 сентября-2014 года) может не предшествовать дате транзакции «Дата вступления в силу с KeyPhrase» (xx-xxx-xxxx) не может предшествовать дате транзакции ». Я заменил sPTTRN = Replace (sPTTRN, "xx-xxx-xxxx", "[0-9, \ -] {2,3} [AZ] [az] {3} [0-9, \ -] {3 , 5} "). – Megha

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