返回列表 上一主題 發帖

[發問] 在同一列同時比對兩欄資料方法

[發問] 在同一列同時比對兩欄資料方法

各位先進,小弟因工作需要要用excel 做一些資料的處理,目前遇到些問題,希望各位先進能幫我解惑

品號     名稱     製程    工序    工時
123      剪刀     下料       1       100
123      剪刀     粗胚       2       200
123      剪刀     研磨       3       100
124      叉子     下料       1       100

資料結構大概是這樣,我想同時蒐尋當品號123、工序是1,這筆資料列的位置,因為我想把相對應之工時這欄位資料擷取出來,麻煩各位先進了~謝謝

回復 24# Hsieh
原來還有這樣用法,我沒看過...
謝謝您~~
還在努力學習中!!

TOP

本帖最後由 Hsieh 於 2012-8-6 22:38 編輯

回復 23# 假面超人
  1. Sub nn()
  2. Dim Ar(), A As Range, B As Range
  3. With Sheets("Sheet1")
  4. For Each A In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))  '第一頁A2以下做迴圈
  5.   For Each Sh In Sheets(Array("Sheet2", "Sheet3")) '原資料所在工作表
  6.   With Sh
  7.      For Each B In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))  '在A2以下儲存格做迴圈
  8.         If B = A Then  '跟第一頁A欄儲存格做比對,如果符合
  9.            ReDim Preserve Ar(s)  '擴大陣列
  10.            Ar(s) = Array(B.Value, B.Offset(, 1).Value, B.Offset(, 2).Value, B.Offset(, 4).Value)  '將值寫入陣列
  11.            s = s + 1  '準備下一次擴大陣列
  12.         End If
  13.      Next
  14.   End With
  15.   Next
  16.   With Sheets("最終結果")
  17.      If s > 0 Then .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(s, 4).Value = Application.Transpose(Application.Transpose(Ar)) Else _
  18. .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 4).Value =Array(A.value,"","","")  '如果陣列有內容,就將陣列寫入結果,否則寫入一列空白
  19.      Erase Ar: s = 0  '清空陣列,並準備下一個陣列初始大小
  20.   End With
  21. Next
  22. End With
  23. End Sub
複製代碼
17列的If陳述式,因為If...Then...在同一行所以不須End If詳細語法請參考VBA說明
學海無涯_不恥下問

TOP

回復 20# Hsieh


順便想請教,在第17列的位置用了IF但是為什麼下面不用END IF做結束
而18列的程式碼又是代表什麼意思呢?

TOP

回復 20# Hsieh


版大想請教一下,目前找不到資料是忽略掉(在最後一頁上找不到任何的資料),是否可以改成找不到資料是否還是可以顯示第一頁的品號,其它欄位顯示"空白"或是"查無資料"?

TOP

回復 20# Hsieh

太謝謝Hsieh版大!!這是我想要的結果~
也謝謝smouse0220和GBKEE兩位..
在颱風假中還要動腦~
腦細胞應該死了不少...
萬分感謝

TOP

本帖最後由 Hsieh 於 2012-8-6 18:48 編輯

回復 17# 假面超人
是要照Sheet1的排序嗎?
  1. Sub nn()
  2. Dim Ar(), A As Range, B As Range
  3. With Sheets("Sheet1")
  4. For Each A In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))  第一頁A2以下做迴圈
  5.   For Each Sh In Sheets(Array("Sheet2", "Sheet3")) '原資料所在工作表
  6.   With Sh
  7.      For Each B In .Range(.[A2], .Cells(.Rows.Count, 1).End(xlUp))  '在A2以下儲存格做迴圈
  8.         If B = A Then  '跟第一頁A欄儲存格做比對,如果符合
  9.            ReDim Preserve Ar(s)  '擴大陣列
  10.            Ar(s) = Array(B.Value, B.Offset(, 1).Value, B.Offset(, 2).Value, B.Offset(, 4).Value)  '將值寫入陣列
  11.            s = s + 1  '準備下一次擴大陣列
  12.         End If
  13.      Next
  14.   End With
  15.   Next
  16.   With Sheets("最終結果")
  17.      If s > 0 Then .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(s, 4).Value = Application.Transpose(Application.Transpose(Ar))  '如果陣列有寫入,就將陣列寫入結果
  18.      Erase Ar: s = 0  '清空陣列,並準備下一個陣列初始大小
  19.   End With
  20. Next
  21. End With
  22. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 16# GBKEE
看了#17樓的範例,霍然大悟。因為範例中沒有空白表單之故。

TOP

回復 16# GBKEE
請教:
        Sheets(a).Range("A1").CurrentRegion.AdvancedFilter xlFilterCopy, Rng(1), Rng(2).Cells(1).Resize(1, Rng(1).Columns.Count)
是不是要修改成:
        Sheets(2).Range("A1").CurrentRegion.AdvancedFilter xlFilterCopy, Rng(1), Rng(2).Cells(1).Resize(1, Rng(1).Columns.Count)
否則下一個工作表單如為空白,則會有錯誤訊息。

TOP

回復 16# GBKEE


GBKEE版大一直麻煩你真的不好意思
針對您寫的那程式做了測試大致上沒問題
但有點小問題
搜尋到最後的排序會依照先在哪個分頁找到的寫入到最後會亂掉,是否可以能讓資料順序和工作頁1一樣?謝謝
多筆資料判斷(G大).rar (16.05 KB)

TOP

        靜思自在 : 道德是提昇自我的明燈,不該是呵斥別人的鞭子。
返回列表 上一主題