Vba 计算并突出显示短语中的关键字

Vba 计算并突出显示短语中的关键字,vba,excel,scripting,highlight,Vba,Excel,Scripting,Highlight,我有一张有两列的excel表格。第一列是关键短语,第二列是消息。关键短语可能出现在messages列中。我需要知道一个关键短语在messages列中出现了多少次。请建议一些好的和简单的方法来寻找 关键短语是一列,消息是第二列。messages列是1个或多个关键短语的组合(串联)。我需要找出每条消息包含多少关键短语。您可以使用这个公式COUNTIF(B:B;“*”&A2&“*”)从第二行开始。您可能能够使用模块子过程收集有效计数,该子过程执行内存数组中的所有数学运算,并将计数返回工作表 我使用了

我有一张有两列的excel表格。第一列是关键短语,第二列是消息。关键短语可能出现在messages列中。我需要知道一个关键短语在messages列中出现了多少次。请建议一些好的和简单的方法来寻找


关键短语是一列,消息是第二列。messages列是1个或多个关键短语的组合(串联)。我需要找出每条消息包含多少关键短语。

您可以使用这个公式
COUNTIF(B:B;“*”&A2&“*”)
从第二行开始。

您可能能够使用模块子过程收集有效计数,该子过程执行内存数组中的所有数学运算,并将计数返回工作表

我使用了一些标准关键字和短语来创建上述示例数据

点击Alt+F11,当VBE打开时,立即使用下拉菜单插入► 模块(Alt+I,M)。将以下内容粘贴到名为Book1-Module1(代码)的新模块代码表中

选项显式
子计数\u字符串\u内部\u字符串()
变暗rw为长,lr为长
Dim k为长,p为长,vKEYs为变量,vPHRASEs为变量,vCOUNTs为变量
重拨vKEYs(0)
重拨虚拟短语(0)

对于工作表(“Sheet1”),如果Excel数据是SQL查询的结果,我建议使用一个子查询或分区雕刻T-SQL,该子查询或分区将结果与其余数据一起传递。messages列可以有多个关键字短语出现在第一列中。E、 如果关键短语是say“this to test”,那么这个字符串可以作为子字符串出现在messages列的许多行中。e、 g“你好,世界;这是要测试的;这也是正在测试的;”。此类值在B列中可用。是的,这是SELECT语句中的子查询所做的。请您帮助我理解这一点。很抱歉,我不是excel的经常用户。
B:B
是指整个B列,其中包含消息。公式将检查它
A2
是对a列第二行中具有键的单元格的引用。星号(
*
)是用于搜索的通配符。符号(&)是用于连接字符串的运算符。例如,如果在a列中有一个键“excel”,在B列中有一条消息“excel 2016与Windows 10兼容”,则需要构建搜索模式
*excel*
。这就是为什么在公式参数的开头和结尾使用字符串部分
“*”
。您可以使用
&
将其与密钥连接起来。谢谢,但很抱歉,我有一个疑问。这是否仅将一个A2元素与整个列B:B进行比较?。我需要将A列的所有值与coulmn B的所有值进行比较。@Megan,尝试将公式
=(SUMPRODUCT(LEN(B:B))-SUMPRODUCT(LEN(SUBSTITUTE(B:B;A2;“”)))/LEN(A2)
插入单元格C2,然后向下展开。这太棒了。谢谢你的回复。很好用,很高兴听到你这么说。在这个过程中,我不得不做出一些假设,但似乎我猜对了。还需要一个帮助。一些关键短语有一些日期和数字,在原始消息中可能有所不同,但消息的其余部分保持不变。e、 g关键短语是“Id创建xx xx失败”,消息是“Id创建9823023失败”。你能帮我一个忙吗?匹配时它会忽略数字。添加这个功能意味着需要正则表达式和一些模糊逻辑。简言之,这将破坏这一努力,需要彻底重写。鉴于缺少示例关键字和短语导致了这个缺点,为什么不发起另一个可以概述新需求的示例呢。你甚至可以在这里就新问题发表评论,因为我对如何进行有一些想法。我在下一周内无法发布另一个问题:(
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