データ分割して別ブックに保存
マクロ講座75c回
データ分割して別ブックに保存 Excel2013 マクロ講座 75c回
大きなデータを分割コピーしてブックに保存したい
何万件もあるような大きなデータを分割して複数ブックに保存して活用したいという時があります。
それを手動で行うのはなかなか大変ですし、時間もかかるしミスも発生したりします。
今回は、マクロを使って大きなデータを指定行数ごとにコピーしブックに保存するマクロを作成しましょう。
(サンプルファイルは、こちらから マクロ75c回サンプルデータ)
データを分割して保存
前回の「タイトル行をつけてデータを分割」というマクロでは、新規シートを追加して、そこにデータを貼り付けました。
今回は、シートではなく、ブックを作成して名前をつけて保存するというように変更します。前回のコードのどこをどのように変更すればいいのか考えていきましょう。
Addメソッドで新規ブックを追加
処理をコピー回数分繰り返す、For~Nextステートメントの中で、
下記コードのように、Set シート = Sheets.Addとシートを追加しましたが、
Set Wb = Workbooks.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"
長い名前のようですが、何行目から何行目までのデータかわかる名前になります。
新規追加したブックに名前をつけて保存
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元のデータのあるシートを開いてマクロを実行すると、
元データのあるフォルダ内に、分割したデータがコピーされ、名前をつけて保存されました。
今回、大量のデータを処理する前提なので、画面の更新を一時的に停止して処理速度を向上させるために、ScreenUpdatingプロパティの値をFalseにしました。
Application.ScreenUpdating = Falseというコードの部分です。 プログラムの実行が終わると自動的にTrueに戻ります。しかし処理を明確にするために、最後に Application.ScreenUpdating = Trueを指定してやったほうが良いと言われています。
Application.ScreenUpdating = Falseというコードの部分です。 プログラムの実行が終わると自動的にTrueに戻ります。しかし処理を明確にするために、最後に Application.ScreenUpdating = Trueを指定してやったほうが良いと言われています。
今回は、大量のデータを分割してコピーし、新規ブックに貼り付け保存するという作業をマクロにしました。
コードはなるべく汎用的に使えるようにしましたが、サンプルファイルで練習して、さらに用途に応じて書き換えて利用してください。