VBA列表匹配function – Isnumber

所以我回来了在我们实验室的多个试验中sorting/匹配列表

  1. 有一个发现的所有项目的主列表
  2. 并非所有出现在主列表中的项目都在每个试验中都find
  3. 我想使用VBA来匹配实验列表中的POTENTIALLYfind的值,并用一个数字对它进行分类,以便稍后将其与其他数据集进行sorting和alignment。

所以这里是我所有的每个单元格,它只是我的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是与此相关的编号function,方块C是改变每次试验的实际输出。

这似乎是某种数量的组合,多元化的问题与抵消内置的将工作,但我提出了太多的错误。

有人有主意吗?

谢谢!

为了确保我正确理解你,请重新翻译

  • K列有一个关键字列表
  • 列J作为与这些关键字相关联的值的列表
  • C列有一个可能包含来自列K的关键字的短语
  • 如果C列中的单元格包含该关键字,则要返回列B中K列中与该关键字相邻的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解决scheme。

另外,如果您可能有多个匹配,VBA解决scheme将会更简单。

这是一个VBA解决scheme,与上面类似的假设。

  • 您的数据从C14开始,向下延伸。 下面什么都没有
  • 在数据中的代码查找将在B14 (相同的C14内容的多个代码将用comma-space分隔
  • 关键字将从K7开始向下延伸
  • 这些关键字的代码将在列J的相邻行中
  • 只会find整个单词(长单词中的单词不会被匹配)
  • 正则expression式用于匹配。
    • 用正则expression式, \b表示一个字边界。
    • 单词边界是单词字符与非单词字符或线条的开始或结尾相邻的点。
      • 单词字符是[A-Za-z0-9_] (字母,数字和下划线)组中的字符,
    • 如果这不足以描述数据中的单词边界,则可以使用不同的algorithm。

请享用


 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