识别单词,如果匹配则突出显示价值VBA。

huangapple go评论62阅读模式
英文:

Identify the Words if its matches highlight the value VBA

问题

以下是代码的翻译部分:

Sub HighlightMatchingWords()
    Dim lastRowSheet1 As Long
    Dim lastRowSheet2 As Long
    Dim i As Long
    Dim j As Long
    Dim cellValueSheet1 As String
    Dim cellValueSheet2 As String
    Dim wordsSheet1 As Variant
    Dim wordsSheet2 As Variant
    Dim wordIndexSheet1 As Long
    Dim wordIndexSheet2 As Long
    Dim wordSheet1 As String
    Dim wordSheet2 As String
    
    ' 获取Sheet1中列A的数据的最后一行
    lastRowSheet1 = Sheets("Sheet1").Cells(Sheets("Sheet1").Rows.Count, 1).End(xlUp).Row
    
    ' 获取Sheet2中列A的数据的最后一行
    lastRowSheet2 = Sheets("Sheet2").Cells(Sheets("Sheet2").Rows.Count, 1).End(xlUp).Row
    
    ' 循环遍历Sheet1中列A的每一行数据
    For i = 1 To lastRowSheet1
        ' 获取Sheet1当前行列A的值
        cellValueSheet1 = Sheets("Sheet1").Cells(i, 1).Value
    
        ' 将字符串拆分为单词,用于Sheet1
        wordsSheet1 = Split(cellValueSheet1, " ")
    
        ' 循环遍历Sheet2中列A的每一行数据
        For j = 1 To lastRowSheet2
            ' 获取Sheet2当前行列A的值
            cellValueSheet2 = Sheets("Sheet2").Cells(j, 1).Value
    
            ' 将字符串拆分为单词,用于Sheet2
            wordsSheet2 = Split(cellValueSheet2, " ")
    
            ' 循环遍历Sheet1中的每个单词
            For wordIndexSheet1 = 0 To UBound(wordsSheet1)
                ' 循环遍历Sheet2中的每个单词
                For wordIndexSheet2 = 0 To UBound(wordsSheet2)
                    ' 如果单词匹配,将Sheet1中的单词标记为红色高亮显示
                    If StrComp(wordsSheet1(wordIndexSheet1), wordsSheet2(wordIndexSheet2), vbTextCompare) = 0 Then
                        wordSheet1 = wordsSheet1(wordIndexSheet1)
                        ' 在Sheet1中高亮显示单词
                        Sheets("Sheet1").Cells(i, 1).Characters(InStr(cellValueSheet1, wordSheet1), Len(wordSheet1)).Font.ColorIndex = 3 ' 高亮显示为红色
                        Sheets("Sheet1").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2).Value & " " & wordSheet1
                    End If
                Next wordIndexSheet2
            Next wordIndexSheet1
        Next j
    Next i
End Sub

请注意,翻译中保留了代码中的变量和注释,以保持代码的完整性。

英文:

Sample data:

识别单词,如果匹配则突出显示价值VBA。
识别单词,如果匹配则突出显示价值VBA。

Code:

