エクセルのあるシートの内容を条件毎に行単位で複数のシートに振り分ける方法は?

このQ&Aのポイント
  • エクセルのあるシートにある元データのA列を参照して同じものだけを行単位で抜き出し、別にある50個のシートに振り分けたいです。
  • 手作業でコピーする以外に、別の方法で振り分ける方法はありますか?
  • 元データが毎月更新されるため、行数や内容が変わることに対応する必要があります。関数や高度な技術を使う必要があるのでしょうか?
回答を見る
  • ベストアンサー

エクセルのあるシートの内容を条件毎に行単位で複数のシートに振り分けるには?

エクセルのあるシートにある元データのA列を参照して同じものだけを行単位で抜き出し、別にある50個のシートに振り分けたいのですが、手作業でコピーする以外に何か良い方法はないかと思い、質問させていただきました。 下の例で行くと行1と2は列Aが同じ「たろう」なので、同じシート2へ、行3と4は「はなこ」なので、同じシート3へといった具合です。 元データ(シート1、毎月更新)   A   B C D E 1たろう  1 2 3 4→シート2へ  2たろう  4 5 6 3→シート2へ 3はなこ  7 8 9 2→シート3へ  4はなこ  1 2 2 1→シート3へ 5じろー  3 4 4 3→シート4へ 6さぶろー 5 4 3 1→シート5へ シート2:たろうのデータ2行のみ表示 シート3:はなこのデータ1行のみ表示 シート4:じろーのデータ1行のみ表示 シート5:さぶろーのデータ1行のみ表示 問題は、元データは別のソフトからエクスポートされたもので、毎月更新するたびに行数が増えたり減ったりして内容が変わってしまうところです。例えばたろうが今月は2行あったけど、来月は1行になってしまうといった具合です。各シートも元データの更新内容に従って、毎月更新する必要があります。 関数は使ったことがありますが、これは関数で実現できるのでしょうか?何となく出来ないような気がしています。やはり高度な技が必要なのでしょうか。その場合は私には難しいかもしれませんが、とにかく何かお知恵をいただきたくよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.9

一応スクリプトの方も見直していますが、確認させてください。 1)集計ページのA1セルに集計したい人物の名前は入っていますか? 2)「たろうが3行目-4行目に減り」のところで、データを削除するのに、行削除などしていませんか? こちらで、不具合が再現できれば対策を講じることができると思うのですが、もう少し詳しく教えていただいてもよろしいですか?

daigorooo
質問者

お礼

すみません!私が間違っていました。各ページのA1セルに名前を入れなければいけないのですね。基本ができていませんでした。今やってみたらばっちりうまく行きました。感動です。こんな風にできるのですね。使わせていただきます。最後まで教えていただいて本当にありがとうございました。

その他の回答 (8)

  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.8

すみません、スクリプトの方の記述ミスです。 Sub RenewAutoFilter() Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.Select If ws.Cells(1, 1) <> "" Then Selection.AutoFilter Field:=1, Criteria1:=ws.Cells(1, 1) End If Next ws End Sub お手数ですが、差し替えてください。

daigorooo
質問者

お礼

差し替えてみたのですが、結果は変わりませんでした。。。

  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.7

あと、マクロが気に食わない!という場合は、VisualBasicEditorを再び実行し、ペーストしたマクロを消去すれば、マクロはなくなります。

daigorooo
質問者

お礼

何度もご丁寧にありがとうございます。奮闘中ですがうまくいきません。原版のデータを更新した後、Alt+F8で実行すると、各々のシートには更新前からソートで表示されていた場所のデータがそのまま表示されるようなのです。 例えばたろうのデータは始め3行目-5行目にあり、たろうのシートにはそれが表示されていますが、原版が更新されて、たろうが3行目-4行目に減り、次のじろーが5行目からになっても、たろうのシートにはそのまま5行目のじろーのデータまで表示されてしまうようです。マクロ初心者なので、やり方がまずいのかもしれません。

  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.6

