Пребройте и маркирайте ключови думи във фрази

Имам Excel лист с две колони. Първата колона е ключовата фраза, а втората е съобщенията. Ключовата фраза може да се появи в колоната за съобщения. Трябва да знам колко пъти се е появила ключова фраза в колоната за съобщения. моля, предложете някакъв добър и лесен начин за намиране.

Ключовата фраза е една колона, а съобщенията са втората колона. Колоната за съобщения е комбинация (конкатенация) от 1 или повече от 1 ключови фрази. Трябва да разбера колко ключови фрази съдържа всяко съобщение.


person Megan    schedule 30.09.2015    source източник
comment
Ако данните в Excel са резултат от SQL заявка, бих препоръчал извайване на T-SQL с подзаявка или дял, който доставя резултатите заедно с останалите данни.   -  person    schedule 30.09.2015
comment
Колоната за съобщения може да има повече от една ключова фраза, която присъства в първата колона. Например, ако ключовата фраза е say this is to be tested, тогава този низ може да се появи в колоната за съобщения като подниз в много редове. например здравей свят; това трябва да се тества; и това също се тества;. този вид стойности са налични в колона B.   -  person Megan    schedule 30.09.2015
comment
Да, това прави подзаявката в оператор SELECT.   -  person    schedule 30.09.2015


Отговори (2)


Възможно е да успеете да съберете ефективно преброяване с модулна подпроцедура, която изпълнява всички математически изчисления в масиви от памет¹ и връща преброяванията в работния лист.

       Брои ключови думи във фрази примерни данни

Използвах някои стандартни ключови думи и фрази Lorem Ipsum, за да създам горните примерни данни.

Докоснете Alt+F11 и когато VBE се отвори, веднага използвайте падащите менюта, за да вмъкнете ► модул (Alt+I< /kbd>,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ти кодов ред. Включих също помощна рутина, която идентифицира ключовите думи във фразите със син|удебелен шрифт. Коментирайте или изтрийте реда Call key_in_phrase_helper(...) в долната част на първата подпроцедура, ако това не е желано.

Докоснете Alt+Q, за да се върнете към вашия работен лист. Докоснете Alt+F8, за да отворите диалоговия прозорец Макроси и Изпълни подпроцедурата. Ако вашите данни приличат на примерните данни, които събрах, тогава трябва да имате подобни резултати.

       Брои ключове във фрази


¹ Това са някои усъвършенствани методи, но смятам, че те са и най-добрият начин да се справите с проблема си. Ако имате специфични въпроси, които вашите собствени изследвания не обясняват адекватно, ще се опитам да отговоря на тях в секцията за коментари. Примерната работна книга, която създадох, за да създам това решение, може да бъде предоставена при поискване.

person Community    schedule 01.10.2015
comment
Това е страхотно. Благодаря много за отговора. Работи перфектно. - person Megan; 01.10.2015
comment
Страхотно е да го чуя. Трябваше да направя някои предположения по време на процеса, но изглежда, че познах правилно. - person ; 01.10.2015
comment
Необходима е още една помощ. Някои от ключовите фрази имат някои дати и числа, които в оригиналното съобщение може да варират, но останалата част от съобщението остава същата. например ключовата фраза е Неуспешно създаване на идентификатор xx-xx-xx и съобщението е Неуспешно създаване на идентификатор 9823023. Бихте ли ми помогнали в това, че игнорира номера, докато съвпада. - person Megan; 01.10.2015
comment
Добавянето на тази функционалност би означавало включване на RegEx (регулярен израз) и някаква размита логика. Накратко, това би нарушило това усилие и изисква пълно пренаписване. Като се има предвид, че липсата на примерни ключови думи и фрази доведе до този недостатък, защо не закриете този въпрос и не започнете друг, където можете очертае новите изисквания. Можете дори да оставите бърз коментар тук относно новия въпрос, тъй като имам някои идеи как да продължа. - person ; 01.10.2015
comment
Не мога да публикувам друг въпрос през следващата седмица :( - person Megan; 02.10.2015
comment
Съжалявам, но това може да има нещо общо с хронологията ви на публикации. Обикновено изглежда, че изоставяте въпрос, след като получите отговор. Приемането на един от отговорите като ваш „Приет отговор“ чрез щракване върху отметката в лявата алея до най-добрия отговор и маркиране на един или повече като „Полезни“ чрез щракване върху ▲ спомага за изграждането както на репутацията на вашия сайт, така и на хората, които отговарят на вашия запитвания. Вижте Какво трябва да направя, когато някой отговори на моя въпрос?. Повече репутация означава, че можете да публикувате повече въпроси. - person ; 02.10.2015
comment
Повдигнах друг въпрос. Това е връзката. моля, проверете: stackoverflow.com/questions/32946884/pattern-matching-in -excel - person Megan; 05.10.2015
comment
Вижте моя отговор, включващ съвпадение на RegEx шаблон тук. - person ; 06.10.2015

Можете да използвате тази формула COUNTIF(B:B;"*"&A2&"*") като започнете от втория ред.

person Dmitry Polyakov    schedule 30.09.2015
comment
Бихте ли ми помогнали да разбера това. Съжалявам, че не използвам често Excel. - person Megan; 30.09.2015
comment
B:B е препратка към цялата колона B, където имате съобщенията. Формулата ще го разгледа. A2 е препратка към клетката във втория ред на колона A, където имате ключа. Звездичка(*) е заместващ знак за търсене. Амперсанд (&) е оператор за конкатенация на низове. Напр., ако имате ключ excel в колона A и съобщение Excel 2016 е съвместим с Windows 10 в колона B, трябва да изградите шаблон за търсене *excel*. Ето защо използвате частите от низа "*" в началото и края на вашия параметър на формулата. И го свързвате с ключа, като използвате &. - person Dmitry Polyakov; 30.09.2015
comment
Благодаря, но съжалявам, имам едно съмнение. Това ще бъде ли сравняване само на един елемент, който е A2, с цялата колона B:B?. Трябва да сравня всички стойности на колона A с всички стойности на колона B. - person Megan; 01.10.2015
comment
@Меган, опитай да вмъкнеш формулата =(SUMPRODUCT(LEN(B:B))-SUMPRODUCT(LEN(SUBSTITUTE(B:B;A2;""))))/LEN(A2) в клетка C2 и след това да я разшириш надолу - person Dmitry Polyakov; 01.10.2015