Sub HighlightMatchingWords()
Dim lastRowSheet1 As Long
Dim lastRowSheet2 As Long
Dim i As Long
Dim j As Long
Dim cellValueSheet1 As String
Dim cellValueSheet2 As String
Dim wordsSheet1 As Variant
Dim wordsSheet2 As Variant
Dim wordIndexSheet1 As Long
Dim wordIndexSheet2 As Long
Dim wordSheet1 As String
Dim wordSheet2 As String
' Get the last row of data in column A for Sheet1
lastRowSheet1 = Sheets("Sheet1").Cells(Sheets("Sheet1").Rows.Count, 1).End(xlUp).Row
' Get the last row of data in column A for Sheet2
lastRowSheet2 = Sheets("Sheet2").Cells(Sheets("Sheet2").Rows.Count, 1).End(xlUp).Row
' Loop through each row of data in column A for Sheet1
For i = 1 To lastRowSheet1
' Get the value in column A for the current row in Sheet1
cellValueSheet1 = Sheets("Sheet1").Cells(i, 1).Value
' Split the string into words for Sheet1
wordsSheet1 = Split(cellValueSheet1, " ")
' Loop through each row of data in column A for Sheet2
For j = 1 To lastRowSheet2
' Get the value in column A for the current row in Sheet2
cellValueSheet2 = Sheets("Sheet2").Cells(j, 1).Value
' Split the string into words for Sheet2
wordsSheet2 = Split(cellValueSheet2, " ")
' Loop through each word in Sheet1
For wordIndexSheet1 = 0 To UBound(wordsSheet1)
' Loop through each word in Sheet2
For wordIndexSheet2 = 0 To UBound(wordsSheet2)
' If the words match, highlight the word in Sheet1
If StrComp(wordsSheet1(wordIndexSheet1), wordsSheet2(wordIndexSheet2), vbTextCompare) = 0 Then
wordSheet1 = wordsSheet1(wordIndexSheet1)
' Highlight the word in Sheet1
Sheets("Sheet1").Cells(i, 1).Characters(InStr(cellValueSheet1, wordSheet1), Len(wordSheet1)).Font.ColorIndex = 3 ' Highlight in red
Sheets("Sheet1").Cells(i, 2).Value = Sheets("Sheet1").Cells(i, 2).Value & " " & word
End If
Next wordIndexSheet2
Next wordIndexSheet1
Next j
Next i
End Sub

i tried this im not getting 100% accuracy can anyone help?

答案1

得分: 2

以下是使用.Find实现此目标的一种方法。我已经添加了注释,所以您应该可以轻松理解它。如果有疑问,请随时提问。

代码:

Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim rng As Range
Dim aCell As Range, bCell As Range
Dim InputAr As Variant
Dim i As Long
'设置相关工作表
Set ws = Sheet1
'这是需要着色的文本范围
Set rng = ws.Range("A1:A6")
'这是包含关键字的范围
InputAr = ws.Range("D1:D5")
'遍历搜索关键字
For i = LBound(InputAr) To UBound(InputAr)
'查找文本
Set aCell = rng.Find(What:=InputAr(i, 1), LookIn:=xlFormulas, LookAt:=xlPart)
'如果找到
If Not aCell Is Nothing Then
Set bCell = aCell
'着色文本
ColorText aCell, InputAr(i, 1)
'查找下一个出现
Do
Set aCell = rng.FindNext(After:=aCell)
If Not aCell Is Nothing Then
If aCell = bCell Then Exit Do
ColorText aCell, InputAr(i, 1)
End If
Loop
'将找到的范围设置为Nothing
Set aCell = Nothing
End If
Next i
End Sub
'用于着色文本的子程序
Private Sub ColorText(r As Range, keyword As Variant)
Dim sPos As Long
Dim TxtLen As Long
'设置起始位置
sPos = InStr(1, r.Value2, keyword, vbTextCompare)
'获取长度
TxtLen = Len(keyword)
'着色文本
r.Characters(Start:=sPos, Length:=TxtLen).Font.Color = RGB(255, 0, 0)
End Sub

截图:

识别单词,如果匹配则突出显示价值VBA。

英文:

Here is one way to achieve this using .Find. I have commented the code so you should not have a problem understanding it. If you do then simply ask.

Code:

