Возможно, вы сможете собрать эффективный счет с модулем sub, который выполняет все математические операции в массивах памяти¹ и возвращает отсчеты на рабочий лист.
Я использовал некоторые стандартные 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 процедура суб. Если данные похожи на данные образца, которые я собрал вместе, вы должны иметь похожие результаты.
¹ Таковы некоторые современные методы, но я чувствую, что они также являются лучшим способом решения проблемы. Если у вас есть конкретные вопросы, что ваши собственные исследования не дают достаточного объяснения, я попытаюсь обратиться к ним в разделе «Комментарии». Образец рабочей книги, созданной мной для создания этого решения, может быть предоставлен по запросу.
Если данные Excel являются результатом SQL-запроса, я бы рекомендовал вылепить T-SQL с подзапросом или разделом, который доставляет результаты вместе с остальными данными. – Jeeped
В столбце сообщений может быть более одной ключевой фразы, которая присутствует в первом столбце. E, g, если ключевая фраза говорит «это нужно протестировать», то эта строка может встречаться в столбце сообщений как подстрока во многих строках. е.g "hello world, это должно быть проверено, и это также проверяется". этот вид значений доступен в столбце B. – Megha
Да, это то, что делает запрос в выражении SELECT. – Jeeped