Excel: データを各シートへ振り分ける

このQ&Aのポイント
  • Excelで表のデータを昇順でソートし、複数のグループに分ける方法を知りたいです。
  • ソート後、各グループのデータを別のシートに転送するマクロの記述方法を教えてください。
  • Excelのシートをグループに振り分ける方法と、マクロを使ったデータ転送方法について教えてください。
回答を見る
  • ベストアンサー

Excel:  データを各シートへ振り分ける

Excelでsheet1からsheet nまで準備されているものとします。sheet1として(2行1列目~50行2列目)までの表があってそれを1列目を昇順でソートしたとき数個のグループに分かれるものとします。またsheet nは事前にグループの分は充分用意されているものとします。 そこでソート後、そのシートを分かれたグループ仮にAAA,CCC,DDDと分かれたときに、sheet2にはAAAのグループを2行目以下へ転送し、sheet3にはBBBのグルーを2行目以下へ転送し、そしてsheet4にはCCCのグループを2行目以下へ転送するようにマクロ記述をしたいどのように記述すればいいですか。(マクロ実行はソート後実行します)

  • taktta
  • お礼率72% (1031/1430)

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

1行目はタイトル行なんですね? 以下、サンプルです。 Sub test01() 'A列基準にデータ分割Copy Set dt = Sheets(1) 'データシート Set base = dt.Range("A2") '基準点 With dt .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)).Sort _ Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin 'A列を昇順でソート n = 2 Do Until base.Offset(i).Value = "" '基準点以下にデータのある限り続ける If base.Offset(i).Value <> base.Offset(i + 1).Value Then 'A列が同データだけ If Not .AutoFilterMode Then .Rows("1:1").AutoFilter 'オートフィルターで抽出 .Rows("1:1").AutoFilter Field:=1, Criteria1:=base.Offset(i).Value .Range(.Range("A2"), .Range("A2").SpecialCells(xlLastCell)).Copy On Error GoTo line Set ws = Sheets(n) 'ペースト先シート On Error GoTo 0 ws.Range("A2").PasteSpecial 'ペースト Application.CutCopyMode = False n = n + 1 End If i = i + 1 Loop .AutoFilterMode = False End With Exit Sub line: MsgBox "シートが足りないわ!", vbCritical, "( ̄□ ̄; ?" End Sub

taktta
質問者

お礼

なかなか高度な処理をしているため理解がおいつきません。 回答についてはどうもありがとうございました。 【追加質問】 If Not .AutoFilterMode Then .Rows("1:1").AutoFilter 'オートフィルターで抽出 .Rows("1:1").AutoFilter Field:=1, Criteria1:=base.Offset(i).Value .Range(.Range("A2"), .Range("A2").SpecialCells(xlLastCell)).Copy これは、オートフィルタ機能を使って、次々にグループのデータを取り出しコピー貼り付けする処理なのですか。

taktta
質問者

補足

回答非常に感謝。きちんと動きます。詳細の検討やもっと自分の目的へのフィットはこれからですが。 dt.Rangeとか使っていますがdt.というのはEXCELのVBの方でどういう役割、使用がきまったものですか。 それともmerlionXXさんが自分で定義したものでしょうか。

その他の回答 (5)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.6

> 単純に2行1列目~50行2列目の表で、ソートする基準を単にAからBに変えた。と回答します。 ならば、以下のようになります。くわしくコメントを入れなおしました。 どこが変わってるかごらんください。 Sub test02() 'B列基準にデータ分割Copy Set dt = Sheets(1) 'データシート Set base = dt.Range("B2") '基準点 With dt .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)).Sort _ Key1:=Range("B2"), Order1:=xlAscending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin 'A1~連続する使用範囲をB列基準に昇順でソート(1行目はタイトル) n = 2 Do Until base.Offset(i).Value = "" '基準点以下にデータのある限り続ける If base.Offset(i).Value <> base.Offset(i + 1).Value Then 'B列が同データだけ If Not .AutoFilterMode Then .Rows("1:1").AutoFilter 'オートフィルターで抽出 .Rows("1:1").AutoFilter Field:=2, Criteria1:=base.Offset(i).Value '範囲内でB列はField:=2 .Range(.Range("A2"), .Range("A2").SpecialCells(xlLastCell)).Copy '抽出範囲をCopy On Error GoTo line 'シート不足チェック Set ws = Sheets(n) 'ペースト先シート On Error GoTo 0 ws.Range("A2").PasteSpecial 'ペースト Application.CutCopyMode = False n = n + 1 End If i = i + 1 Loop '繰り返し .AutoFilterMode = False End With Exit Sub line: MsgBox "シートが足りませぬ!", vbCritical, "( ̄□ ̄; ?" End Sub

