返回列表 上一主題 發帖

[發問] 幫忙解釋這個模糊比對範例檔

我的邏輯錯了,我以為程式會去分辨最接近"研發"的字串,"研發ccab"--> a離研發最近 ^^,我實在是太...

只差最後一步了,不過現在整個腦袋已經亂掉了,謝謝 Hsieh 大給我的觀念!
還有 oobird 大大寫的我比較能夠看得懂,剛剛用它試著去改我的工作檔案,可是一直出現錯誤,搞得我頭昏腦漲的,可不可以我把工作檔案傳來,您指點我一下該如何改?
Jess

TOP

本帖最後由 mark15jill 於 2011-5-10 08:53 編輯

樓主~ 就您附檔的 訊息來看的話
是 以 sheet1 為基礎 在sheet2 的資料內 下去做搜尋沒錯吧
既然是這樣 那 如果你 sheet2內 沒有相關的資訊 就算你在sheet1 增加再多條件 也是沒用的.

而且 如果按照樓主的意思的話
會造成一種情形
如果單一資料 符合兩種搜尋條件 那 要顯示哪個?? 就跟之前某帖一樣...
例如
      sheet1                  sheet2            顯示
A1      大明      1            大明小明           ?
A2     中明      2             中明                   2
A3      小明      3            小明                   3
那 A1   的話 他顯示要哪個?

TOP

很難懂你的邏輯
"研發ccab"--> a離研發最近 ^^
不是c 離研發最近 ?????
許多朋友不願把問題檔案提出來
又無法描述清楚
造成很多的雞同鴨講
浪費大家的時間與站長的空間

TOP

回 mark15jill 大
確實會有這種情形,不過我會慢慢修正資料庫的資料,這個問題是可以一步步解決的,謝謝你!

我重新上傳了一個檔案,有新增幾欄資料,要同時傳回Sheet2,請 oobird 大幫我看一下,要如何修改好嗎?

模糊比對test.rar (16.19 KB)
Jess

TOP

回復 14# jesscc
  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. With Sheet1
  4. For Each a In .Range(.[B5], .[B56636].End(xlUp))
  5.    d(a & "") = Array(a.Offset(, 1).Value, a.Offset(, 2).Value, a.Offset(, 3).Value, a.Offset(, 4).Value)
  6. Next
  7. End With
  8. With Sheet2
  9. For Each a In .Range(.[D12], .[D56636].End(xlUp))
  10.     For Each ky In d.keys
  11.        If InStr(a, ky) > 0 Then a.Offset(, 4).Resize(, 4) = d(ky): Exit For
  12.     Next
  13. Next
  14. End With
  15. End Sub
複製代碼
學海無涯_不恥下問

TOP

謝謝 Hsieh 大!剛剛試著去 run 自己的工作檔案,只傳回4欄的資料是ok的,如果我從 Sheet1 抓回的資料改成32欄(公司的資料很龐大),用一個迴圈去跑陣列,結果就沒辦法正常執行了,是陣列的因素嗎?我記得好像在哪裡看過文章說明,陣列的"欄"是不能用迴圈去跑的。是這樣嗎?
  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. With Sheet1
  4. For Each a In .Range(.[B5], .[B56636].End(xlUp))
  5.   For i = 1 To 32
  6.    d(a & "") = Array(a.Offset(, i).Value)     ', a.Offset(, 2).Value, a.Offset(, 3).Value, a.Offset(, 4).Value)
  7. Next i
  8. Next
  9. End With
  10. With Sheet2
  11. For Each a In .Range(.[D12], .[D56636].End(xlUp))
  12.     For Each ky In d.keys
  13.        If InStr(a, ky) > 0 Then a.Offset(, 12).Resize(, 32) = d(ky): Exit For
  14.     Next
  15. Next
  16. End With
  17. End Sub
複製代碼
Jess

TOP

這段就是你的資料範圍對嗎?
For i = 1 To 32
  d(a & "") = Array(a.Offset(, i).Value)     ', a.Offset(, 2).Value, a.Offset(, 3).Value, a.Offset(, 4).Value)
Next i
這樣單筆資料還是只有4欄
改成
Dim Ar(32)
For i = 0 To 31
  Ar(i) = a.Offset(, i).Value
Next i
d(a & "") =Ar
這樣就有32欄資料
學海無涯_不恥下問

TOP

Ok了!
可是剛剛仔細檢查了一下,發現比對後傳回來的資料,有很多筆都不是正確的,真是快被這個模糊比對搞瘋了。
Jess

TOP

回復 18# jesscc

資料不正確有可能是SHEET2的字串中含有2組以上的關鍵字
程式會認定第一個比對到的關鍵字做判斷
或許你要在關鍵字中歸類下功夫
上傳你的關鍵字清單及錯誤的資料看看才能確定出錯的原因
學海無涯_不恥下問

TOP

因為資料庫太龐大,我整理一些較具代表性的,明天傳上來,讓您看看。真的好感謝你,幫我解決了好多問題!
Jess

TOP

        靜思自在 : 閒人無樂趣,忙人無是非。
返回列表 上一主題