返回列表 上一主題 發帖

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

謝謝 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

回復 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

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

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

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

TOP

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

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離研發最近 ^^,我實在是太...

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

TOP

本帖最後由 Hsieh 於 2011-5-9 23:47 編輯

"研發ccba"怎會是有連續字串為"研發b"呢?
這樣說吧
你是要在"研發ccba"中找看看是否有"研發a"或"研發b"
那你把"研發ccba",每3個字切割會得到
"研發c"、"發cc"、"ccb"、"cba"
這裡面會有"研發a"或"研發b"嗎?
學海無涯_不恥下問

TOP

本帖最後由 jesscc 於 2011-5-9 22:39 編輯

喔,不!sheet1才是資料庫。
因為sheet2�堛漲r串都比較長,比較亂,所以我在想只要在sheet1�堣髀翵鴩鉹仍X個連續字串都符合,就將相關資料抓回sheet2,是我的想法剛好相反嗎?原始檔案看起來像是這樣比對的啊!

這樣說好了,如果sheet2�埵酗@筆資料"研發ccab",在sheet1�媕雩茯O抓"研發a"吧!
                  如果sheet2�埵酗@筆資料"研發ccba",在sheet1�媕雩茯O抓"研發b"吧!
純粹個人思考。
Jess

TOP

先從你的需求開始,你是要在sheet2中尋找有sheet1的A欄字串
也就是說Sheet2中有包含Sheet1的字串,然後將代號、類別填到Sheet2
那試問,"研發A"、"研發B"在Sheet2中的資料你如何能找到?
A8內容"(100年3月2日)研發1"
他並未出現"研發A"或"研發B"
所謂模糊比對是說字串中包含關鍵字,還可能出現其他字元
就因為你的關鍵字現在是"研發A"或"研發B"
那麼要在尋找字串中有出現"研發A"或"研發B"
才會被認為比對成功
學海無涯_不恥下問

TOP

本帖最後由 jesscc 於 2011-5-9 20:40 編輯

非常感謝各位先進的熱心指導,各位大大的功力小弟只能說佩服,但小弟真正的瓶頸,仍未克服,我修改了一下sheet1中的資料,增加了"研發A"、"研發B"並多加了兩個欄位,如此一來sheet2中只要有"研發"字眼的,就都比對不到了,照道理,這並沒有違反資料庫正規化資料唯一性的要求,是VBA沒有這樣的查詢函數嗎?

模糊比對修改後.rar (15.47 KB)
Jess

TOP

        靜思自在 : 話多不如話少,話少不如話好。
返回列表 上一主題