• ベストアンサー

エクセルでブックの分割をするマクロ?

シート2枚を持つ大きなブックがあります。 1枚目2枚目とも、A列には国名、B列に地名、C列目以降に各種データ(1枚目と2枚目は別のデータ)があります。 全部で国名は約60、地名は1000程度です。 たとえば A列 B列 C列 D列 日本 東京 1111 1234 日本 札幌 2222 2345 日本 函館 1515 0055 韓国 ソウル 0000 0000 韓国 プサン 3322 2323 のような感じです。 これを国別に別々のブック(それぞれ2枚のシートがある)に切り分けるマクロを教えてください。よろしくお願いします。

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.4

エクセル2000で動きましたが・・・ Sub 国別ブック作成() Dim 元ブック名, 新ブック名 As String Dim 元ブック最終行1, 元ブック最終行2 As Integer Dim 元ブック行数1, 元ブック行数2 As Integer Dim 新ブック行数1, 新ブック行数2 As Integer Dim wwww As String 元ブック名 = ActiveWorkbook.Name If Workbooks(元ブック名).Sheets(1).Range("A1") = "" Then Exit Sub Workbooks.Add 新ブック名 = ActiveWorkbook.Name Workbooks(元ブック名).Sheets(1).Range("A1:Z1").Copy Workbooks(新ブック名).Worksheets(1).Activate Range("A1").Select ActiveSheet.Paste 元ブック最終行2 = Workbooks(元ブック名).Sheets(2).Range("A65536").End(xlUp).Row 新ブック行数2 = 1 For 元ブック行数2 = 1 To 元ブック最終行2 If Workbooks(元ブック名).Sheets(1).Range("A1") = _ Workbooks(元ブック名).Sheets(2).Range("A" & 元ブック行数2) Then Workbooks(元ブック名).Sheets(2).Range _ ("A" & 元ブック行数2 & ":Z" & 元ブック行数2).Copy Workbooks(新ブック名).Worksheets(2).Activate Range("A" & 新ブック行数2).Select ActiveSheet.Paste 新ブック行数2 = 新ブック行数2 + 1 End If Next 元ブック行数2 新ブック行数1 = 2 元ブック最終行1 = Workbooks(元ブック名).Sheets(1).Range("A65536").End(xlUp).Row For 元ブック行数1 = 2 To 元ブック最終行1 If Workbooks(元ブック名).Sheets(1).Range("A" & 元ブック行数1) <> _ Workbooks(元ブック名).Sheets(1).Range("A" & 元ブック行数1 - 1) Then wwww = Workbooks(元ブック名).Sheets(1).Range("A" & 元ブック行数1 - 1) Workbooks(新ブック名).SaveAs "E:\" & wwww & ".xls" ActiveWorkbook.Close Workbooks.Add wwww = Workbooks(元ブック名).Sheets(1).Range("A" & 元ブック行数1) 新ブック行数1 = 1 新ブック名 = ActiveWorkbook.Name 元ブック最終行2 = Workbooks(元ブック名).Sheets(2).Range("A65536").End(xlUp).Row 新ブック行数2 = 1 For 元ブック行数2 = 1 To 元ブック最終行2 If wwww = Workbooks(元ブック名).Sheets(2).Range("A" & 元ブック行数2) Then Workbooks(元ブック名).Sheets(2).Range _ ("A" & 元ブック行数2 & ":Z" & 元ブック行数2).Copy Workbooks(新ブック名).Worksheets(2).Activate Range("A" & 新ブック行数2).Select ActiveSheet.Paste 新ブック行数2 = 新ブック行数2 + 1 End If Next 元ブック行数2 End If Workbooks(元ブック名).Sheets(1).Range _ ("A" & 元ブック行数1 & ":Z" & 元ブック行数1).Copy Workbooks(新ブック名).Worksheets(1).Activate Range("A" & 新ブック行数1).Select ActiveSheet.Paste 新ブック行数1 = 新ブック行数1 + 1 Next 元ブック行数1 wwww = Workbooks(元ブック名).Sheets(1).Range("A" & 元ブック最終行1) Workbooks(新ブック名).SaveAs "E:\" & wwww & ".xls" ActiveWorkbook.Close End Sub 大まかな、処理の流れ まず、一件目のデータで、1ブックを作ります。 それから、2件づつのデータを比べて、国が違ったら、の処理をしています。 最後にデータを書き出しています。 データは一行目から入っているものとして処理しています。 新しいブックの名前は、国名になっています。また、"E"ドライブに書き出していますので、適当に変えてください。 また、新しいブックには、A1:Z1迄、コピーしています。

