データ分割して別ブックに保存

マクロ講座75c回 
データ分割して別ブックに保存

データ分割して別ブックに保存 Excel2013 マクロ講座 75c回

大きなデータを分割コピーしてブックに保存したい

何万件もあるような大きなデータを分割して複数ブックに保存して活用したいという時があります。
それを手動で行うのはなかなか大変ですし、時間もかかるしミスも発生したりします。
今回は、マクロを使って大きなデータを指定行数ごとにコピーしブックに保存するマクロを作成しましょう。
(サンプルファイルは、こちらから マクロ75c回サンプルデータ

データを分割して保存

前回の「タイトル行をつけてデータを分割」というマクロでは、新規シートを追加して、そこにデータを貼り付けました。 今回は、シートではなく、ブックを作成して名前をつけて保存するというように変更します。前回のコードのどこをどのように変更すればいいのか考えていきましょう。
データ分割して別ブックに保存マクロ1

Addメソッドで新規ブックを追加

処理をコピー回数分繰り返す、For~Nextステートメントの中で、 下記コードのように、Set シート = Sheets.Addとシートを追加しましたが、
    For i = 1 To 回数
        Set シート = Sheets.Add
        シート.Name = "データ" & 開始行 - 1 & "~" & 開始行 + コピー行 - 2 & "まで"
        元.Rows(1).Copy シート.Range("A1")
        元.Rows(開始行 & ":" & 開始行 + コピー行 - 1).Copy シート.Range("A2")
        Columns("A:F").AutoFit
        開始行 = 開始行 + コピー行
    Next i
変数wbをAs Workbookと宣言して、Set シート = Sheets.Add
Set Wb = Workbooks.Add  のように
ワークブックを追加するという内容に変更しましょう。

ファイル名を設定する

また、変数ファイル名をAs Stringと宣言して、wbにつける名前を次のように設定します。
ファイル名 = "データ" & 開始行 - 1 & "~" & 開始行 + コピー行 - 2 & "まで.xlsx"

長い名前のようですが、何行目から何行目までのデータかわかる名前になります。
データ分割して別ブックに保存マクロ2

新規追加したブックに名前をつけて保存

Addメソッドで新規追加したブックを保存したい場合には、SaveAs メソッドを使って保存します。引数はいろいろ指定できますが、ここでは名前だけ指定してやります。
 ' 同一フォルダに保存して閉じる
 Wb.SaveAs Filename:=ファイル名
 Wb.Close
フォルダを指定して保存する場合はコードを次のようにします。例ではCドライブの「exceldata」フォルダに保存します。
' 保存するフォルダを指定して閉じる
Wb.SaveAs Filename:="C:\exceldata\" & ファイル名
Wb.Close
マクロのコード全体は以下のようになります。
Sub データを分割して新規ブックにコピー()
    Dim 元シート As Worksheet, Wb As Workbook, ファイル名 As String
    Dim 総行数 As Long, 回数 As Long, i As Long, 開始行 As Long
    Const コピー行 = 100
    Set 元シート = ActiveSheet '元シートをActiveSheetにセットする
    総行数 = 元シート.UsedRange.Rows.Count - 1
    回数 = Int(総行数 / コピー行) + IIf(総行数 Mod コピー行 > 0, 1, 0)
    開始行 = 2
    Application.ScreenUpdating = False
    For i = 1 To 回数
        Set Wb = Workbooks.Add  ' 新規ブック作成
        ファイル名 = "データ" & 開始行 - 1 & "~" & 開始行 + コピー行 - 2 & "まで.xlsx"
        元シート.Rows(1).Copy Wb.Worksheets("Sheet1").Range("A1")
        元シート.Rows(開始行 & ":" & 開始行 + コピー行 - 1).Copy Wb.Worksheets("Sheet1").Range("A2")
        Columns("A:F").AutoFit
        Wb.SaveAs Filename:=ファイル名  ' 同一フォルダに保存して閉じる
        Wb.Close
        Set Wb = Nothing
        開始行 = 開始行 + コピー行
    Next i
End Sub
元のデータのあるシートを開いてマクロを実行すると、
データ分割して別ブックに保存マクロ3
元データのあるフォルダ内に、分割したデータがコピーされ、名前をつけて保存されました。
データ分割して別ブックに保存マクロ4
今回、大量のデータを処理する前提なので、画面の更新を一時的に停止して処理速度を向上させるために、ScreenUpdatingプロパティの値をFalseにしました。
Application.ScreenUpdating = Falseというコードの部分です。 プログラムの実行が終わると自動的にTrueに戻ります。しかし処理を明確にするために、最後に Application.ScreenUpdating = Trueを指定してやったほうが良いと言われています。
今回は、大量のデータを分割してコピーし、新規ブックに貼り付け保存するという作業をマクロにしました。 コードはなるべく汎用的に使えるようにしましたが、サンプルファイルで練習して、さらに用途に応じて書き換えて利用してください。