標題:
[發問]
想請教VBA高手兩SHEETS比較後找出特定之儲存格再貼入特定位置中
[打印本頁]
作者:
YUPOYU
時間:
2012-3-31 23:22
標題:
想請教VBA高手兩SHEETS比較後找出特定之儲存格再貼入特定位置中
本帖最後由 YUPOYU 於 2012-4-2 12:14 編輯
SHEET1如下
A B C D E F G H I J K
1 a1 1 1 3 4 101 102 7 8 9 10
2 a2 11 12 13 14 15 16 17 18 19 20
3 a3 21 22 23 24 5 26 27 28 29 30
4 a4 31 32 33 34 35 36 37 38 39 40
5 a5 41 42 4 44 45 46 47 48 49 50
6 a6 51 52 53 54 55 56 57 58 59 60
7 a7 61 62 63 64 6 66 67 68 69 70
8 a8 71 72 73 74 75 76 77 78 79 80
9 a9 81 82 83 84 85 86 87 88 89 90
10 a10 1 92 93 94 95 96 97 98 99 100
SHEET2如下
A B C D E F G H I J
1 1 2 3 4 5 6 7 8 9 10
1.請問一下VBA之高手們可否教教小女子如何用VBA程式,以SHEEET2之A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 儲存格的各別值為個別依據去各別
比對SHEEET1之B1:K10儲存格的每一個值(實際範圍情況為B2:V4000,若用人工或函數比對可能不是比對死就是檔案很大跑不太動,救命阿!),
若有相同值,才傳回相對應之SHEEET1 A欄之值(若沒有則略過,繼續比對下一個儲存格)
至 SHEET2之A2 A3 A4.........依序排下去,SHEET2想要的結果如下:
A B C D E F G H I J
1 1 2 3 4 5 6 7 8 9 10
2 a1
3 a10
4 a1
5 a1
6 a1
7 a5
8 a1
9. a3
10 a7
11 a1
依篩選結果繼續往下排列......
2.且也想問SHEET2之A2 A3 A4.........內的值不知可否再自動由小到大排序
請VBA之高手們幫幫忙,救救小女子我呀!
感激不盡喔!
yupopo 留
[attach]10262[/attach][attach]10262[/attach]
上面為附件檔案,請各位vba高手大大們幫忙看一下
(真不好意思,沒把版面排好,造成大大們的困擾!請見諒)
yupopo 留
作者:
Hsieh
時間:
2012-4-1 11:52
回復
1#
YUPOYU
不是很懂你的意思,先試試看
Sub ex()
Set d = CreateObject("Scripting.Dictionary")
With Sheet1
For j = 2 To .[IV1].End(xlToLeft).Column
For i = 1 To .[A65536].End(xlUp).Row
If d(.Cells(i, j).Value) = "" Then
d(.Cells(i, j).Value) = .Cells(i, 1)
Else
d(.Cells(i, j).Value) = d(.Cells(i, j).Value) & "," & .Cells(i, 1)
End If
Next
Next
End With
With Sheet2
For Each a In .Range(.[A1], .[IV1].End(xlToLeft))
If d(a.Value) <> "" Then
ar = Split(d(a.Value), ",")
With a.Offset(1).Resize(UBound(ar) + 1, 1)
.Value = Application.Transpose(ar)
.Sort key1:=.Cells(1), Header:=xlYes
End With
End If
Next
End With
End Sub
複製代碼
作者:
YUPOYU
時間:
2012-4-2 12:27
回復
2#
Hsieh
感謝版主熱心為我解答,我有把代碼試試看,結果是對的,但排列方式好像沒有符合我想要的版面,
我想是我陳述的不夠清楚明瞭,真的很抱歉,
我想表達的自動核對過程,得到結果及顯示結果的方式
我再仔細想想應該如下所述
1.自動核對過程,得到結果
自動先選取SHEET2的A1,得知其值為1
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為1,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,得到值 a1及 a10
比對 C1:C10後,得到值 a1
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的B1,得知其值為2
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為2,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的C1,得知其值為3
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為3,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,得到值 a1
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的D1,得知其值為4
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為4,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,得到值 a1
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的E1,得知其值為5
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為5,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,得到值 a3
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的F1,得知其值為6
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為6,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,得到值 a7
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的G1,得知其值為7
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為7,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,得到值 a1
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的H1,得知其值為8
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為8,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,得到值 a1
比對 J1:J10後,無值顯現
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的I1,得知其值為9
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為9,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,得到值 a1
比對 K1:K10後,無值顯現
接著再自動先選取SHEET2的J1,得知其值為10
然後去依序自動比對SHEET1 之B1:B10, C1:C10, D1:D10, E1:E10, F1:F10, G1:G10, H1:H10, I1:I10, J1:J10, K1:K10
若符合值為10,則抓出相對應A欄列位之值
結果應如下
比對 B1:B10後,無值顯現
比對 C1:C10後,無值顯現
比對 D1:D10後,無值顯現
比對 E1:E10後,無值顯現
比對 F1:F10後,無值顯現
比對 G1:G10後,無值顯現
比對 H1:H10後,無值顯現
比對 I1:I10後,無值顯現
比對 J1:J10後,無值顯現
比對 K1:K10後,得到值 a1
2.顯示結果的方式
依上述依序得到的12個結果值再依序存入SHEET2 A2 A3 A4........之儲存格中(因為A1列中已有數值,所以A2為啟始點)
結果如下
SHEET2
A2儲存格值應自動存為a1
A3儲存格值應自動存為a10
A4儲存格值應自動存為a1
A5儲存格值應自動存為a1
A6儲存格值應自動存為a1
A7儲存格值應自動存為a3
A8儲存格值應自動存為a7
A9儲存格值應自動存為a1
A10儲存格值應自動存為a1
A11儲存格值應自動存為a1
A12儲存格值應自動存為a1
以上冗長的陳述希望能讓vba高手版主或有心為小女子解答之vba高手們了解
感激不盡
ps.原始版面編排為已上傳之上面附件book1
yupopo留
作者:
GBKEE
時間:
2012-4-2 13:24
回復
3#
YUPOYU
請傳上比對後檔案看看
作者:
Hsieh
時間:
2012-4-2 14:51
回復
3#
YUPOYU
Sub ex()
Set d = CreateObject("Scripting.Dictionary")
With Sheet1
For j = 2 To .[IV1].End(xlToLeft).Column
For i = 1 To .[A65536].End(xlUp).Row
If d(.Cells(i, j).Value) = "" Then
d(.Cells(i, j).Value) = .Cells(i, 1)
Else
d(.Cells(i, j).Value) = d(.Cells(i, j).Value) & "," & .Cells(i, 1)
End If
Next
Next
ay = Split(Join(d.items, ","), ",")
End With
With Sheet2
For Each a In .Range(.[A1], .[IV1].End(xlToLeft))
If d(a.Value) <> "" Then
If mystr = "" Then
mystr = d(a.Value)
Else
mystr = mystr & "," & d(a.Value)
End If
End If
Next
ar = Split(mystr, ",")
.[A2].Resize(UBound(ar) + 1, 1) = Application.Transpose(ar)
End With
End Sub
複製代碼
作者:
register313
時間:
2012-4-2 15:02
回復
3#
YUPOYU
Sub aa()
Sheets("Sheet2").[A2:A65536] = ""
For R = 1 To Sheets("Sheet1").[A1].End(xlDown).Row
For C = 1 To Sheets("Sheet2").[A1].End(xlToRight).Column
If Sheets("Sheet2").Cells(1, C) = Sheets("Sheet1").Cells(R, C + 1) Then
Sheets("Sheet2").[A65536].End(xlUp).Offset(1, 0) = Sheets("Sheet1").Cells(R, 1)
End If
Next C
Next R
End Sub
複製代碼
作者:
YUPOYU
時間:
2012-4-3 10:50
回復
5#
Hsieh
首先感謝HSIEH版主為小女子解出正確的解答,真的感激不盡
我雖然看不太懂其中的深奧程式碼意思(我只懂簡單的回圈程式),
但我會努力找書研究看看,我的8萬多筆的比對資料終於露出一線
署光,有救了,感覺不是孤兒的感覺真是太棒了!我一定要贊助這佛
心來的網站
另外也感謝GBKEE及REGISTER313兩位的撥空關心
ps. 如小女子屆時8萬多筆的比對資料,還是無法測試成功還望
各位VBA大俠出手再相救囉!:P
謝謝大家
yupopo留
作者:
YUPOYU
時間:
2012-4-3 21:20
回復
5#
Hsieh
DEAR HSIEH版主:
承蒙你的解答,小女子雖然很想靠自己的力量,弄懂版主寫的
程式,再應用在自己所需的範例中,但實在是和 HSIEH板主的實力懸殊差太多
雖然我有想辦法套用,但小女子應實際比對的8萬多筆的資料,還是無法測試成功,
希望好心的HSIEH板主再為快抓破頭的小女子看一下實際的問題再哪裡嗎?
不好意思,不曉得是否也可請HSIEH板主在每一行程式後面稍微註解一下
讓小女子我有機會來學習高手的設計思考模式
如願伸手援助,小女子感激不盡
[attach]10291[/attach]
PS.附件為實際的所遇到的case(book4.xls),
book4.xls!工具日期資料庫 就好像之前的 book1.xls!sheet1
book4.xls!檔期搜尋 就好像之前的 book1.xls!sheet2
book4.xls!工具日期資料庫 G5:G4000黃色儲存格 就好像之前的 book1.xls!sheet1 A1:A11
book4.xls!工具日期資料庫 B5:AE4000淡橘色儲存格區域 就好像之前的 book1.xls!sheet1 B1:K11
book4.xls!檔期搜尋A2:U2 就好像之前的 book1.xls!sheet2 A1:J1 只是儲存格的值為日期
想要顯示的結果就像之前比對後的排列方式
由book4.xls!檔期搜尋的A3.A4.A5........依序排列 就好像之前的 book1.xls!sheet2 A2.A3.A4........依序排列
程式套用在 book4.xls VBS的This Workbook 中,但一執行就出現錯誤訊息
真傷腦筋,HELP HELP.........!
作者:
Hsieh
時間:
2012-4-3 22:31
回復
8#
YUPOYU
不是模組位置的關係,是你的欄位起始位置不同
Sub ex()
Set d = CreateObject("Scripting.Dictionary")
With Sheet1
For j = 8 To .[IV5].End(xlToLeft).Column
For i = 5 To .[G65536].End(xlUp).Row
If d(.Cells(i, j).Value) = "" Then
d(.Cells(i, j).Value) = .Cells(i, 7)
Else
d(.Cells(i, j).Value) = d(.Cells(i, j).Value) & "," & .Cells(i, 7)
End If
Next
Next
ay = Split(Join(d.items, ","), ",")
End With
With Sheet2
For Each a In .Range(.[A2], .[IV2].End(xlToLeft))
If d(a.Value) <> "" Then
If mystr = "" Then
mystr = d(a.Value)
Else
mystr = mystr & "," & d(a.Value)
End If
End If
Next
ar = Split(mystr, ",")
.[A3].Resize(UBound(ar) + 1, 1) = Application.Transpose(ar)
End With
End Sub
複製代碼
作者:
YUPOYU
時間:
2012-4-6 09:39
回復
9#
Hsieh
感謝超版
我的問題已經解決
非常謝謝超版的耐心幫忙
小女子感激不盡:loveliness:
YUPOPO留
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)