列A有產品名稱。E列的關鍵字分為1、2和3個單詞。列F有一個目錄名稱。
我希望每次產品名稱與關鍵字匹配時,B欄都填寫目錄名稱。
我已經結束了100.00 0rows,你會怎么做才能讓它變快?使用Arrays?字典?
我試著做嵌套循環,但效率很低,速度也很慢。
此代碼所做的是將第一組關鍵字拆分為單獨的單詞。示例:紅色三菱轉換為:aWord(0):紅色aWord(1):三菱
然后,它將中的第一個產品名稱分隔為單獨的單詞。示例:Red Cool Mitsubishi pWord(0):Red pWord(1):Cool pWord(2):三菱
然后,如果第一個關鍵字的每個單詞在第一個產品的單詞中找到一個相等的單詞,那么我們找到了匹配項。
它將對每個產品名稱執行此操作。一旦完成,它將傳遞到第二組關鍵字,并再次對每個產品名稱執行相同操作,直到完成所有關鍵字。
Sub MatchinKeyWords()
Dim keyWordsArr, productNameArr
Dim i As Long, x As Long, N As Long
Dim keyword, productWord
Dim matchFound As Boolean
Dim matchedRows() As Boolean
' Load arrays from ranges
productNameArr = Range("A1").CurrentRegion.Value
keyWordsArr = Range("D1").CurrentRegion.Value
' Initialize the array to track matched rows
ReDim matchedRows(LBound(productNameArr, 1) To UBound(productNameArr, 1))
For i = LBound(matchedRows) To UBound(matchedRows)
matchedRows(i) = False
Next i
' Iterate over keyWordsArr
For i = LBound(keyWordsArr, 1) + 1 To UBound(keyWordsArr, 1)
keyword = Split(keyWordsArr(i, 1))
' Check against each productNameArr
For x = LBound(productNameArr, 1) + 1 To UBound(productNameArr, 1)
' Skip if this productNameArr row was already matched
If matchedRows(x) Then GoTo NextProduct
productWord = Split(productNameArr(x, 1))
matchFound = True
' Check each keyword
For N = LBound(keyword) To UBound(keyword)
If IsError(Application.Match(keyword(N), productWord, 0)) Then
matchFound = False
Exit For
End If
Next N
' If match is found
If matchFound Then
productNameArr(x, 2) = keyWordsArr(i, 2) ' Fill in the match info
matchedRows(x) = True ' Mark this row as matched
End If
NextProduct:
Next x
Next i
' Print updated productNameArr to the worksheet
Range("A1").Resize(UBound(productNameArr, 1), UBound(productNameArr, 2)).Value = productNameArr
End Sub
For example,
第一步是組織關鍵詞。對于任何包含“CAR”的產品名稱,它應該只使用前兩個關鍵字進行驗證。
objDic("CAR")
是一個嵌套的字典對象,包含兩個項。順便說一句,如果你應用與上一篇文章中相同的邏輯來組織具有更多單詞的關鍵字作為字典關鍵字,這可以為大型數據集節省更多時間。
使用VBA計算產品名稱中重復次數最多的3個單詞