#5の補足です。 1.コードをペーストしたら、VisualBasicEditorは終了してください。Excelに戻ったら、保存をします。これでコードがワークシートに保存されます。(念のため別名保存しておくといいかもです) 2.以後は、起動のたびにマクロがウィルスの可能性があるよなどと聞かれるかもしれませんので、「マクロを有効にする」を選びます。これは、私のマクロがウィルスだったらどうするんだ?というExcelのありがたいお世話なので、気にしなくていいです。 3.原版を更新したら、Alt+F8で、Sheetx.RenewAutoFilter(私の組んだマクロの名前)を実行すれば自動的に全ページのオートフィルタをかけなおしてくれます。 シートのA1セルに文字列が入力されているとフィルタがかかってしまうので、空白にしてください。(行挿入などして) あやまって、フィルタしてしまった場合は、あわてずさわがず、データ>フィルタ>レオートフィルタをクリックし、オートフィルタを解除すれば全表示に戻ります。

  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.5

#4の件ですがすみません。フィルタが自動的に更新してくれると思ったのですが、どうもできないみたいですね。 お詫びといってはなんですが、汎用的なマクロを組んでみました。 Sub RenewAutoFilter() For Each ws In ActiveWorkbook.Worksheets ws.Select If Cells(1, 1) <> "" Then Selection.AutoFilter Field:=1, Criteria1:=Cells(1, 1) End If Next ws End Sub これを ツール>マクロ>Visual Basic Editor とし、 左の方にSheetがならんでいるところをどのシートでもいいのでダブルクリックしてみてください。 コードが入力できるようになりますので、上のマクロをペーストしてください。 以後、ツール>マクロ>マクロ(Alt+F8でも可能)で、Sheet1.RenewAutoFilterを実行すればマクロがスタートします。 使い方ですが、各ページ1行目を項目行としてあけておきます。(原版も) マクロは各ページA1セルを参照してそこが空白なら何もせず通過、そこが空白でなければそのA1セルの文字列をキーワードにオートフィルタをかけます。 不明な点があればいってください。

  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.4

#2です。 (1)原版とそっくりそのまま表示ということは最初にたろう、じろう、、、各々のシートの該当セルに原版シートを参照するように計算式をいれておくということでしょうか? ええ、そっくり参照します。フィルタによって非表示にはなっていますが、各シートにすべてのデータ(たろうもじろうもはなこも)が格納されている状態になります。 (2)各々のシートにつけたフィルタは、毎月原版が更新される度に「▼」ボタンを押し直す必要があるようなのですが、合っていますでしょうか? 更新作業がどのようなものかわかりませんが、コピーペーストするくらいの更新作業であれば、フィルタの状況も保存されていますので、押しなおしの必要はありません。ただ新しいフィルタ(しろうとか、ごろうとか)ができると、その都度、ページをコピーしてフィルタをかけるという作業はでてしまいます。

daigorooo
質問者

お礼

お返事ありがとうございます。最初のメンバー以外に増える可能性はありませんが、例えば次月に、たろうが2行から3行になったり、はなこが3行から1行になったりはします。 その場合、たろうのシートに行くと、新たに追加された1行が表示されておらず、もう一度「▼」ボタンを押しなおして選択しないと最新の状態にならないようなのです。。これは仕方がないのでしょうか。 度々恐縮ですがよろしくお願いいたします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

