- ベストアンサー
Excel: データを各シートへ振り分ける
- Excelで表のデータを昇順でソートし、複数のグループに分ける方法を知りたいです。
- ソート後、各グループのデータを別のシートに転送するマクロの記述方法を教えてください。
- Excelのシートをグループに振り分ける方法と、マクロを使ったデータ転送方法について教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (5)
- merlionXX
- ベストアンサー率48% (1930/4007)
> 単純に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
お礼
ご丁寧なフォロー感謝にたえません。どうもありがとうございました。 この質問で意味をより深く理解できるものとなりました。
- merlionXX
- ベストアンサー率48% (1930/4007)
> A列でなくB列を基準としたときは下記でいいのでしょうか。 2行1列目~50行2列目の表で、ソートする基準を単にAからBに変えたのですか?それとも表の配置も変わるのですか? そういうことがわからないと答えられません。 また、補足欄にペーストしたコードは改行も無く、不正な文字も入っているためテストも出来ず、何がなんだかわかりません。
補足
元元のグループで分解するというグループの値が、実はA列でなくB列に入っています。 単純に2行1列目~50行2列目の表で、ソートする基準を単にAからBに変えた。と回答します。
- merlionXX
- ベストアンサー率48% (1930/4007)
> dt.Rangeとか使っていますがdt.というのはEXCELのVBの方でどういう役割、使用がきまったものですか。 > それともmerlionXXさんが自分で定義したものでしょうか。 dtでもs1でもなんでもいいんですが、要はSheet(1)のことです。 >【追加質問】 これは、オートフィルタ機能を使って、次々にグループのデータを取り出しコピー貼り付けする処理なのですか。 貼り付けはその後です。コピーまでをやってます。
お礼
ご回答どうもありがとうございます。
補足
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)
> どのように記述すればいいですか。 ??? 具体的に何が難しいのですか?
補足
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)
このくらいの行数ならコピー&ペーストが早いかもしれませんね。 マクロで書いても、たぶん簡単なマクロですよ。takttaさんが「自分で書いたマクロでうまくいかないから教えてください」と自作のマクロをupするのであれば、皆さんもこぞって協力して下さると思いますが…
補足
NO3さんの回答は、データのグループが各々どこからどこ 何行目から何行目に入っているというのを計数する代わりに フィルター機能を使って抽出すていると思うのですが。 それは正解でしょうか。
お礼
なかなか高度な処理をしているため理解がおいつきません。 回答についてはどうもありがとうございました。 【追加質問】 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 これは、オートフィルタ機能を使って、次々にグループのデータを取り出しコピー貼り付けする処理なのですか。
補足
回答非常に感謝。きちんと動きます。詳細の検討やもっと自分の目的へのフィットはこれからですが。 dt.Rangeとか使っていますがdt.というのはEXCELのVBの方でどういう役割、使用がきまったものですか。 それともmerlionXXさんが自分で定義したものでしょうか。