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