【问题标题】:Macro to find specific words in a list of string expressions在字符串表达式列表中查找特定单词的宏
【发布时间】:2020-09-03 15:18:58
【问题描述】:

我正在尝试做的是参考一列以在另一列中查找关键字。例如:

我需要搜索的是 C 列中的数千个单元格到 A 列中的数百个单元格。当从 C 中在 A 中找到一个字符串时,我希望它突出显示。

在这种情况下,在运行宏之后,唯一会突出显示的单元格将是“Bird Cat”和“The Snake”。到目前为止,我得到的是以下内容:

Sub Test()

Columns("A:A").Select
        Selection.Find(What:="Bird", After:=ActiveCell, LookIn:=x1Formulas2, _
        LookAt:=x1Part, SearchOrder:=x1ByRows, SearchDirection:=x1Next, _
        MatchCase:=False, SearchFormulas:=False).Activate
    Selection.Style = "Good"
    Cells.FindNext(After:=ActiveCell).Activate

    
End Sub

在某一时刻,我确实有一个 Do Until IsEmpty(ActiveCell)...在代码中循环,但我认为这行不通。

我还是 VBA 编码的新手,因此欢迎任何一般输入。

【问题讨论】:

  • 你有一堆 x1 前缀而不是 xl
  • 在没有 VBA 的情况下,是否有理由不使用条件格式来执行此操作? (Related question)
  • 如果 C 中有“cake”,A 中有“pancake”怎么办?
  • 如果 C 中有“cake”,A 中有“pancake”怎么办?我不担心这个。在实际数据集中,A 列将是“程序的 [userID] 的供应项目”,c 列将是 [userID]。这将是一个字母,然后是一串 5 个数字。我正在尝试搜索我可能拥有的与系统相关的任何票证,以查看可能会配置谁。

标签: excel vba


【解决方案1】:

此代码使用 Find 和 FindNext 来查找单个单词并标记找到该单词的所有单元格。

Sub MarkMatches(ByVal Crit As String)
    ' 085

    Dim Rng         As Range                ' range to search
    Dim Fnd         As Range                ' cell where match was found
    Dim FirstFnd    As Long                 ' row where a match was first found
    Dim Arr         As Variant              ' Rng.Value (for execution speed)
    
    With Worksheets("Sheet2")               ' change to suit
        ' search in column A, starting from row 1
        Set Rng = .Range(.Cells(1, "A"), _
                         .Cells(.Rows.Count, "A").End(xlUp))
    End With
    
    With Rng
        Arr = .Value
        .Interior.Pattern = xlNone          ' clear existing colouring
        Set Fnd = .Find(Crit, .Cells(.Cells.Count), _
                        xlValues, xlPart, MatchCase:=False)
        If Not Fnd Is Nothing Then
            FirstFnd = Fnd.Row
            Do
                ' "1" refers to column A here:-
                Arr(Fnd.Row, 1) = " " & Arr(Fnd.Row, 1) & " "
                ' exclude partial matches, like "catalog" matching "cat"
                If InStr(1, Arr(Fnd.Row, 1), " " & Crit & " ", vbTextCompare) Then
                    Fnd.Interior.Color = vbYellow       ' mark found match
                End If
                Set Fnd = .FindNext(Fnd)
                If Fnd Is Nothing Then Exit Do
            Loop While Fnd.Row > FirstFnd
        End If
    End With
End Sub

您可以使用下面给出的过程调用上述子程序。

Sub Macro1()
    MarkMatches "bird"
End Sub

您可以指定一个单元格引用,而不是指定单词,例如 'MarkMatches(Cells(2, "A").Value'。如果您希望搜索单词列表,您可以将此调用置于循环中,但您首先需要解决如何区分标记的单词,因为它们符合一个标准或另一个标准。

过程 MarkMatches 包含行 Rng.Interior.Pattern = xlNone 删除所有以前的亮点。此行的操作可以移至调用过程,但您当前的问题并没有充分说明您实施更好策略的意图。

【讨论】:

  • 我只是把它放在上面,但实际的数据集列 A 将是“程序的 [userID] 的供应项目”,而列 c 将是 [userID]。这将是一个字母,然后是一串 5 个数字。我所做的是从系统中提取所有用户 ID。然后,我将所有 ID 放入 Excel 文档中,其中包含该系统的 ServiceNow 票证中的票证编号/摘要。我有大约 10,000 张票证要通过 15 个不同的系统。我可以对数据进行排序以挑选出系统并拉出所述系统上的所有活动用户,但除此之外我无法自动化
  • 有点转移球门柱,是吗? :-) 我不认为你的类比那么糟糕。因此我的代码很有用。您可以输入用户 ID 并突出显示所有关联的票号。也许您想扩展它以创建过滤列表,但这将是论坛上另一个问题的主题,以及如何进一步自动化流程的问题。你需要找到空间来描述这个过程,我们这里没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2016-04-28
相关资源
最近更新 更多