Option Explicit
Sub Sample()
Dim ws As Worksheet
Dim rng As Range
Dim aCell As Range, bCell As Range
Dim InputAr As Variant
Dim i As Long     
'~~> Set this to the relevant sheet
Set ws = Sheet1
'~~> This is the range where the text nees to be colored
Set rng = ws.Range("A1:A6")
'~~> This is the range where you have the keywords
InputAr = ws.Range("D1:D5")
'~~> Loop through the seach keywords
For i = LBound(InputAr) To UBound(InputAr)
'~~> Find the text
Set aCell = rng.Find(What:=InputAr(i, 1), LookIn:=xlFormulas, LookAt:=xlPart)
'~~> If found
If Not aCell Is Nothing Then
Set bCell = aCell
'~~> Color the text
ColorText aCell, InputAr(i, 1)
'~~> Find the next occurance
Do
Set aCell = rng.FindNext(After:=aCell)
If Not aCell Is Nothing Then
If aCell = bCell Then Exit Do
ColorText aCell, InputAr(i, 1)
End If
Loop
'~~> Set the found range to Nothing
Set aCell = Nothing
End If
Next i
End Sub
'~~> Proc to color the text
Private Sub ColorText(r As Range, keyword As Variant)
Dim sPos As Long
Dim TxtLen As Long
'~~> Set the starting position
sPos = InStr(1, r.Value2, keyword, vbTextCompare)
'~~> Get the length
TxtLen = Len(keyword)
'~~> Color the text
r.Characters(Start:=sPos, Length:=TxtLen).Font.Color = RGB(255, 0, 0)
End Sub

Screenshot:

识别单词,如果匹配则突出显示价值VBA。

答案2

得分: 1

以下是翻译好的内容:

你可以尝试:

Sub Test()
'识别两张表
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Worksheets("Sheet1")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Worksheets("Sheet2")
'获取每张表的最后一行
Dim lr1 As Long: lr1 = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
Dim lr2 As Long: lr2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
'定义要处理的两个区域
Dim rng1 As Range: Set rng1 = ws1.Range("A1:A" & lr1)
Dim rng2 As Range: Set rng2 = ws2.Range("A1:A" & lr2)
'初始化正则表达式对象
With CreateObject("vbscript.regexp")
.Global = True
.Pattern = "\b(?:" & Join(Application.Transpose(rng2.Value), "|") & ")\b"        
'循环处理rng1中的每个单元格
For Each cl In rng1
If .Test(cl.Value) Then
For Each m In .Execute(cl.Value)
cl.Characters(m.FirstIndex + 1, m.Length).Font.Color = vbRed
Next
End If
Next
End With
End Sub

这将产生类似下面的结果:

识别单词,如果匹配则突出显示价值VBA。

注意: 使用正则表达式使得以下操作成为可能:

  • 区分真正的和错误的匹配(例如:'DISORDERLY NUMBERPLATES' <> 'DISORDERLY NUMBER');

  • 在单个单元格中找到相同子字符串的多个匹配项(例如:'TRAFFIC COPS STUCK IN TRAFFIC')。

英文:

You can try:

Sub Test()
&#39;Identify both sheets
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Worksheets(&quot;Sheet1&quot;)
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Worksheets(&quot;Sheet2&quot;)
&#39;Retrieve the last used row per sheet
Dim lr1 As Long: lr1 = ws1.Cells(ws1.Rows.Count, 1).End(xlUp).Row
Dim lr2 As Long: lr2 = ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
&#39;Define both ranges to work with
Dim rng1 As Range: Set rng1 = ws1.Range(&quot;A1:A&quot; &amp; lr1)
Dim rng2 As Range: Set rng2 = ws2.Range(&quot;A1:A&quot; &amp; lr2)
&#39;Initialize an regex object
With CreateObject(&quot;vbscript.regexp&quot;)
.Global = True
.Pattern = &quot;\b(?:&quot; &amp; Join(Application.Transpose(rng2.Value), &quot;|&quot;) &amp; &quot;)\b&quot;        
&#39;Loop each cl in rng1
For Each cl In rng1
If .Test(cl.Value) Then
For Each m In .Execute(cl.Value)
cl.Characters(m.FirstIndex + 1, m.Length).Font.Color = vbRed
Next
End If
Next
End With
End Sub

This would result in something like the below:

识别单词,如果匹配则突出显示价值VBA。

Note: The use of a regular expression made it possible to:

  • Distinguish between true and false positives (e.g.: 'DISORDERLY NUMBERPLATES' <> 'DISORDERLY NUMBER');

  • Find multiple of the same substrings in a single cell (e.g.: 'TRAFFIC COPS STUCK IN TRAFFIC').

huangapple
  • 本文由 发表于 2023年5月10日 19:27:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/76217839.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定