AQUALINE
質問者

お礼

ありがとうございました。 完璧に作動しました。 下でしたDoEventsの回答を見てからポイントを付けさせていただきます。 ほんとうにありがとう御座いました。

その他の回答 (4)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

>DoEvnets でエラーになってしまいました。 すみません。綴りを間違えてました。 正しくは、 DoEvents です。

AQUALINE
質問者

お礼

ありがとうございました。 動きました。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

一応、A列の最終行が不定で、データの有無で判断するとして、Doループを使用します。 i = 1 StartRow = 1 Do   DoEvnets   If Cells(i, 1).Value <> Cells(i + 1, 1).Value Then     EndRow = i     'ここに新規ファイル作成、コピー・ペースト処理     StartRow = i + 1   End If   i = i + 1 Loop Until (Cells(i, 1).Value = "") ループを使う場合は、RangeよりもCellsプロパティの方が見やすいと思います。 詳細はヘルプで。

AQUALINE
質問者

補足

ありがとうございます。一応こんな形でやってみましたが、DoEvnets でエラーになってしまいました。 Sub BUNKATSU() Dim StartRow As Integer Dim EndRow As Integer Dim 新ファイル名 As String i = 3 '(2行目までタイトルのため) StartRow = 3 Do DoEvnets If Cells(i, 1).Value <> Cells(i + 1, 1).Value Then EndRow = i Range("A" & StartRow & ":D" & EndRow).Select Selection.Copy Workbooks.Add Range("A1").Select ActiveSheet.Paste Range("A1").Select Application.CutCopyMode = False 新ファイル名 = Cells(1, 1) ChDir "C:\Windows\デスクトップ\分割" ActiveWorkbook.SaveAs FileName:="C:\Windows\デスクトップ\分割\" _ & 新ファイル名 & ".xls" ActiveWindow.Close StartRow = i + 1 End If i = i + 1 Loop Until (Cells(i, 1).Value = "") End Sub

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 マクロ記録で範囲指定のコピーは、 Range("A1:C3").Select Selection.Copy となりますので、Rangeオブジェクトの中を変えればコピー出来るわけです。 やり方は、A列でソートした後で(ソートもマクロ記録でやってみて下さい。)、A列の値を順に見ていき(ForかDoループで)、内容が変わったところ(日本→韓国など)を終了行とします。(開始行は前の変わり目の次ですね。) で、例えば、開始行をStartRow、終了行をEndRowなどの変数に格納して、 Range("A" & StartRow & ":D" & EndRow) という風にすればA列の内容ごとにコピー出来ます。 そして、No.1の人の方法で、新規ブックを作成・保存し、そこへペーストします。 Workbooks(新規ブック名).Activate WorkSheets(ペーストするシート名).Select Range("A1").Select ActiveSheet.Paste という感じです。 あとは、新規ブックを保存して閉じます。 そしてまた、終了行の次からA列を見ていきます。 これの繰り返しで出来ると思います。

AQUALINE
質問者

補足

ありがとうございます。 内容が変わったところ(日本→韓国など)を判別するのは多分 For i = 1 To (終了行までの行数) If Range("A" & i + 1) <> Range("A" & i) Then だろうとは思うのですが、そのあとどんな記入になるのかお手上げです!すみません。

  • ta-nuki
  • ベストアンサー率44% (15/34)
回答No.1

アルゴリズムだけご提示しますと、 A列のデータ部分を国名でソートし、 A列の上下のセルの内容(国名)が異なっていれば >Set newBook = Workbooks.Add > With newBook > .Title = "(A列のセルの内容を文字列化したもの(つまり国名))" > .Subject = "お好きな名前" > .SaveAs filename:="(A列のセルの内容を文字列化したもの)&.xls" > End With (ヘルプの丸写しです)として、新規にbookを作成して データをそのブックに書きこんでゆけば良いとおもいます。

AQUALINE
質問者

お礼

早速ありがとうございます。 元データは国名ですでにソートされているのです。 それをA列の上下のセルの内容(国名)が異なっていれば国別に分割(元データは残したまま)された60いくつのブックを自動的に生成するというマクロが自分では書けないのです。トホホ。