自称imogasi方式でできます。OKWAVEでimogasi方式で照会してもらえれば、私の回答が多数出てきます。 ただし、たろう、はなこ、・・ごとに作業列が要りますが。 ーーー 関数でやる場合は、「振り分ける」と考えてはなりません。受ける側で条件に有ったものを「いただく」「取る」というイメージです。 ーーーー VBAならA列(たろうなどの名前列)でソートし、変わるごとに隣のシートに、書き出しを移れば良い。 Sub test02() d = Range("A65536").End(xlUp).Row k = 2 '各シート最初行 s = 2 mk = Sheets(1).Cells(1, "A") For i = 1 To d If Sheets(1).Cells(i, "A") <> mk Then s = s + 1 k = 2 End If Sheets(s).Cells(k, "A") = Sheets(1).Cells(i, "A") Sheets(s).Cells(k, "B") = Sheets(1).Cells(i, "B") 'AB列で他は略 k = k + 1 mk = Sheets(1).Cells(i, "A") Next i End Sub A列でソートしておいて実行のこと。 シート数は十分多く作っておくこと 基シートタブは最左にあること。 タブの第2番目の左からの順のシートにセットされていく。

daigorooo
質問者

お礼

ありがとうございます。たくさんご回答されているんですね。私のレベルではこれはなかなか難しそうだなということがわかってきました。

  • chem_taro
  • ベストアンサー率32% (33/101)
回答No.2

VBAを使った方法はすでに示されているようなので、私は原始的な方法にて。 まず、原版のシート(Sheet1)、たろうシート、はなこシート、じろーシート、さぶろーシートを用意します。 たろうシートは原版シートとそっくりそのまま表示されるようにします。 このとき、項目ラベルをつけておきます。 名前 ←項目ラベル たろう←以下オリジナルと同じように表示されるように。 たろう じろー ・ ・ ・ データ(D)→フィルタ(F)→オートフィルタ(F)を選びます。 すると、項目ラベルに「▼」ボタンがでますので、押します。すると、リストが出てきますので、「たろう」を選びます。そうすると、たろうのみが表示されます。 同じように、ほかのシートもオートフィルタをかけておけば、原盤を差し替えても、それぞれフィルタが自動的にフィルタの条件に合わないデータを非表示してくれます。

daigorooo
質問者

お礼

ありがとうございます。やってみました。2点確認させていただきたいのですが、 (1)原版とそっくりそのまま表示ということは最初にたろう、じろう、、、各々のシートの該当セルに原版シートを参照するように計算式をいれておくということでしょうか? (2)各々のシートにつけたフィルタは、毎月原版が更新される度に「▼」ボタンを押し直す必要があるようなのですが、合っていますでしょうか? すみません、読解力不足かもしれません。よろしくお願いいたします。

  • ipsum11
  • ベストアンサー率21% (55/251)
回答No.1

VBAを使って。 i = 1 Do Until Worksheets("Sheet1").Cells(i, 1) = "" Select Case Worksheets("Sheet1").Cells(i, 1) Case "たろう" tc = tc + 1 Worksheets("Sheet2").Cells(tc, 1) = Worksheets("Sheet1").Cells(i, 1) Worksheets("Sheet2").Cells(tc, 2) = Worksheets("Sheet1").Cells(i, 2) Worksheets("Sheet2").Cells(tc, 3) = Worksheets("Sheet1").Cells(i, 3) Worksheets("Sheet2").Cells(tc, 4) = Worksheets("Sheet1").Cells(i, 4) Worksheets("Sheet2").Cells(tc, 5) = Worksheets("Sheet1").Cells(i, 5) Case "はなこ" hc = hc + 1 Worksheets("Sheet3").Cells(hc, 1) = Worksheets("Sheet1").Cells(i, 1) Worksheets("Sheet3").Cells(hc, 2) = Worksheets("Sheet1").Cells(i, 2) Worksheets("Sheet3").Cells(hc, 3) = Worksheets("Sheet1").Cells(i, 3) Worksheets("Sheet3").Cells(hc, 4) = Worksheets("Sheet1").Cells(i, 4) Worksheets("Sheet3").Cells(hc, 5) = Worksheets("Sheet1").Cells(i, 5) Case "じろー" jc = jc + 1 Worksheets("Sheet4").Cells(jc, 1) = Worksheets("Sheet1").Cells(i, 1) Worksheets("Sheet4").Cells(jc, 2) = Worksheets("Sheet1").Cells(i, 2) Worksheets("Sheet4").Cells(jc, 3) = Worksheets("Sheet1").Cells(i, 3) Worksheets("Sheet4").Cells(jc, 4) = Worksheets("Sheet1").Cells(i, 4) Worksheets("Sheet4").Cells(jc, 5) = Worksheets("Sheet1").Cells(i, 5) Case "さぶろー" sc = sc + 1 Worksheets("Sheet5").Cells(sc, 1) = Worksheets("Sheet1").Cells(i, 1) Worksheets("Sheet5").Cells(sc, 2) = Worksheets("Sheet1").Cells(i, 2) Worksheets("Sheet5").Cells(sc, 3) = Worksheets("Sheet1").Cells(i, 3) Worksheets("Sheet5").Cells(sc, 4) = Worksheets("Sheet1").Cells(i, 4) Worksheets("Sheet5").Cells(sc, 5) = Worksheets("Sheet1").Cells(i, 5) End Select i = i + 1 Loop こんな感じで。 名前が空白になるまで繰り返します。

