対象のセルを比較し同じものを同じ行にしたい
お世話になります。
内容は表題の通りなのですが具体的に言うと
1 1
2 4
3 3
4 9
5 8
6 2
7 3
8 5
9 7
このようになっているデータを
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
このようにしたいと思っております。
データが数万件ありますが、比較対象列の件数が一致しているわけではありません。
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
VBAのタグはついていませんでしたが、たぶんVBAじゃないとできそうもないので書いてみました。
データがあるシートのマクロに登録して実行してください。
VBA
1Sub sample() 2 3 Dim fs As Worksheet ' 処理対象のシート 4 Dim ts As Worksheet ' 一時的にコピーするシート 5 Dim MaxRow As Long ' 行数 6 Dim MaxCol As Long ' 列数 7 Dim fr As Long ' 処理対象シートの行カウンタ 8 Dim tr As Long ' 一時シートの行カウンタ 9 Dim er As Long ' 例外データの行カウンタ 10 11 ' アクティブシート(処理対象シート)を一時シートに複製する 12 Set fs = ActiveSheet 13 fs.Copy before:=ThisWorkbook.Worksheets(1) 14 Set ts = Worksheets(1) 15 16 ' 行数列数取得 17 MaxRow = Range("A1").End(xlDown).Row 18 MaxCol = Range("A1").End(xlToRight).Column 19 20 ' 例外カウンタを行数の次の行にセット 21 er = MaxRow + 1 22 23 ' 処理対象シートをクリア 24 fs.Range(fs.Cells(1, 2), fs.Cells(MaxRow, MaxCol)).Clear 25 26 ' 一時シートのデータ数分ループ 27 For tr = 1 To MaxRow 28 29 ' B列のデータがA列に存在するかチェック 30 For fr = 1 To MaxRow 31 If ts.Cells(tr, 2).Value = fs.Cells(fr, 1).Value Then 32 ' 存在したらその位置にコピー 33 ts.Range(ts.Cells(tr, 2), ts.Cells(tr, MaxCol)).Copy fs.Range(fs.Cells(fr, 2), fs.Cells(fr, MaxCol)) 34 Exit For 35 End If 36 Next 37 If fr > MaxRow Then 38 ' 存在しなかったら例外として枠外にコピー 39 ts.Range(ts.Cells(tr, 2), ts.Cells(tr, MaxCol)).Copy fs.Range(fs.Cells(er, 2), fs.Cells(er, MaxCol)) 40 er = er + 1 41 End If 42 Next 43 44 ' 一時シートを削除 45 Application.DisplayAlerts = False 46 ts.Delete 47 Application.DisplayAlerts = True 48 49End Sub
投稿2016/10/05 06:54
総合スコア16998
0
ベストアンサー
Excel上でなんとかするのであれば、VLOOKUP関数を使って対応する値を別の列に抽出し、その値をコピーしてはどうでしょうか。
//A1の値をB:Bの範囲から検索、対象範囲の1列目を取得。FLASEは完全一致で検索することを指定 =VLOOKUP(A1,B:B,1,FALSE)
しかし、完全一致でのVLOOKUP関数は万単位の件数になると処理に非常に時間がかかってしまう問題があります。
そこでランダムで並んでいるデータを予めソートした上で、下記のように検索の早い近似値検索を行ってください。
//近似値検索でVLOOKUPを行い、結果が目当ての値だった場合のみ値を取得する =IF(A1=VLOOKUP(A1,B:B,1,TRUE),VLOOKUP(A1,B:B,1,TRUE),"")
この方法なら完全一致で数万件を検索するよりも、かなり高速に処理できるようです。
ただ、これだけの件数になるとExcelで扱うのではなく、データベースの導入を検討されたほうが良いように思います。
投稿2016/10/05 03:23
総合スコア408
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
不明な点がいくつかあり、現時点ではアドバイスが難しいです。
不明点①
例では処理前のB列に6が存在しないのに処理結果ではB列にも6が埋められています。
これは記載誤りでしょうか?
不明点②
例では全てマッチする場合の例しかありませんが、アンマッチの可能性(A列にない値がB列に出現する)は考慮不要でしょうか?
不明点③
例では処理前のB列に3が2回出現していますが、処理結果では3は1行しか存在しません。
これはそういう仕様(複数回出現しても1行のみ出力)ということでよろしいですか?
また、実際にはB列だけではなく、C列以降も一緒に並べ替えたいのではないかと推測しますが、
1 1 a
2 4 b
3 3 c
4 9 d
5 8 e
6 2 f
7 3 g
8 5 h
9 7 i
というデータであればどう並べ替えたいでしょうか?
(※B列のみの並べ替えでよい場合、これは無視していただいて結構です)
補足をうけて追記
A列にない値がB列にあった場合のアンマッチな値をどうするかによって変わってくると思います。
①アンマッチな値を無視してもよい場合
⇒(A列に紐付くB列を検索)
例:
A B C =========== 1 1 a 2 4 b 3 3 c 4 9 d 5 8 e 6 2 f 8 5 h 9 7 i ===========
検索値:A列の値
検索範囲:B列全体
取得値:B列・C列
という元データがあった場合、
D列:=IF(ISNA(MATCH($A1,$B:$B,0)),"",INDEX($B:$C,MATCH($A1,$B:$B,0),1)) E列:=IF(ISNA(MATCH($A1,$B:$B,0)),"",INDEX($B:$C,MATCH($A1,$B:$B,0),2))
とすることでA列に紐付くB列・C列が取得できます。
結果:
A B C D E ============= 1 1 a 1 a 2 4 b 2 f 3 3 c 3 c 4 9 d 4 b 5 8 e 5 h 6 2 f 6 8 5 h 8 e 9 7 i 9 d ===========
②アンマッチの値も残したい場合
⇒(B列に紐付くA列を検索)
例:
検索値:B列の値
検索範囲:A列全体
取得値:A列、A列がない場合はB列の値(ソート順)
データは①の例と同じとして、
D列:=IF(ISNA(MATCH($B1,$A:$A,0)),"",INDEX($A:$A,MATCH($B1,$A:$A,0),1)) E列:=IF(ISNA(MATCH($B1,$A:$A,0)),$B1,INDEX($A:$A,MATCH($B1,$A:$A,0),1))
とすることでB列に紐付くA列の値とソート順が取得できます。
A B C D E ============= 1 1 a 1 1 2 4 b 4 4 3 3 c 3 3 4 9 d 9 9 5 8 e 8 8 6 2 f 2 2 8 5 h 5 5 9 7 i 7 ===========
これをA~E列を選択してE列でソートすると、
結果:
A B C D E ============= 1 1 a 1 1 6 2 f 2 2 3 3 c 3 3 2 4 b 4 4 8 5 h 5 5 9 7 i 7 5 8 e 8 8 4 9 d 9 9 ===========
となります。
D列・E列・C列を見ると目的の結果となっていると思います。
補足(VLOOKUPの利用について)
長くなってしまいましたが最後にもう一つ。
通常、単一条件でのセル検索にはVLOOKUPを使うことが多いです。
しかしVLOOKUPを使用するためにはいくつかの条件をクリアする必要がありますので注意が必要です。
条件としては
・検索範囲の左端列を検索キーとすること
・検索キーが重複していないこと
・検索キーが昇順でソートされていること
などがあります。
これらの条件を満たしていない場合、範囲内に存在する値が取得できなかったり、意図しない値を取得してしまったりします。
今回提示した方法のうち、②の方法ならVLOOKUPでも実現可能です。
しかし①の方法の場合、昇順でソートされていないB列が検索キーとなるため、VLOOKUPは正常に機能しません。
そのため今回はVLOOKUPより少し複雑ですが、INDEX関数とMATCH関数を利用した方法をご紹介しました。
参考になれば幸いです。
投稿2016/10/05 03:07
編集2016/10/05 08:41総合スコア3013
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/05 04:18
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Excelにて対象データを入れ替えたい
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。