【问题标题】:excel vba regex pattern exact string matchexcel vba 正则表达式模式精确字符串匹配
【发布时间】:2018-07-02 21:11:58
【问题描述】:

您好,我正在尝试修复我的代码以执行以下操作(在某些情况下)

excel 中有 2 列:P 列和 S 列。这两列都有数千行长。

P列都是多行文本字符串(产品描述) S列都是多行文本字符串(产品的cmets)

我需要编写一个 vba 函数,该函数将查看 P 列中的单元格,如果存在与 S 列中的值相关的匹配项,则返回精确的字符串匹配项。

示例:

使用正则表达式,我可以使用以下代码一次比较一行(P3 到 S3):

Public Function RxMatch( _
 ByVal SourceString As String, _
 ByVal Pattern As String, _
 Seperator As String, _
 Optional ByVal IgnoreCase As Boolean = True, _
 Optional ByVal MultiLine As Boolean = True) As Variant

Dim arrWords() As String
arrWords = Split(SourceString, separator)

 Dim oMatches As MatchCollection
 For Each word In arrWords
 With New RegExp
    .MultiLine = MultiLine
    .IgnoreCase = IgnoreCase
    .Global = False
    .Pattern = Pattern
    Set oMatches = .Execute(SourceString)
    If oMatches.Count > 0 Then
        RxMatch = oMatches(0).Value
    Else
        RxMatch = "No match"
    End If
 End With
 Next word

 End Function

但是,我需要将 P3 与所有列 S 进行比较,以查看是否有任何描述匹配,而不是将 P3 与 S3 进行比较。有没有办法更新我提供的这段代码,以便它匹配整个 S 列而不是单元格到单元格?

【问题讨论】:

  • 拥有尽可能多的条目,您可能很难找到有效的方法来执行此操作。嵌套的foreach 循环是最明显的方法,但它会很慢。
  • 使用数组会快很多。
  • 数组和指令?抱歉,我目前无法放大图片以正常查看数据。
  • VLOOKUP 对您有帮助吗?以我的经验,它比 VBA 更快。
  • 您是否只是检查 S 列中的任何子字符串是否包含在 P 列中较长的字符串中?您的图片非常小,很难看到。

标签: regex vba excel string-matching


【解决方案1】:

如果你小心任何隐藏字符、换行符等,那么你应该能够使用数组和 Instr 函数。

Option Explicit
Public Sub FindMatches()
    Dim arr(), i As Long, j As Long
    With ActiveSheet
        arr = .Range("P1:T" & .Cells(.Rows.Count, "P").End(xlUp).Row).Value
        For i = LBound(arr, 1) To UBound(arr, 1)
            For j = LBound(arr, 1) To UBound(arr, 1)
                If InStr(arr(i, 1), arr(j, 4)) > 0 Then arr(i, 5) = arr(i, 5) & "," & arr(j, 4)
            Next j
        Next i
        For i = LBound(arr, 1) To UBound(arr, 1)
            arr(i, 5) = Application.WorksheetFunction.Substitute(arr(i, 5), ",", vbNullString, 1)
        Next i
        .Range("P1").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    End With
End Sub

T 列输出的数据集:

【讨论】:

  • 有任何反馈吗?
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2021-03-19
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多