taktta
質問者

お礼

ご丁寧なフォロー感謝にたえません。どうもありがとうございました。 この質問で意味をより深く理解できるものとなりました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

> A列でなくB列を基準としたときは下記でいいのでしょうか。 2行1列目~50行2列目の表で、ソートする基準を単にAからBに変えたのですか?それとも表の配置も変わるのですか? そういうことがわからないと答えられません。 また、補足欄にペーストしたコードは改行も無く、不正な文字も入っているためテストも出来ず、何がなんだかわかりません。

taktta
質問者

補足

元元のグループで分解するというグループの値が、実はA列でなくB列に入っています。 単純に2行1列目~50行2列目の表で、ソートする基準を単にAからBに変えた。と回答します。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

> dt.Rangeとか使っていますがdt.というのはEXCELのVBの方でどういう役割、使用がきまったものですか。 > それともmerlionXXさんが自分で定義したものでしょうか。 dtでもs1でもなんでもいいんですが、要はSheet(1)のことです。 >【追加質問】 これは、オートフィルタ機能を使って、次々にグループのデータを取り出しコピー貼り付けする処理なのですか。 貼り付けはその後です。コピーまでをやってます。

taktta
質問者

お礼

ご回答どうもありがとうございます。

taktta
質問者

補足

NO3の回答 A列でなくB列を基準としたときは下記でいいのでしょうか。 どこがかわるのか。A1→B1 A2→B2 (1;1)→(2:2)でしょうか Sub test02() 'B列基準にデータ分割CopySet dt = Sheets(1) 'データシートSet base = dt.Range("B2") '基準点With dt.Range(.Range("B1"), .Range("B1").SpecialCells(xlLastCell)).Sort _Key1:=Range("B2"), Order1:=xlAscending, Header:=xlYes, _OrderCustom:=1,MatchCase:=False, rientation:=xlTopToBottom, SortMethod _:=xlPinYin 'B列を昇順でソートn = 2Do Until base.Offset(i).Value = "" '基準点以下にデータのある限り続けるIf base.Offset(i).Value <> base.Offset(i + 1).Value Then 'B列が同データだけIf Not .AutoFilterMode Then .Rows("2:2").AutoFilter 'オートフィルターで抽出.Rows("2:2").AutoFilter Field:=1, Criteria1:=base.Offset(i).Value‘fieldは1でいいか.Range(.Range("B2"), .Range("B2").SpecialCells(xlLastCell)).CopyOn Error GoTo lineSet ws = Sheets(n) 'ペースト先シートOn Error GoTo 0ws.Range("A2").PasteSpecial 'ペーストApplication.CutCopyMode = False  ‘形式を選択貼り付け  値n = n + 1End Ifi = i + 1Loop.AutoFilterMode = FalseEnd WithExit Subline:MsgBox "シートが足りないわ!", vbCritical, "( ̄□ ̄; ?"End Sub

  • NCU
  • ベストアンサー率10% (32/318)
回答No.2

> どのように記述すればいいですか。 ??? 具体的に何が難しいのですか?

taktta
質問者

補足

excel マクロのステ-トメントの一部で Range("A2:C11").Select Selection.Copy Sheets("Sheet2").Select Range("A2").Select ActiveSheet.Paste Range("A2:C11").SelectでA2の2とか、C11の11とかが、各integer変数のi,jに入っているときそのi,jを使った式だとどう記述すればいいのでしょう。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

このくらいの行数ならコピー&ペーストが早いかもしれませんね。 マクロで書いても、たぶん簡単なマクロですよ。takttaさんが「自分で書いたマクロでうまくいかないから教えてください」と自作のマクロをupするのであれば、皆さんもこぞって協力して下さると思いますが…

