用于列表匹配功能的VBA - Isnumber

时间:2017-07-17 23:42:55

标签: excel vba excel-vba excel-formula

所以我在实验室中重新排序/匹配来自多个试验的列表

  1. 找到所有项目的主列表
  2. 并非所有出现在主列表中的项目都在每个试用版中找到
  3. 我想使用VBA来匹配实验列表中的POTENTIALLY找到的值,并将其与数字分类,以便以后可以对其进行排序并与其他数据集对齐。
  4. 所以这就是我到目前为止每个单元格的内容,它仅适用于我的5个值......

    IFS(ISNUMBER(SEARCH($K$7,C14))=TRUE,$J$7,ISNUMBER(SEARCH($K$8,C14))=TRUE,$J$8,(ISNUMBER(SEARCH($K$9,C14)))=TRUE,$J$9,(ISNUMBER(SEARCH($K$10,C14)))=TRUE,$J$10,(ISNUMBER(SEARCH($K$11,C14)))=TRUE,$J$11)
    

    块K是主列表,块J是我的编号功能,块C是改变每个试验的实际输出。

    看起来某种类型的isnumber,多变量问题和内置偏移的组合会起作用,但我会遇到太多错误。

    有人有什么想法吗?

    谢谢!

1 个答案:

答案 0 :(得分:1)

重新措辞,以确保我理解正确

  • 列K包含关键字列表
  • 列J作为与这些关键字相关联的值列表
  • C列的短语可能包含K列中的关键字
  • 如果C列中的单元格包含该关键字,则您希望从列B中与列B中的关键字相邻的列J返回值

以下公式将返回最后一个“匹配”。显然,您可以根据需要扩展J:K列的范围。

B14: =LOOKUP(2,1/SEARCH($K$7:$K$11,C14),$J$7:$J$11)

如果关键字包含在C14中的单词中,则可能会出现问题,具体取决于您的数据。例如:Keyword: hisc14: This is my stuff由于histhis的一部分,因此会标记匹配。

如果该问题可能导致问题,则根据您的数据结构,可能需要对代码进行微小更改;或VBA解决方案。

此外,如果您可能有多个匹配项,则VBA解决方案会更简单。

这是一个VBA解决方案,它做出与上面类似的假设。

  • 您的数据从C14开始并向下延伸。
  • 下面没有任何内容
  • 数据中的代码查找位于B14(相同C14内容的多个代码将由comma-space
  • 分隔
  • 关键字将从K7开始并向下延伸
  • 这些关键字的代码位于J
  • 的相邻行
  • 只会找到整个单词(较长单词中的单词不会匹配)
  • 正则表达式用于进行匹配。
    • 使用正则表达式,\b表示单词边界。
    • 单词边界是单词字符与非单词字符或行的开头或结尾相邻的点。
      • 单词字符是[A-Za-z0-9_](字母,数字和下划线)集合中的字符
    • 如果这不能充分描述数据中的单词边界,则可以使用不同的算法。

享受

Option Explicit
Sub ListMatch()
    Dim WS As Worksheet
    Dim rCodeData As Range, rCodeKeyWord As Range
    Dim vCodeData, vCodeKeyWord
    Dim RE As Object, MC As Object
    Dim I As Long, J As Long

Set WS = Worksheets("Sheet1") 'or whatever
With WS
    'data in C14:Cn 'relevant code adjacent in column B
    Set rCodeData = .Range(.Cells(14, 3), .Cells(.Rows.Count, 3).End(xlUp)).Offset(columnoffset:=-1).Resize(columnsize:=2)

    'codes and keywords in J7:Kn
    Set rCodeKeyWord = .Range(.Cells(7, 10), .Cells(.Rows.Count, 10).End(xlUp)).Resize(columnsize:=2)
End With

'read into arrays for speed of execution
vCodeData = rCodeData
vCodeKeyWord = rCodeKeyWord

'initialize regex
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .ignorecase = True

    'go through the data and look for keywords
    For I = 1 To UBound(vCodeData, 1)
        vCodeData(I, 1) = ""
        For J = 1 To UBound(vCodeKeyWord, 1)
            .Pattern = "\b" & vCodeKeyWord(J, 2) & "\b"
            If .test(vCodeData(I, 2)) = True Then
                vCodeData(I, 1) = vCodeData(I, 1) & ", " & vCodeKeyWord(J, 1)
            End If
        Next J
        vCodeData(I, 1) = Mid(vCodeData(I, 1), 3)
    Next I
End With

rCodeData = vCodeData

End Sub