【问题标题】:Excel find function to find whole words from an active cell containing sentences, and not individual charactersExcel 查找功能可从包含句子的活动单元格中查找整个单词,而不是单个字符
【发布时间】:2018-02-14 12:00:51
【问题描述】:

附件是我到目前为止的代码。我的问题是我似乎无法让宏仅将整个单词表(2)B列活动单元格(在单元格中包含多个单词)与表(1)中的范围(A列)进行比较 - 其中是整个单词的列表(如下图所示)。代码中的其他所有内容都可以正常工作,但目前它仅适用于完全匹配?

我尝试使用通配符方法,但它似乎匹配任何字符,而我需要它来比较句子中的整个单词(在活动单元格中每次都不同)。

关于我可以添加什么以便 countif 函数找到整个单词而不是字符等的任何提示? Find 函数也有同样的问题,它只会找到完全匹配的内容,如果没有找到,则返回错误。

    Sub FMEATest1()

Dim count As Integer
Dim count2 As Integer
Dim n As Integer
Dim m As Integer
Dim FML As Range
Dim i As Range
'Dim m As Integer
Dim a As Range
Dim b As Integer
Dim FML2 As Range
Dim WrdArray() As String
Dim k As Range
Dim j As Range
Dim Splitsentence As Range
Worksheets(1).Activate


Range(("A1"), Range("A1").End(xlDown)).Select

Set FML = Selection

Worksheets(2).Activate

Range("B3").Activate

Do Until ActiveCell.value = ""
Set i = ActiveCell
WrdArray() = Split(i, , , vbTextCompare)
Set Splitsentence = WrdArray().value

count = Application.WorksheetFunction.CountIf(FML, Splitsentence)

     'm = (ActiveCell.Row) + count - 1

    n = Selection.Rows.count

    Do Until n = (count)

     ActiveCell.Offset(1, 0).EntireRow.Insert
     Set a = Selection.Offset(1, 0)
        ActiveCell.COPY
        ActiveCell.Offset(1, 0).value = ActiveCell.value
        ActiveCell.PasteSpecial
     Range(i, a).Select

    n = Selection.Rows.count
    Loop

    'Copying Failure Modes for each Keyword
         Lookfor = ActiveCell.value & "*"
         Worksheets(1).Activate
         Cells.Find(What:=Lookfor, After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False).Select

        Set FML2 = Selection
        Set j = ActiveCell
     count2 = Application.WorksheetFunction.CountIf(FML2, j)
     m = Selection.Rows.count
     Do Until m = (count)

    Set k = Selection.Offset(1, 0)
        Range(j, k).Select
        m = Selection.Rows.count
    Loop

    Selection.Offset(0, 1).COPY
    Worksheets(2).Activate
    ActiveCell.Offset(0, 1).PasteSpecial


    ActiveCell.Offset(n, -1).Activate

    Loop

    End Sub

困难在于活动单元格包含一个句子,并且该句子每次都不同,如下例所示,但我需要宏来匹配工作表(2)中的 B 列到工作表(1)中的 A 列的整个关键词.

请问有人可以公开我的图片吗?

所以我会寻找能够从整个句子中的单元格 B3 中找到“charge”一词的代码(并让它在 sheet(1) 的 A 列中找到它)。以及整个句子中B4中的“Hold”一词。这些变化很大,所以我不能手动将它们输入到我需要引用活动单元的查找函数中。

代码的最终解决方案应该给出以下结果(我给出了“充电”和“保持”两个示例):

【问题讨论】:

  • 你的句子是由空格字符分隔的单词组成的吗??
  • 是的,我希望您可以使用这些图片?句子示例在 B 列和 C 列图像(表 2)中
  • Split 和循环。
  • 嘿@sporc,感谢您的回复!我一直在研究该怎么做,但只是希望有一种更简单的方法。我绝不擅长 VBA,并且已经尝试了一切来比较/研究它。任何建议都会有所帮助:)

标签: vba excel find wildcard


【解决方案1】:

我假设了 cmets 中列出的数据,因此您可能需要修改工作表名称和范围。此外,根据您工作表中的其他数据,可能需要对输出进行一些调整,但如果您根据屏幕截图模拟示例,它应该可以正常工作。

Sub x()

Dim v, vOut(), i As Long, j As Long, k As Long, va, r As Range, r1 As Long

'Assumes list of words in A1/B1 and down on "Sheet1"
Set r =Sheets("Sheet1").Range("A1").CurrentRegion

With Sheets("Sheet2") 'Assumes phrases in B1 and down on "Sheet2"
    v = .Range("B1", .Range("B" & Rows.Count).End(xlUp)).Value
    .Columns(2).ClearContents
End With

ReDim vOut(1 To UBound(v) * r.Rows.Count, 1 To 2)

For i = LBound(v, 1) To UBound(v, 1)
    va = Split(v(i, 1))
    For j = LBound(va) To UBound(va)
       For r1 = 1 To r.Rows.Count
          If LCase(Application.Trim(va(j))) = LCase(r.Cells(r1, 1)) Then
             k = k + 1
             vOut(k, 1) = v(i, 1)
             vOut(k, 2) = r.Cells(r1, 2)
          End If
       Next r1
    Next j
Next i

Sheets("Sheet2").Range("B1").Resize(k, 2) = vOut 'Puts results in B1/C1 and down on "Sheet2"

End Sub

【讨论】:

  • 嗨@SJR,这适用于第一个,但就止于此了吗?它是否有可能不会删除工作表 2 中的整个 B 列,因为这可能会被填充到 500 行?无论如何,它是否会继续向下穿过 B 列中的整个范围,直到不再留下任何句子。
  • 抱歉忘了提到文档总是从第 3 行开始的第 2 页?我在试用期间在代码中更改了这一点,但我无法让代码在 B 列中处理超过一个句子
  • 您能按照我上面的建议做,并按照您在屏幕截图中所做的那样尝试工作簿上的代码吗?我认为问题在于您的实际数据是如何布置的 - 我不明白为什么它会在一个之后停止,除非它没有找到任何匹配项。
  • 嗨,我将它输入到我的工作簿中,它在第一个充电示例后停止。然后我将“保持”放入单元格 B3 并出现“类型不匹配”错误。清晰的内容意味着它会自行停止,因为它会清除它然后尝试与任何内容进行比较?在我的代码中,我让它比较和计算表 1 中的数字,然后插入行数 -1 等于该计数。
  • 嗨@SJR,为延迟欣赏表示歉意。非常感谢您迄今为止就我提出的问题提供的所有帮助和指导!当您回答我最初提出的内容时,我接受了答案,所以脱帽致敬!再次感谢!我提出了另一个问题来解决手头的其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多