2017-07-17 50 views
0

所以我回來整理/在我們的實驗室匹配來自多個試驗名單VBA的名單核對功能 - ISNUMBER

  1. 有所有項目的一個主列表中找到
  2. 並非出現在所有項目在每個試驗中找到主列表
  3. 我想使用VBA來匹配實驗列表中的POTENTIALLY找到的值,並用數字對其進行分類,以便稍後對其進行排序並與其他數據集對齊。

所以這裏是我迄今對每個Cell,這只是我的價值觀的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,多變量問題與內置的偏移量將工作,但我提出了太多的錯誤。

任何人有任何想法?

謝謝!

+0

所以要清楚你要到C進行篩選,尋找在任J或K比賽嗎? –

+0

我想篩選C並在K中查找匹配,然後用J中的值將單元格標識到標識值(這將在上面的實例中爲B中)的左側。因此,B和C的行相等J和K的行數相等(在我看來) – Bez

回答

1

改變措辭,以確保我理解正確

  • 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解決方案。此外,如果您可能有多個匹配項,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 

+0

感謝Ron!不是100%確定如何操作正則表達式代碼,但它似乎工作!我可能會再次發帖,因爲我試圖更廣泛地擴展它! – Bez