taktta
質問者

補足

NO3さんの回答は、データのグループが各々どこからどこ 何行目から何行目に入っているというのを計数する代わりに フィルター機能を使って抽出すていると思うのですが。 それは正解でしょうか。

関連するQ&A

  • Sheet2にある情報をSheet1のA1に1列で

    マクロを作りたいのですが、以下のようなものをどうすればできるかで詰まっています。 Sheet2にある情報をSheet1のA1に1列(A列B列C列の順)で並ぶようにしたいです。 Sheet2の内容は変わることがあるので、データがどの行まで入っているかはマクロを走らせるときにチェックしないとわからないかと思います。 [Sheet1] 111 222 333 aa bb aaa bbb ccc ddd eee -------------------------- [Sheet2] A B C 1 111 aa aaa 2 222 bb bbb 3 333 ccc 4 ddd 5 eee 素人な質問かもしれないですが、調べてもわからなかったので、教えていただけると幸いです。

  • エクセルで列にあるユニークなデータの個数が知りたい

    おはようございます。 エクセルでA列に以下のようなデータがあるとします。 この中で何種類のデータがあるのかを知りたいのです。 この場合は、AAA,BBB,CCC,DDD,EEEの5種類なので5という答えが欲しいのです。 ただし、A列に入るデータは非常に多岐(800種類以上)に渡ります。 また、印刷を前提としてるためソートなどはできません。 さらに1枚のシートにこのようなデータがいくつかあるので、その決まった範囲内で個数を抽出する必要があります。 なにとぞ皆様のお知恵をお貸しくださいませ。 よろしくお願いします。 AAA AAA BBB CCC AAA DDD DDD BBB DDD DDD EEE EEE

  • 【VBA】シートの内容を別シートへ転記する方法

    1シート目のA列には品番が沢山並んでおり、B列、C列に内訳、D列に合計が有ります。例)参照 下記の処理をしたいです。 ------------------------------------------------------------------- 2シート目へ1行目の見出しとAAAの品番の行を転記 3シート目へ1行目の見出しとBBBの品番の行を転記 同様に、A列最終行迄繰り返しシートを作成 ------------------------------------------------------------------- A列の品番が変わる行迄を一まとまりとして行選択する方法にて コードをお教え頂きたく、宜しくお願いします。お教え頂いた内容は理解する様努めます。 例) 内訳1 内訳2 合計 AAA ○○○ ○○○ ○○○ AAA ○○○ ○○○ ○○○ BBB ○○○ ○○○ ○○○ BBB ○○○ ○○○ ○○○ CCC ○○○ ○○○ ○○○ CCC ○○○ ○○○ ○○○ DDD ○○○ ○○○ ○○○ DDD ○○○ ○○○ ○○○ DDD ○○○ ○○○ ○○○ 以下略

  • セルの値に応じて数式を入力するシートを変えたい

    シート名が 「aaa」 「bbb」 「ccc」 「ddd」 という4つのシートがあります。 シート「aaa」のD4セルに入力した値(シート名)に応じて、 (上記で設定したシート)のF7セルに "=SUM(F5:F6)"という数式を入力したいのですが、 おわかりの方がいらっしゃいましたらご教授いただければ幸いです。 例) シート「aaa」のD4セルに「ccc」と入力して実行すると、 シート「ccc」のF7セルに「=SUM(F5:F6)」の数式を入力するマクロを作成したい。 (シート「aaa」のD4セルに「ddd」と入力して実行すると、 同様に、シート「ddd」のF7セルに数式をマクロで入力したい)

  • Excel2007で、太字にした行のみをソートすることはできるのでしょ

    Excel2007で、太字にした行のみをソートすることはできるのでしょうか。 たとえば、 行1 AAA 行2 BBB 行3 CCC 行4 DDD と入力したシートがあり、行2と行4だけ行全体を太字に設定したとします。 このとき、これらの太字にした行2と4だけを表示させるような、つまり「太字にした行だけでソートする」、ということは可能でしょうか。どなたかご存知でしたらご教示ください。 よろしくお願いします。

  • ファイルの結合

    UNIX上で下記のようなfileA、fileBから fileA aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 fileB aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 下記のようなfileCを作ろうとしています。 fileC aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 aaa,ddd,999 そこで、以下のように一列目と2列目をキーにして、sortすることにしました。 cat fileA fileB | sort -u -k1,2 -t, > fileC すると、fileCは下記のようになりました。(一行目の3列目が222ではなく、111になってしまいました) fileC aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 キー項目以外はfileAを優先させたいのですが、なにか良い方法はないでしょうか?

  • エクセル:別のシートへ抽出したデータをリンクさせたい。

    次のようなシートがあります。(シートAとします。)     A    B    C  … [1] 001  AAA [2] 002  BBB  あああ [3] 003  CCC [4] 004  DDD   [5] 005  EEE  いいい C列の空欄データは除外して、C列にデータが記入されているものだけ別のシートに(シートB)に行ごとリンクさせたいと考えています。 (この場合だと2列と5列です。) シートAには今後もデータが追加される想定で、新しいデータで当てはまるものは自動的にシートBに反映されるようにさせたいのですが…。 マクロ等は詳しくありません。できるだけ簡単にできる方法があればご教授していただきたいと思います。 よろしくお願いいたします。

  • エクセルマクロVBAのシートのソート

    エクセルのシート名のソートをマクロでしたいのですが 例えば、aaa1,bbb3,bbb5,aaa12,aaa5,ccc1,vvv2,vvv10を ソート後、bbb5,ccc1,vvv2,vvv10,aaa1,aaa5,aaa12のようにしたいです。 aaaのものだけをソートしてシート後ろに移動できればいいです。 その他はそのままで。 ところが、aaa12のように2桁の数字が入ると上手くソートできず困っています。 If Sheets(i).Name > Sheets(j).Name Thenのようなものでは、数字2桁と数字1桁のグループに 分かれてソートされてしまいました。 どのようにしたらいいでしょうか?

  • エクセルマクロ 特定の文字列を含む行を削除

    エクセルマクロ 特定の文字列を含む行を削除 エクセルのマクロについて教えてください。 下の中から列を限定せず、すべての行でAAA、CCCのいずれかがある場合、 その行ごと、すべて削除したいのです。 時に削除したい特定の文字列が数十種類になるため、 マクロ起動時に削除したい特定の文字を記述したファイルを読み込み、それから 削除できるようにしたいのです。場合によってはそのファイルを編集し、 削除したい文字列を変更したいのです。 ご教示いただだけないでしょうか A列 B列 C列 1 AAA BBB CCC 2 BBB CCC FFF 3 DDD BBB FFF 4 AAA CCC DDD 5 GGG RRR UUU 行中にAAA、BBBがある場合、削除したい ↓ A列 B列 C列 5 GGG RRR UUU マクロを実行し、上記の結果にしたい。

  • エクセルの重複データの抽出(条件付)

    エクセルの以下のようなデータから3時間以上連続で出現しているデータを抽出してその行に色をつけるようなマクロを組みたいのですがそのような方法はないでしょうか。 A列   B列 6/1 3:00 AAA社 6/1 3:00 BBB社 6/1 3:00 CCC社 6/1 2:00 AAA社 6/1 2:00 CCC社 6/1 2:00 DDD社 6/1 1:00 AAA社 6/1 1:00 DDD社 6/1 1:00 EEE社 6/1 1:00 FFF社 6/1 1:00 GGG社 6/1 0:00 AAA社 6/1 0:00 BBB社 6/1 0:00 CCC社 6/1 0:00 DDD社 6/1 0:00 GGG社 6/1 0:00 HHH社 ・ ・ ・ A列は日時、B列は企業名です。 B列の企業名が3時間以上連続して出現している行を抽出して、その行(または企業名)に色をつけるか、または重複してる企業名の一覧表示をしたいです。 この例の場合、AAA社とDDD社になります。 (CCC社は3回出現してるけど、3時間連続していないので対象外。) 3時間以上連続して出現というのがポイントです。 データは2000行ほどで、24時間分です。 マクロ初心者でいろいろ検索してみたのですが、わからずすごく困っています。よろしくお願いします。

専門家に質問してみよう