関連するQ&A

  • エクセルのブック分割マクロを教えてください。

    すみません、教えていただきたいのですが。 ひとつのシートの膨大なデータを種類ごとに別ブックの別シートにわけるマクロです。 オリジナルのシートは1枚です。 1行目は項目行で A:地域名(北米、中南米、欧州、アジア、アフリカ、オセアニア) B:国名(アメリカ、カナダ、ブラジル等) C~J:その他各種項目 10000行程度のデータで、ソート済みです。 このシートを、A列の地域別にブック分割をして、それぞれのブックは中に国名別のシートを持ちます。 各シートの配置はオリジナルと同じく1行目に項目、2行以下がデータというならびにしたいのです。 全部で6ブックで、計50シートくらいになります。 各ブック名は地域名(北米等)とし、各シート名は国名となればありがたいです。 なにとぞよろしくお願いします。

  • excel 抽出およびその数のマクロについて

      A列           B列       C列           (A列の同じ国名を除く)   その数 アメリカ         アメリカ       6 インド          インド ブラジル         ブラジル 中国           中国         6 中国           カンボジア カンボジア        日本         6 日本           ベトナム 中国           シンガポール ベトナム         マレーシア シンガポール       オーストラリア アメリカ         韓国         3 マレーシア        タイ         2 日本           ドイツ 日本 アメリカ オーストラリア 韓国 アメリカ 日本 中国 日本 日本 タイ アメリカ タイ 中国 韓国 韓国 スリランカ 中国 ドイツ アメリカ  A列について同じ国名のセルを除いてB列のようにあらわすにはどのようにすれば良いですか。また、同じ国名の数、たとえばこの場合は「アメリカ」は6(C列)になりますが、これをあらわすにはどのような関数を使用すれば良いでしょうか。ご教示のほどお願いいたします。  上の質問に対して3人の方からご回答をいただきました。(http://okwave.jp/qa/q9068971.html)本当に有り難うございました。感謝しております。  ただ、このような重複削除、そして国数という同じ作業が150ほどあります。いわゆるA、B、C列の3列のまとまりが150ほどあるということです。  A、B、Cでひとまとまり、D、E、Fでひとまとまり、G、H、I、でひとまとまりという感じで、それがA列~PC列くらいまであります(A、D、Gには国名(最高で25くらい)、B、E、Hには重複削除した国名、C、F、Iには国数です)。  一つ一つ手作業で行うのは面倒ですので、マクロで行いたいと思いますが、その組み方を出来ればご教示をお願いしたいと思います。どうぞ宜しくお願いいたします。  

  • エクセルで2つのブックを1つのブックに統合したい。

    Excel2010を使っております。 ブックAのシート1とブックBのシート1でデータを作っておりましたが、 ブックBのシート1のデータをブックAのシート2に移して、 作業ブックをブックA1つに統合したいと思っております。 やり方が分かる方がいましたら教えてください。 よろしくお願いします。

  • ブックを開くマクロ

    データ管理というファイルの中にある データー(1)のファイルの中の データ表(1)というエクセルbookのあるマクロを実行すると 同じくデータ管理というファイルの中にある データー(2)のファイルの中の データ表(2)というbookを開き そのbookのsheet1のA1:B5をコピーして データ表(1)エクセルbookのsheet1のA1:B5に貼り付ける・・・ というVBAを組む事は出来ますでしょうか? 分かりにくくてすいません

  • エクセルVBA、マクロについて教えてください。

    https://box.yahoo.co.jp/guest/viewer?sid=box-l-62itttdrrgzrvsaxkvu53tmg3a-1001&uniqid=d4c90186-7ae6-4c7a-8f04-a499509147fc&viewtype=detail サンプルブックを見て頂きたいのですが、シートに分けておりますが、それぞれ別ブックとなります。 エクセルブックAにはシート1-シート10まであります。 ブックAのデータをVBAを使って、ブックBに転記したいのですが、 今はVBAがわからないため、作業列、関数を使って読み取っているのですが、検索をかけると、とても遅いため、関数を消すと早く検索が出来たため、VBAでデータを転記出来たらいいなと思っております。 いくつか条件があるのですが、 ブックAのAQ-ATが作業列としており、 ブックBのG-Uまで関数を入れております。 G4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,G$2) H4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A5,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,H$2) I4==SUMIFS('[ブックA.xlsx]シート1'!$AD:$AD,'[ブックA.xlsx]シート1'!$AQ:$AQ,$A4,'[ブックA.xlsx]シート1'!$AS:$AS,$F$2,'[ブックA.xlsx]シート1'!$AT:$AT,I$2) 同じような関数をG-Uまで入れております。 このような関数を入れております。 E4==VLOOKUP(A4,'[ブックA.xlsx]シート1'!$B:$AC,28,FALSE) この関数をなくすとAdvancedFilterが早くなるので、ここの部分を転記出来たらと考えております。 ブックAとブックBはブックAのB列のコードとブックBのA列のコードが一致すれば、転記すると言った感じです。 決まっている部分は、商品コードは重複しないのと、ブックAのB列は結合されております。 結合セルのため、作業列を使用しておりました。 ブックAの基準をかえずに転記できる方法があればおしえてください。

  • エクセルで別ブックを検索するマクロ、VBA

    エクセルで以下の処理を行えるマクロを作成したいです。 当方、マクロについてほとんど知識がありません。 恐縮ですが、教えていただけると嬉しいです。 ・主にしたいこと  [検索]ブックで一致するコードを探して、  [結果]ブックの対応するコードの行にそれぞれの項目を返したい。 ●ブック1 [検索]  シートが12個あります(それぞれ、1、2、3…12というシート名=1~12月分)  ↓各シートの内容    A    B    C    D 1  氏名  数値  コード  内容 2  abc   111  SS1234 あいうえお 3  bcd   123  SS3456 かきくけこ ・ ・ ・ といった感じです。 12個のシートの中身はそれぞれ似たようなものですが、 「コード」や「内容」などは少しずつ違います。 ●ブック2 [結果]  ↓シートの内容    A    B    C    D 1  氏名  コード  内容  数値 2      SS3456 3      SS1234 ・ ・ ・ といった感じです。 (注)検索用ブックとは列の並びが異なっています。 ここでやりたいことの詳細ですが、 ・[結果]ブックの「コード」(B列)にコードを入力すると、  [検索]ブックで一致するコードを検索し、  A列「氏名」、C列「内容」、D列「数値」に、[検索]シートの内容を  自動的に表示させたい。  (ただし[結果]ブックに入力した「コード」は、[検索]ブックの1~12のうち、   どのシートにあるかわからない) ・入力したコードが見つからない場合は何も表示しない。 ということです。 最初VLOOKUP、MATCH等の関数で表示することを考えましたが、 シートが複数にまたがっているのと、 列の並び方が[検索][結果]ブックで違うのでわかりませんでした。 長くなってしまい申し訳ありませんが、どうかおしえてください。 よろしくお願いします。

  • エクセルマクロ:別のブックから該当するデータをコピー

    Book1のSheet1、A列に日付、B列に対応するデータがあります。 Book2のSheet1A1セルに入力された日付と一致するBook1Sheet1B列の値を、Book2のB1セルに値貼り付けしたいのですが、どのように記述すればよろしいでしょうか。 宜しくお願いいたします。

  • エクセルのマクロで」・・・

    マクロの超初心者です。 1度研修で習った程度です。 a.xlsというブックでマクロを動かし、 既にいくつかシートがあるb.xlsを開いて最後のシートの次に新しいシートを作り、 既にあるc.xlsの1つ目のシートにあるデータをb.xlsの新しく作ったシート に貼り付け、b.xlsとc.xlsのブックは閉じるようにすることはできますか?(b.xls,c.xlsは最初閉じている) どのような感じにa.xlsでマクロを組めばよいのでしょうか? 今起動しているブックではないブックを起動したりできるのかも不明です。

  • Excel2003 マクロでブックを開かずにコピペ

    Excel2003でC:\にあるブックBを開かずに、 開いているブックAの指定したセルをコピーしたいのですがうまくいきません。 具体的なイメージは 開いているコピー先のブックA:いろは.xls コピー先のシート:Sheet1 コピー元のブックB:らりるれろ.xls コピー元のシート:らりるれろ (ブックBの名前(らりるれろ.xls)とシート名が同じなのはシステム上の仕様です。) ブックBのC6をブックAのC5に、 ブックBのI6をブックAのC6に、 ブックBのK6をブックAのC7に、 ブックBのH6をブックAのC8にコピーしたいと考えています。 宜しくお願いします!

  • エクセルマクロを使って、表を完成させたいのですが

    お尋ねします。 ブックAのシート1には、下記のように数字が入っています。 それをもとに、ブックBのシート1に表を完成させたいのですが、どのようにすればいいでしょうか。 ブックBは、ブックAのA列の値がそれぞれいくつあるかを示したものです。 ブックA    A列 1行 2A  2行 1A 3行 1C 4行 4D 5行 5D 6行 1A ※行数はこれ以上ありますが、A列には、数字とアルファベットの  組み合わせで2桁で構成されています。 ※アルファベットはA~Dで、数字は1~5です。 ブックB    A列 B列 C列 D列 F列 1行  2      1  2行  1 3行  4行            1 5行               1 ※ブックAのA列の値からブックBにブックAの値が  それぞれ何個あるかを示したいのです。  よろしくお願いします。

専門家に質問してみよう