- 締切済み
エクセル重複を横に配置し横列を連動し並び替え
A B C 1 5 □ 2 7 ○ 3 1 △ 4 2 @ 5 6 7 ↓ A B C 1 1 △ 2 2 @ 3 4 5 5 □ 6 7 7 ○ A列に合わせ重複したB列を並び替える。 C列以降はB列に連動して並び替えたいです。 ご解答いただけたら大変助かります。 どうぞ宜しくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- mt2015
- ベストアンサー率49% (258/524)
- imogasi
- ベストアンサー率27% (4737/17070)
#3です。 VBAでやると簡単にならないかと、趣味でやってみました。 コメント(注釈)、見てみてくだされば、何をやるのかわかるでしょう。 VBAと言っても、あくまで我流の1方法です(Findを利用法)が。 全体では、あまり簡単にならなかったという、感想ですが。「見つかった時の処理」の2行がポイントです。 Sub test01() Set sh1 = Worksheets("Sheet1") 'シート1を捉える Set sh2 = Worksheets("Sheet2") 'シート2を捉える lr = sh1.Range("A100000").End(xlUp).Row 'データ最終行を捉える 'MsgBox lr '--各行の処理の繰り返し For i = 2 To lr '--順序数セット sh2.Cells(i, "A") = sh1.Cells(i, "A") '--探す数は x = sh1.Cells(i, "A") '--その数をシート1のB列で探す Set r1 = sh1.Range("B1:B100000").Find(x) If r1 Is Nothing Then '--見つからない時は、何もせず次行処理へ Else '--見つかった時の処理 ' MsgBox r1.Row '--見つかった数をシート2のB列にセット sh2.Cells(i, "B") = sh1.Cells(r1.Row, "B") '--その右隣C列の記号をシート2にセット sh2.Cells(i, "C") = sh1.Cells(r1.Row, "C") End If '--- Next i End Sub ’--- Sheet2の結果 1 1 △ 2 2 @ 3 4 5 5 □ 6 7 7 ○ 「並べ替える」というよりも、該当のものを見つけて、しかるべき、セルに代入する、という考えです。 ーー こういうロジック(考え方)が、どちらがよいか、経験を積んで、見極めるのが、データ処理の肝心な点だと思います。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【参考までに】 これって、一種の左外部結合ってやつだから、SQL文で書けば次のようになります。 SELECT A.F1, BC.F1, BC.F2 FROM [Sheet7$A1:A10] AS A LEFT JOIN [Sheet7$B1:C10] AS BC ON A.F1 = BC.F1 で、実際にイミディエイトウインドウで上記SQL文を実行すれば、以下のような結論を得ます。 [イミディエイトウインドウ] ?DSelect("SELECT A.F1, BC.F1, BC.F2 FROM [Sheet7$A1:A10] AS A LEFT JOIN [Sheet7$B1:C10] AS BC ON A.F1 = BC.F1;",,Chr(13),,False) 1;1;△ 2;2;@ 3;; 4;; 5;5;□ 6;; 7;7;〇 まあ、式が簡単なのか?それとも、SQL文が簡単なのかは、見解の分かれるところですが・・・。一応、目的を達成する方法は、色々あるってことです。 参考までに・・・
- imogasi
- ベストアンサー率27% (4737/17070)
何処に結果を出すかが、質問に書いてない。 E,F,G列に出すとして E2は =A2 下方向に式を複写する。 F2は =INDEX(B$2:B$7,MATCH(A2,B$2:B$7,0),1) と、入れて、その式を下方向に式を複写する。 G2は =INDEX(C$2:C$7,MATCH(A2,B$2:B$7,0),1) と、入れて、その式を下方向に式を複写する。 ーー 結果 E2:G8 1 1 △ 2 2 @ 3 #N/A #N/A 4 #N/A #N/A 5 5 □ 6 #N/A #N/A 7 7 ○ となる。このエラーはjy間なので、 式の先頭に、エラーチェック式を加えて、F2では =IF(ISNA(MATCH(A2,B$2:B$7,0)),"",INDEX(B$2:B$7,MATCH(A2,B$2:B$7,0),1)) G2では =IF(ISNA(MATCH(A2,B$2:B$7,0)),"",INDEX(C$2:C$7,MATCH(A2,B$2:B$7,0),1)) のようにすればよい。 結果 F,G列は 1 △ 2 @ 5 □ 7 ○
- msMike
- ベストアンサー率20% (368/1813)
- HohoPapa
- ベストアンサー率65% (455/693)
期待の並び替えを行った結果を、 同じシートのD,E,F列に出力してよければ D1=A1 E1=IF(ISNA(MATCH(A1,B:B,0)),"",A1) F1=IFNA(INDEX(C:C,MATCH(E1,B:B,0)),"") 別シートのA,B,C列に出力したい場合は A1=Sheet1!A1 B1=IF(ISNA(MATCH(Sheet1!A1,Sheet1!B:B,0)),"",Sheet1!A1) C1=IFNA(INDEX(Sheet1!C:C,MATCH(Sheet1!E1,Sheet1!B:B,0)),"") とし、必要数下方向に複写する関数はいかがでしょうか?