Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表匹配函数的VBA-Isnumber_Vba_Excel_Excel Formula - Fatal编程技术网

列表匹配函数的VBA-Isnumber

列表匹配函数的VBA-Isnumber,vba,excel,excel-formula,Vba,Excel,Excel Formula,因此,我重新整理/匹配了我们实验室多个试验的列表 找到的所有项目都有一个主列表 并非所有出现在主列表中的项目都能在每次试验中找到 我想使用VBA匹配实验列表中可能找到的值,并用数字对其进行分类,以便以后可以对其进行排序并与其他数据集对齐 这是我到目前为止对每个细胞的研究结果,这只是我的5个值 IFS(ISNUMBER(SEARCH($K$7,C14))=TRUE,$J$7,ISNUMBER(SEARCH($K$8,C14))=TRUE,$J$8,(ISNUMBER(SEARCH($K$9,C14

因此,我重新整理/匹配了我们实验室多个试验的列表

  • 找到的所有项目都有一个主列表
  • 并非所有出现在主列表中的项目都能在每次试验中找到
  • 我想使用VBA匹配实验列表中可能找到的值,并用数字对其进行分类,以便以后可以对其进行排序并与其他数据集对齐
  • 这是我到目前为止对每个细胞的研究结果,这只是我的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、多变量问题和内置偏移量的某种组合是可行的,但我遇到了太多的错误

    有人有什么想法吗


    谢谢

    重新措辞,以确保我正确理解您的意思

    • 列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中的一个单词中是否包含关键字。例如:
    关键词:his
    <代码>c14:这是我的东西,因为
    他的
    这个
    的一部分,所以会标记匹配项

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

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

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

    • 您的数据从
      C14
      开始向下扩展。下面什么都没有
    • 在数据中找到的代码将位于
      B14
      (同一
      C14
      内容的多个代码将用
      逗号分隔
    • 关键字将从
      K7
      开始向下扩展
    • 这些关键字的代码将位于列
      J
    • 只会找到整个单词(较长单词中的单词将不匹配)
    • 正则表达式用于进行匹配。
      • 对于正则表达式,
        \b
        表示单词边界
      • 单词边界是单词字符与非单词字符相邻的点,或者是行的开头或结尾。
        • 单词字符是一组
          [A-Za-z0-9.]
          中的字符(字母、数字和下划线)
      • 如果这不能充分描述数据中的单词边界,可以使用不同的算法
    享受




    为了清楚起见,你想在C中筛选并在J或K中查找匹配项吗?我想在C中筛选并在K中查找匹配项,然后用J中的值对标识值(在上面的例子中是B中)左侧的单元格进行编号。因此,B和C的行相等,而J和K的行相等(在我看来)谢谢Ron!不是100%确定如何操作regex代码,但这一切似乎都是可行的!我可能会再次发布,因为我试图更广泛地扩展它!
    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