【簡単エクセルマクロ・VBA】多数のファイルを作成する|アプリ事例 #004

アフィリエイト広告を利用しています。
運営者・ポテ

いつもありがとうございます。

ノンプログラマー向けの「エクセルマクロVBAアプリ事例解説シリーズ」へようこそ。

本稿では、「多数のファイルを作成するアプリ」の解説をいたします。


皆さんは、複数のファイルを一度に作成したいと感じたことはありませんか。

例えば、組織の人数分のファイルを作成するときなどです。

これを手作業で行うのは非常に手間がかかる作業です。

しかし、このような反復作業は、VBAを使えば簡単に自動化することができます

VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。

初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。


ことばの意味

  • ノンプログラマー
    プログラミングを本職としない人たちのことです。
  • マクロ
    VBAを使って作成される「機能」のことです。
  • VBA
    Visusal Basic for Application の略で、プログラミング言語のことです。

VBAでファイル・フォルダの一覧を取得する方法

アプリの仕様

「オリジナルファイル.xlsx」をコピーし、エクセルシートに設定した条件に基づいてファイル名を付け、指定した数分のファイルを作成していきます。

前提条件

下図のように、「多数のファイルを作成する.xlsm」と同じ階層に、「オリジナルファイル.xlsx」と「作成したフォルダ」が存在しているとします。この「オリジナルファイル.xlsx」をコピーしてファイルを作成していきます。作成したファイルは「作成したフォルダ」の中に、順次保存されていきます。なお、コードは「多数のファイルを作成する.xlsm」に記述していきます。

エクセルシートの設計

ファイル名を指定するためにエクセルシートを準備します。下図のようなシートを作成しましょう。ここでは、例として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列の最終行)から上方向に移動し、最初にデータが入力されているセルに移動する働きをします。
  • .RowRangeオブジェクトプロパティで、取得したセルが属する行番号を返します。つまり、この場合は「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は、FileSystemObjectfso)の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を題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

>>【独学プログラマーにおすすめ】「独学プログラマー」|影響を受けた愛読書 | みんなの実用学 (jitsuyogaku.com)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です