【簡単Excelマクロ・VBA】多数のファイルを作成する|アプリ事例 #004
いつもありがとうございます。
ノンプログラマー向けの「Excelマクロ・VBAアプリ事例解説シリーズ」へようこそ。
本稿では、「多数のファイルを作成するアプリ」の解説をいたします。
皆さんは、複数のファイルを一度に作成したいと感じたことはありませんか。
例えば、組織の人数分のファイルを作成するときなどです。
これを手作業で行うのは非常に手間がかかる作業です。
しかし、このような反復作業は、VBAを使えば簡単に自動化することができます。
VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。
初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。
ことばの意味
- ノンプログラマー
プログラミングを主な仕事にしていない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
VBAでファイル・フォルダの一覧を取得する方法
アプリの仕様
「オリジナルファイル.xlsx」をコピーし、Excelシートに設定した条件に基づいてファイル名を付け、指定した数分のファイルを作成していきます。
前提条件
下図のように、「多数のファイルを作成する.xlsm」と同じ階層に、「オリジナルファイル.xlsx」と「作成したフォルダ」が存在しているとします。この「オリジナルファイル.xlsx」をコピーしてファイルを作成していきます。作成したファイルは「作成したフォルダ」の中に、順次保存されていきます。なお、コードは「多数のファイルを作成する.xlsm」に記述していきます。
Excelシートの設計
ファイル名を指定するためにExcelシートを準備します。下図のようなシートを作成しましょう。ここでは、例として20個のデータを入力しています。
コードの実装
多数のファイルを作成するコードと、その実行結果を以下に示します。
Sub CreateFiles2()
' 使用ライブラリ
' Microsoft Scripting Runtime (FileSystemObjectを使用)
' 変数宣言
Dim fso As FileSystemObject ' ファイル操作を行うためのFileSystemObject
Dim this_wb As Workbook ' 現在のブック(ThisWorkbook)
Dim this_wb_ws1 As Worksheet ' 対象シート(Sheet1)
Dim last_row As Long ' B列、C列、D列の最終行
Dim b_value As String ' B列の値(1階層目の値)
Dim c_value As String ' C列の値(2階層目の値)
Dim d_value As String ' D列の値(3階層目の値)
Dim file_name As String ' 作成するファイルの名前
Dim original_file As String ' オリジナルファイルのパス
Dim destination_file As String ' 作成したファイルの保存先
Dim row_idx As Long ' 現在処理中の行番号
Dim output_folder As String ' 作成したファイルを保存するフォルダパス
Dim parts As String ' ファイル名の一部(空白を除いた連結)
' 現在のワークブックとワークシートを変数に代入
Set this_wb = ThisWorkbook
Set this_wb_ws1 = this_wb.Worksheets(1)
' FileSystemObjectのインスタンスを生成
Set fso = New FileSystemObject
' データの最終行を取得
last_row = this_wb_ws1.Cells(this_wb_ws1.Rows.Count, 2).End(xlUp).Row
' オリジナルファイルのパスを設定
original_file = this_wb.Path & "\オリジナルファイル.xlsx"
' 作成したファイルのフォルダパスを設定
output_folder = this_wb.Path & "\作成したファイル"
' フォルダが存在しない場合は作成
If Not fso.FolderExists(output_folder) Then
fso.CreateFolder (output_folder)
End If
' 各行のB列、C列、D列の値を取得して新しいファイルを作成
For row_idx = 7 To last_row
parts = "" ' 初期化
' B列の値が空でない場合、連結に追加
If Trim(this_wb_ws1.Cells(row_idx, 2).Value) <> "" Then
parts = this_wb_ws1.Cells(row_idx, 2).Value
End If
' C列の値が空でない場合、連結に追加
If Trim(this_wb_ws1.Cells(row_idx, 3).Value) <> "" Then
If parts <> "" Then parts = parts & " - "
parts = parts & this_wb_ws1.Cells(row_idx, 3).Value
End If
' D列の値が空でない場合、連結に追加
If Trim(this_wb_ws1.Cells(row_idx, 4).Value) <> "" Then
If parts <> "" Then parts = parts & " - "
parts = parts & this_wb_ws1.Cells(row_idx, 4).Value
End If
' 空白チェック後、ファイル名を作成
If parts <> "" Then
file_name = parts & ".xlsx"
destination_file = output_folder & "\" & file_name
' オリジナルファイルをコピーして新しいファイルを作成
fso.CopyFile original_file, destination_file
End If
Next row_idx
End Sub
このコードを実行すると、下図のように「作成したフォルダ」の中にファイルが作成されます。
解説していきます。
' 使用ライブラリ
' Microsoft Scripting Runtime (FileSystemObject を使用)
これはコードの一部ではありませんが、この コードを実行するために必要なライブラリをコメントとして記載しています。このMicrosoft Scripting Runtime
を使用することで、FileSystemObject
というオブジェクトを操作することができるようになります。つまり、ファイルやフォルダに関する情報を取得したり操作したりすることができます。
ことばの意味
- オブジェクト
特定の役割を持つ道具のようなものです。 - ライブラリ
特定の機能をもったコードの集合体です。ソフトウェア作成における部品のようなものです。新しいアプリケーションを作成する際、ライブラリを使用することで、プログラマーは複雑なコードを自分で書く必要がなくなります。
ライブラリの参照設定は以下の手順で行うことができます。
VBE画面から「ツール」--> 「参照設定」を開きます。
Microsoft Scripting Runtime
にチェックを入れて、「OK」を押します。なお、これらのライブラリを初めて設定する場合、上位には表示されていません。アルファベット順に従ってリストの下の方に表示されていますので、慌てずに探してください。
以上で、ライブラリの参照設定は終了です。
以降の行の解説をしていきます。
' 変数宣言
Dim fso As FileSystemObject ' ファイル操作を行うためのFileSystemObject
Dim this_wb As Workbook ' 現在のブック(ThisWorkbook)
Dim this_wb_ws1 As Worksheet ' 対象シート(Sheet1)
Dim last_row As Long ' B列、C列、D列の最終行
Dim b_value As String ' B列の値(1階層目の値)
Dim c_value As String ' C列の値(2階層目の値)
Dim d_value As String ' D列の値(3階層目の値)
Dim file_name As String ' 作成するファイルの名前
Dim original_file As String ' オリジナルファイルのパス
Dim destination_file As String ' 作成したファイルの保存先
Dim row_idx As Long ' 現在処理中の行番号
Dim output_folder As String ' 作成したファイルを保存するフォルダパス
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
' 現在のワークブックとワークシートを変数に代入
Set this_wb = ThisWorkbook
Set this_wb_ws1 = this_wb.Worksheets(1)
ここでは、オブジェクト変数 this_wb
と this_wb_ws1
に、それぞれワークブックオブジェクトとワークシートオブジェクトを代入しています。なお、ThisWorkbook
は現在のワークブック、つまりこのコードが記述されているワークブックを指します。
' FileSystemObjectのインスタンスを生成し変数に代入
Set fso = New FileSystemObject
ここでは、FileSystemObject
を新しく作成し、そのオブジェクトを fso
という変数に代入しています。FileSystemObject
は、ファイルやフォルダを操作するためのオブジェクトで、これを使うことでファイルの存在確認、コピー、削除など、さまざまな操作が可能になります。
' データの最終行を取得
last_row = this_wb_ws1.Cells(this_wb_ws1.Rows.Count, 2).End(xlUp).Row
ここでは、データの最終行を取得しています。このコードでは、B列(列番号2)の最終行を取得しています。
Rows.Count
は、ワークシートの最終行の行番号をします。 Excelのバージョンによって異なりますが、通常1048576行です。this_wb_ws1.Cells(this_wb_ws1.Rows.Count, 2)
の"2"は、列番号を表します。この場合2列目ですので、B列を表します。.End(xlUp)
は、Range
オブジェクトのプロパティで、指定したセル(ここではB列の最終行)から上方向に移動し、最初にデータが入力されているセルに移動する働きをします。.Row
もRange
オブジェクトのプロパティで、取得したセルが属する行番号を返します。つまり、この場合は「26」を返します。
ことばの意味
- プロパティ
オブジェクトの属性のことです。オブジェクトの状態を制御したり、情報を取得したりするために使用されます。
' オリジナルファイルのパスを設定
original_file = this_wb.Path & "\オリジナルファイル.xlsx"
ここでは、コピー元である「オリジナルファイル.xlsx」のパスを、変数original_file
に代入しています。
' 作成したファイルのフォルダパスを設定
output_folder = this_wb.Path & "\作成したファイル"
ここでは、作成したファイルを保存するフォルダのパスを設定してます。
' フォルダが存在しない場合は作成
If Not fso.FolderExists(output_folder) Then
fso.CreateFolder (output_folder)
End If
ここでは、指定されたフォルダ (output_folder
) が存在するかどうかを確認し、存在しない場合はそのフォルダを作成しています。
If Not
を使って、フォルダが存在しない場合の処理を条件分岐しています。fso.FolderExists(output_folder)
は、output_folder
が存在するかを確認するメソッドです。存在しない場合はFalse
を返します。fso.CreateFolder(output_folder)
は、フォルダを新規作成するメソッドです。
ことばの意味
- メソッド
オブジェクトを操作するための「命令文」のことです。
ここからがポイントです。
' 各行のB列、C列、D列の値を取得して新しいファイルを作成
For row_idx = 7 To last_row
parts = "" ' 初期化
ここでは、B列、C列、D列の値を順に取得し、それらの値をもとに新しいファイル名を作成するための繰り返し処理を開始しています。
For row_idx = 7 To last_row
は、7行目から最終行までのループ処理を行っています。各行に対して処理を行うためのカウンタとしてrow_idx
を使用しています。parts = ""
は、変数Partsに空文字列を入れることにより初期化し、前回の値が残らないようにしています。
' B列の値が空でない場合、連結に追加
If Trim(this_wb_ws1.Cells(row_idx, 2).Value) <> "" Then
parts = this_wb_ws1.Cells(row_idx, 2).Value
End If
ここでは、Trim関数を使用して、B列の値の前後の空白を取り除いたうえで、その値が空でないかをチェックしています。値が空でない場合、parts
にB列の値を代入します。
' C列の値が空でない場合、連結に追加
If Trim(this_wb_ws1.Cells(row_idx, 3).Value) <> "" Then
If parts <> "" Then parts = parts & " - "
parts = parts & this_wb_ws1.Cells(row_idx, 3).Value
End If
ここでは、C列の値が空でない場合に、既に連結されている他の列(B列)の値にC列の値を追加する処理を行います。連結する際には、既にparts
に値がある場合、区切り文字として「-」を挿入しています。C列が空白でないときのみ、連結が行われるようになっています。
If Trim(this_wb_ws1.Cells(row_idx, 3).Value) <> "" Then
は、Trim
関数を使って、C列(3列目)の値の前後に余分な空白があれば取り除いたうえで、その値が空でないことを確認しています。空でない場合にのみ、以下の連結処理が実行されます。If parts <> "" Then parts = parts & " - "
は、parts
にすでに値が入っている(B列の値が連結済み)場合、区切り文字として「-」を追加します。この条件により、最初の連結時には区切り文字を追加せず、それ以降の連結時にのみ「-」を追加するようにしています。parts = parts & this_wb_ws1.Cells(row_idx, 3).Value
は、C列の値をparts
に連結します。これにより、すでに連結されているB列の値に対して、C列の値が追加されます。もしC列が最初に追加される値であれば、そのままC列の値だけがparts
に代入されます。End If
は、If
文の終了部分です。C列の値が空でない場合にのみ連結処理が行われ、それ以外はスキップされます。
' D列の値が空でない場合、連結に追加
If Trim(this_wb_ws1.Cells(row_idx, 4).Value) <> "" Then
If parts <> "" Then parts = parts & " - "
parts = parts & this_wb_ws1.Cells(row_idx, 4).Value
End If
D列の値に対しても同様の処理を行っています。
' 空白チェック後、ファイル名を作成
If parts <> "" Then
file_name = parts & ".xlsx"
destination_file = output_folder & "\" & file_name
' オリジナルファイルをコピーして新しいファイルを作成
fso.CopyFile original_file, destination_file
End If
ここでは、B列、C列、D列のいずれかの値が空白でない場合に、連結されたファイル名を作成し、そのファイル名を使用して、元のファイル(オリジナルファイル)を新しい名前で指定のフォルダにコピーしています。
If parts <> "" Then
は、parts
が空文字列でないことを確認するための条件分岐です。parts
にはB列、C列、D列の値が連結されており、いずれかに値が存在する場合のみ、次の処理が実行されます。
file_name = parts & ".xlsx"
は、連結された値であるparts
に拡張子「.xlsx」を連結して、ファイル名を作成しています。
destination_file = output_folder & "\" & file_name
は、作成されたファイル名を元に、ファイルの保存先のフルパスを指定しています。output_folder
に保存フォルダのパスが格納されており、その後にファイル名を連結することで、保存先のファイルパスが構築されます。
fso.CopyFile original_file, destination_file
は、FileSystemObject
(fso
)のCopyFile
メソッドを使用して、original_file
で指定されたオリジナルファイルを、destination_file
で指定された場所にコピーします。これにより、新しいファイル名でオリジナルファイルのコピーが作成されます。
End If
は、If
文の終了部分です。parts
が空文字列でない場合のみ、ファイル作成の処理が行われ、それ以外はスキップされます。
Next row_idx
ここでは、次の行(row_idx)に進んで、同様の処理を繰り返す指示をしています。ループが終了するまで、各行のB列、C列、D列の値に基づいたファイルが次々と作成されていきます。
以上で、解説は終了です。ありがとうございました。
おわりに
ご覧いただきありがとうございました。
本稿では、「多数のファイルを作成するアプリ」の紹介をいたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
尚、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
筆者の記事関連経験
- VBA使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。