- ベストアンサー
【Excel】関数か機能で
Excelの機能か関数で、複数列にあるデータの、重複するものを1つずつ1列に表示できたりしないでしょうか? ピボット等試みたのですが・・・あれは縦一列でないとできないのですよね。 イメージとしては・・・下記のA、C、Eの列データを別シートに1列に・・・といった感じです。 重複するものは一度しか表示させずという形がいいのですが・・・ 編集前 A B C D E 1 あ ○ い ○ う 2 え ○ お ○ あ 3 い ○ う ○ き 4 お ○ あ ○ い ・ ・ 編集後 A B C D E 1 あ 2 い 3 う 4 え 5 お 6 き ・ ・ 時々部分的に書き換えるデータなので、できれば関数等で何かあればと思い、質問させていただきます。 関数に疎くお恥ずかしいのですが、何か良い方法をご存知のかたはご教示よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まったく同じ質問はないかも知れませんが、似たような質問は過去にもたくさんあるはずですよ。 同じ作業を何度もやるのか一度だけなのかでも変わってきますが、とりあえず操作だけで行う方法。 (多分、ご存知の方法を組み合わせただけです) ご質問のように3つの列を1列に入れるという概念自体には無理があります(3列分のデータ数>1列分のデータ数)が、実際に使用しているデータ範囲が充分に小さいと仮定して上限を設けさせていただきます。 1)別シートのA1に =if(元シート!A1="","",元シート!A1) を入力し充分下まで(例えば1000まで)オートフィル (これでA列がコピーされる) 2)A1001に =if(元シート!C1="","",元シート!C1) を入れて同様に。さらにE列も同様。 (一応、別シートのA列にデータがコピーされる。) ここまでが準備作業です。2回目以降は3)以下の作業だけを行えば良くなります。 3)別シートをコピーしてその時の結果用のシートを作成する。 3)結果用シートのA列を選択し、コピー。そのまま形式を選択して、値のみをペースト。 4)A列でオートフィルタを設定し、空白以外のセルを選択。 5)フィルターオプションの設定で「重複するレコードは無視する」にチェック (以上でA列に目的の物が連続して表示されます。) 中間行が非表示になっているだけなので、これを詰めたければそのままコピーして、新しいシートにペーストすればよいでしょう。 マクロを作っておけば一発ですが、それほどの手間とも思えないですし、使用方法がわかるか不明ですので・・・
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
こういう表の組み換えは、VBAに限る。VBAを勉強のこと。 関数でやると複雑だったり、極端に難しい場合が多い。 標準モジュールに Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") d = sh1.Range("A65536").End(xlUp).Row 'データ最下行取得 MsgBox d k = 2 'Sheet2の最初行(k=1は不可) For i = 1 To d For j = 1 To 5 Step 2 'E列まで1列おきにデータがある x = sh1.Cells(i, j) 'xについて、重複を調べる y = Application.WorksheetFunction.CountIf(Range(sh2.Cells(1, "A"), sh2.Cells(k - 1, "A")), x) If y > 0 Then '同じものがあるのでセットせず Else sh2.Cells(k, "A") = sh1.Cells(i, j) '同じものが無いのでSheet2にセット k = k + 1 '1行下を指す End If Next j Next i End Sub 例データ Sheet1に質問のデータ 結果 Sheet2のA列 あ い う え お き
- ASIMOV
- ベストアンサー率41% (982/2351)
Sub itiretu() retu = Selection.Column Range(Selection, Selection.End(xlDown)).Select Selection.Copy Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste Cells(1, retu).Select End Sub これは、C列をA列の末尾にコピーする作業を「マクロの記録」でマクロ化したものちょっと改造したものです データーの入ったシートを丸ごと別シートにコピーして、このマクロを標準モジュールに入れてください ついでに、マクロ、オプションでショートカットキーを設定しておきます 最初にC列の最初の行(セル)を選択し、このマクロを実行するとA列の下にコピーされます あとは、次の列(E列~)に移動し同じようにマクロを実行します これで、1列のデーターが出来ますので、ソートして、重複行を削除します 重複行については、条件付き書式や =if(a1=a2,"重複","") といった関数とか、いろいろ有りますのでお好きな方法でどうぞ
- mt2008
- ベストアンサー率52% (885/1701)
ピボットは複数の範囲を指定できますよ。 編集前のリストはSheet1にあるものとします。 1.Sheet2のA1セルを選択。 2.ピボットテーブル/ピボットグラフ ウィザード1/3を起動 3.「分析するデータのある場所を選択してください」 →複数のワークシート範囲 を選択 「作成するレポートの種類…」 →ピボットテーブル を選択 <次へ>をクリック 4.自動を選択して<次へ>をクリック 5.ピボットテーブル/ピボットグラフ ウィザード2b/3 が開きます。 「範囲」に、Sheet1!$A:$B を指定して<追加>。 同様にSheet1!$C:$D、Sheet1!$E:$F も追加して<完了> #範囲には2列以上必要ですので、不要な隣の列まで指定してしまうのが #ポイントです。 Sheet2 のA5以下が求める情報になると思います。 リストを見せずにこの情報だけ使用したいのでしたら。 Sheet3に以下のセル式を… A1:=IF(OR(Sheet2!A5="",Sheet2!A5="(空白)",Sheet2!A5="総計"),"",Sheet2!A5) A2:=IF(OR(Sheet2!A6="",Sheet2!A6="(空白)",Sheet2!A6="総計"),"",Sheet2!A6) : #A1をドラッグすればOKです。 後はSheet2を非表示にでもしてください。 なお、操作はExcel2003を基準に書いています。
お礼
ありがとうございました。 質問した段階で、作りたいシステムのイメージがまとまっておらず、結局関数で解決しました。 ピボットの上記使い方は知らなかったので、知識になりました。 ありがとうございました。
- ASIMOV
- ベストアンサー率41% (982/2351)
1.B、C列は無視して良いのでしょうか 2.編集前の「行」は最大何行でしょうか 3.列によって行数に違いはあるのでしょうか
補足
1.B、Cは無視してしまって結構です。ただデータ上、列の削除・入れ替えはできません。 2.行は・・・現在200行程度ですが、今後若干の増減が考えられます。 3.列によって行数の違いはありません。1行で一件のデータですので。 これまで、A,C,Eを全部一列に張り替えて(リンク貼り付けで。)ピボットで表示・・・などやっていたのですが、他にもっと見栄えのいい、効率的なやり方があるのではないかといろいろ試しております^^;恥 もしわかりましたら、よろしくお願い致します。
お礼
ありがとうございました。 結局システム全体の都合から、ピボット関数を組み合わせてだいたい出来上がってきました。 マクロは使ったことがなかったので、これを気に勉強してみようと思います。