daigorooo
質問者

お礼

早速のご回答ありがとうございます。正直VBAは私にはなかなか難しそうです。でもこの方法を使えばきっと思い描いている理想の感じになるのではと思います。なんとか自分でできればいいのですが。せっかく作っていただいたので試してみたいと思います。ありがとうございました。

関連するQ&A

  • EXCELで複数のシートからデータを別シートに出す方法

    EXCELで複数のシートからデータを別シートに出す方法 EXCEL2007でデータが1シートに100行/10列ある物が10シートあります。 この10シートの任意の行にA~Dを付けて、別シート(Aシート~Dシート)に A~Dを付けた行を表示させたいのですが、方法がわかりませんでした。 ご教示お願いします。 また、可能なら別シートに表示させる時、10列ある物を4列にしたいのですが。 よろしくお願いします。

  • エクセル 別れたシートでの条件検索

    別れたシートでの検索で一致したものを探す関数について。 VLOOKUP関数だと列に対してだと思うのですが、行に対して検索したいです。うまく伝えられないので、例えば 【シート1】    A   B   C   1  555 2  666 3  777 4  222 【シート2】    A   B   C   D 1  777    555    222 2 3 上のようなシートがあり、 シート1のA列の番号がシート2の1の行に有ったら、 シート1のB列にOKと表示、無かったらNGと表示、 の様な関数ってありますか? どなたか解る方お願いします。

  • エクセルで複数の条件範囲に合う行全体を別シートへ

    エクセルの関数で複数の条件範囲に合う行全体だけを別シートに抽出したいのですが、 どうしても方法が分かりません。 誰か教えて頂けないでしょうか? 検索は範囲です。 宿泊日○○○○○○○○~○○○○○○○○(例20111110~20240204) 人数 ○人~○人 (○の中に数字が入ります) 西暦日付と人数が両方一致している行を別シートに抽出したいです。 バージョンは2007.2010両方とも問題ないです。 Sheet1    A     BCDEFGHIJKLMN   O 1 宿泊日                 人数 2 20100223               20 3 20110103               5 4 20111118               9 5 20120505               13 6 20121010               7 8 20120224               32 9 20121121               28 Sheet2    A       B    C    D    E   FGHIGKLMN    O 1  検索 2 宿泊日 3        20110101 ~ 20121111 4 人数 5          8    ~   30     人 6 7  結果 8  宿泊日                                  人数 6  20111118                                   9 7  20120505                                  13 Sheet1、A列の宿泊日とO列の人数の範囲が一致するものを、 Sheet2の検索から、行全体ごと抽出(複数)し、Sheet2に反映する関数を教えて頂けないですか? (BCEFGHIJKLMNにもデータは入っていますので行全体が必要です) ちなみにSheet1は常に更新され、入力をする事が出来ませんので、 Sheet1に手を加えることが出来ません。 Sheet2のみでの関数処理できないでモノなのでしょうか? いろいろ検索して探しましたが、複数抽出する方法がわかりませんでした。 よろしくお願いいたします。

  • エクセルで複数の条件範囲に合う行を別シートに抽出

    エクセルの関数で複数の条件範囲に合う行だけをを別シートに抽出したいのですが、 どうしても方法が分かりません。 誰か教えて頂けないでしょうか? 検索は範囲です。 宿泊日○○○○○○○○~○○○○○○○○(例20111110~20240204) 人数 ○人~○人 (○の中に数字が入ります) 西暦日付と人数が両方一致している行を別シートに抽出したいです。 バージョンは2007.2010両方とも問題ないです。 Sheet1    A     BCDEFGHIJKLMN   O 1 宿泊日                 人数 2 20100223               20 3 20110103               5 4 20111118               9 5 20120505               13 6 20121010               7 8 20120224               32 9 20121121               28 Sheet2    A      B    C   D    E   FGHIGKLMN    O 1 検索 2 宿泊日 20110101 ~ 20121111 3 人数     8    ~   30     人 4 5 宿泊日                                  人数 6 20111118                                   9 7 20120505                                  13 Sheet1、A列の宿泊日とO列の人数の範囲が一致するものを、 Sheet2の検索から、行ごと抽出(複数)し、Sheet2に反映する関数を教えて頂けないですか? ちなみにSheet1は常に更新され、入力をする事が出来ませんので、 Sheet1に手を加えることのなく、Sheet2のみに関数を入れて処理出来る関数でお願いします。 いろいろ検索して探しましたが、複数抽出する方法がわかりませんでした。 よろしくお願いいたします。

  • excel 別シートから複数項目を取得

    こんばんは。エクセルについて質問があります。 今、エクセルで同じ構造で中身の違うデータベースの様なシートを数枚作り、 そこから参照して、別の入力シートにそのデータを引っ張って来るということをしたいです。 調べてみた感じVLOOKUP関数などを使うのかなと思うのですが、 どうもうまいこといきません。 DBのような扱いをしているデータシートの構造は 【データシート】 A1(クラス名)列| B1(番号) 列 | C1(名前:漢字) 列 | D1(名前:かな) 列 | ------------------------------------------------------------------- A2   1-1 |  B2 1番 | C2 鈴木 太郎   | D2 すずき たろう   | のようなデータの入れ方をしており、クラスは1-7まである感じで、 B1の列はA1列のクラスの人数分が連番になっています。 なので、番号は重複してる部分が多いです。 これが複数枚シートあるといった具合です。 データを反映させたいシートも前4列は同じ様な構造をしています。 これにあと複数列足した感じになってます。 【反映させたいシート】 A1(クラス名)列| B1(番号) 列 | C1(名前:漢字) 列 | D1(名前:かな) 列 | E1 別項目 |… -------------------------------------------------------------------------------- A2  3-7  |  B2 2 | C2 田中 次郎   | D2 たなか じろう   | ×× |… ここで名前列に名前(漢字、もしくはかな)を入れるか、 もしくはクラス名+番号ですぐさま該当シートの特定し、 合致するE列以前の残りのデータを全て取得してくる。 反映させたシートのE列などに入れたデータを 今度はデータシートへとリンクさせるという風な プログラムを組みたいです。 こういった具合のエクセルシートを作成したいのですが、 どのようにしたら良いでしょうか? プログラムの様にIF文などを使用する感じになるのでしょうか? それともデータのシートに別でIDなどユニークな値を各々の データに割り振らないとダメでしょうか? また参考として知りたいのですが、 1行に引っ張りたくないデータが多数あっても行単位で3列の分だけ取得して、 1行にある3列分のデータを同じ1行3列に反映させることは可能でしょうか? 説明が下手で意味が解り辛い所もあるかもしれませんが、 回答よろしくお願いします。

  • Excelで条件別にシートを振り分ける方法

    初心者です。よろしくお願いします。 Excelで条件別にシートを振り分ける方法を教えてください。 名簿の管理をしています。 シート1にNoや名前を入力し、条件ごとに別シートに行ごと自動で振り分ける方法がありますか? 情報を入力するのは、シート1のみで、 シート2~6を自動で振り分けたクラス名簿という形にしたいです。 現在、以下のようにシート1を作成してます。     列A   列B   列C   行1  No  氏名   クラス  行2  1   花子    A 行3  2   太郎    C 行4  3   二朗    B 行5  4   京子    B 行6  5   史郎    B 行7  6   典子    C 行8  7   公子    A ・ ・ これを、シート2はAクラス、シート3はBクラスという具合に、Noと氏名を振り分けたいです。 よろしくお願いいたします。

  • エクセルで、複数ある同条件の項目を他のシートに全部出したい

    エクセルに関して質問です。 シート1に以下のようなデーターがあるとします。 A    B     C 1   あああ    a 2   いいい    b 3   ううう    a  以下、Cの列にaが表示されているものがランダムに複数あります。 シート2に、C列にaとある行だけを全て表示させる関数はありますか? どなたか教えてください。宜しくお願い致します。

  • エクセル 複数シートのデータを1シートにまとめるマクロ

    エクセルの複数シートにデータがあります。同じ条件の人のデータだけをひとつのシートにまとめたいのですが、マクロを教えていただけますでしょうか。それとも、マクロ以外に良い方法がありますか? エクセル初心者なので、あたりまえのことも知らないかもしれません。。。  【データ】 ●シート1からシート20まで、同じ配列でデータがあります。 ●1行目は見出しです。2行目から1人づつのデータです。(多くても65行までと思っています。) ●A列に到達度、B列に出欠をいれました。 ●C列からM列が氏名、課題、その他のデータです。 ●リストはシート21にあります。  【こんな作業でしょうか?】 ●シート1から20で A列が「C」または「D」ならば その行のA列からM列をコピーして シート21のA列からM列に形式を値にして張り付ける ●シート1から20で B列が「欠」ならば その行のA列からM列をコピーしてシート21のA列からM列に形式を値にして張り付ける (っというのが私の乏しい知識で考えた方法なのですが、これでは不具合がでますか? もちろん、この方法じゃなくもっといいのがあれば、それをやってみたいです。)

  • Excelの関数で複数の行・列範囲を検索する方法

    Excelの関数について質問です。ある値が何行目の何列目にあるかはCtrl+Fを使えばすぐに解りますが、このようなことを関数で実行することはできますか? 例えば、Sheet1のA1からZ40まで重複のない値が入っていたとして、別のシートでA1~A10に探したい10種類の値を入力すれば、その10個の値がSheet1の何行目の何列目にあるかをB列で表示できるといった、そういうことができる関数はありますでしょうか? MATCHでは一度に複数の行や列を検索できないようなので困っています。 よろしくお願いします。

  • エクセルで、条件にあう複数の行を別のシートに抽出する

    《どなたか、お教え下さい》   エクセルで、条件にあう複数の行を別のシートに抽出してまとめる。 「sheet1」の下記の基本データを「sheet2」に「得意先」ごと「日付」の早い順にまとめたいのでが。関数を使ってできないものか、どなたかお教え下さい。「マクロ」や「Access」は使用したことがないので、関数を使ってやりたいと思いますが、できるものでしょうか。よろしくお願いします。 sheet1 番号 得意先 日付 商品名 商品詳細 金額 備考 1   A 2   B 2   B 4   D 5   E 6   F 2   B 3   C 5   E   A    B  番号  得意先   1   A      2   B   得意先名は、番号を入力することで表示されるように   3   C   関数「VLOOKUP」を使って表示させるようにしていま   4   D   す。    5   E   6   F  

専門家に質問してみよう