
動画でExcel ファイルやブックを好きな場所に大量に作る
動画と記事で解説する「マクロ講座」です。
今回はシートにリストアップされた名前を使って、好きなだけエクセルのブックを作成するというマクロを考えていきたいと思います。
また、連番を使った規則的な名前のブックも大量に作成するマクロも作ります。
ブックを作るには、Workbooksオブジェクトの「Add」メソッドを使用します。そしてブックを保存するには、「SaveAs」メソッドを使用して名前をつけて保存します。
(サンプルファイルは、こちらです。 ファイルやブックを好きな場所に大量に作る、サンプル04回)
「マクロ講座入門編EX 06回で学べること」は以下の内容です。
前回の動画では、フォルダーを作りましたので、
今回はブックを大量に作成するという内容です。
そのブックは、好きな場所に好きな名前で好きなだけ作るというような形にしていきたいと思います。
作成するブックの名前リストがあるという設定です。

'/****** 配列に格納 ***********
Sub CreateMultipleFolders_array()
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim folder_paths(), path
folder_paths = Array("D:\SampleTestFolder\NewFolder1", _
"D:\SampleTestFolder\NewFolder2", _
"D:\SampleTestFolder\NewFolder3")
For Each path In folder_paths
fso.CreateFolder path
Next path
End Sub
前回のフォルダの作成のコードの1例が以下の図ですが、今回はブックです。
MicrosoftのScripting Runtimeを参照設定して FileSytemObjectを使っています。
今回作成するのは、ブックですから、ブックというのはExcelの配下にある部品です。
そのMicrosoftのScripting Runtimeは使わなくても作れるわけです。

以下が今回のブック作成マクロです。説明の前に、ブックを作成するマクロを先に実行してみます。

作成したブックを保存するフォルダを指定しなかったので、このThis workbookと同じフォルダー内に ブックは保存されました。リストにある名前でブックが20個作成されています。

また、コードの始めの方で、Application.ScreenUpdating = Falseに設定していたので、 画面に作成されていくブックの様子が表示されず、画面がちらつきませんでした。実行速度も早くなっています。コードの終わりの直前にて、 Application.ScreenUpdating = Trueで設定を戻しています。

最初のコードはこちらです。このケースでは、ブックの保存先を指定していません。
Option Explicit 'Workbook.SaveAs メソッドを使う
Dim ws As Worksheet, i As Long, lastrow As Long
Sub ワークブックをシートのリスト名から作る()
Application.ScreenUpdating = False
Set ws = sh_list
lastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 1 To lastrow
Workbooks.Add
ActiveWorkbook.SaveAs ws.Range("A" & i) & ".xlsx"
Next i
Call Otherbooks_Close
Application.ScreenUpdating = True
End Sub
ブックの保存先を自由に指定する場合。
保存先を指定する変数を宣言し、そこに保存先のアドレスを入れる。
サンプルでは、Dim fPath As String と宣言しました。

さらに、ブックを100個作る場合などは、よく連番を使うことがあるので、連番のケースでコードを記述しています。

さて実行したいのですが、さすがに100個作って、そのブックで画面いっぱいになっては困りますから、 ThisWorkBook以外を閉じる、部品マクロを作成することにしましょう。

本体のマクロコードに、呼び出すために、 Call Otherbooks_Close と記述しました。
また作成するブックを100から30に減らしました。

30個のブックが指定フォルダに作成されました。

Public Sub Otherbooks_Close()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> ThisWorkbook.Name Then
'今回はブックを保存せず閉じる(すでに保存済みだから)
wb.Close SaveChanges:=False
'保存して閉じる場合は以下
' wb.Close SaveChanges:=True
End If
Next
End Sub