VBA

【VBA実践編1-3】シートに設置したボタンからフォルダからファイル名を取得するマクロを呼び出す

VBA実践編1-2では、指定したフォルダ内にあるファイル名を取得してシートに入力するという処理を行いました。

今回は、その処理を発展させて次のような機能を追加していきます。

今回の処理
  • 検索したいフォルダをシートに入力する
  • シート上にボタンを設置する
  • ボタンを押すと1で指定したフォルダにあるファイルを取得して、シートに入力する

シートにボタンを設置してマクロを登録することで、マクロを簡単に呼び出すことができユーザーが使いやすくなります。

目次

シートに設置したボタンからフォルダからファイル名を取得するVBAコード

まず、標準モジュールに次のコードを入力します。

Sub GetFileNames()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    '検索したいフォルダを取得する
    Dim folderPath As String
    folderPath = ws.Cells(3, 1).Value
    
    Dim i As Long
    i = 6
    
    '残っているファイル名を削除する
    ws.Cells(i, 1).Resize(10, 1).Value = ""
    
    '指定したフォルダの中にある拡張子が「csv」のファイル名を取得する
    Dim buf As String
    buf = Dir(folderPath & "\*.csv")
            
    'フォルダ内のファイル数がなくなるまで繰り返す
    Do While buf <> ""
        ws.Cells(i, 1).Value = folderPath & "\" & buf
        i = i + 1
        buf = Dir()
    Loop

End Sub

 

次にシートにボタンを設置します。

ボタンは、リボンの「開発」タブ→「挿入」からフォームコントロールのボタンを選び、好きな場所に配置します。

配置し終わると「マクロの登録」という画面が表示されるので、登録したいマクロ名を選択して「OK」をクリックします。

今回だと「GetFileNames」というマクロ名を選択します。

これで、ボタンを押すとマクロを呼び出すことができます。

ちなみに、最初に設置したときは「ボタン○」という名前になっていますので、変更したい場合はボタンを右クリックして「テキストの編集」を選択すると修正ができます。

今回は「検索」というように編集しました。

VBAコードの解説

今回の処理のポイントは、シートを活用することです。

シート上の値を使ったり、入力したりするのはVBAの基本です。

シートのセルを参照・入力が多いときはシート自体を変数に格納すると、入力する内容が減り、見た目のコードもスッキリします。

with文を使った書き方もありますが、今回はシートを変数に入れて処理を書いています。

検索するフォルダを取得する

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    
    '検索したいフォルダを取得する
    Dim folderPath As String
    folderPath = ws.Cells(3, 1).Value

 

まず、今回操作するワークシートを変数にセットします。

シートを変数に入れるときは、変数の前に必ず「Set」を付けてください。

また、「Thisworkbook」をワークシートの指定の前に入れておくことで、間違えて別のワークシートを選ぶことを防いでくれます。

特に複数のエクセルファイルを開いているときは、「Thisworkbook」がないと間違えてしまう可能性があります。

「Thisworkbook」とは、VBAが書かれているファイル(つまり自分のこと)のことを指しています。

セットした変数を使って、検索したいフォルダをシートのセルから取得します。

シートに残っているファイル名を削除する

    Dim i As Long
    i = 6
    
    '残っているファイル名を削除する
    ws.Cells(i, 1).Resize(10, 1).Value = ""

 

始めてマクロを実行するときは検索結果のところは空白ですが、何度か実行しているとファイル名が残ってしまう場合があります。

そのため、検索結果をセルに入力する前に、今あるものを一度削除しておきます。

今回は6行目から10行分の処理ということにしましたが、10行以上ある場合は、最終行を取得してResizeの行数部分を変更してあげます。

指定したフォルダからファイル名を取得する

    '指定したフォルダの中にある拡張子が「csv」のファイル名を取得する
    Dim buf As String
    buf = Dir(folderPath & "\*.csv")
            
    'フォルダ内のファイル数がなくなるまで繰り返す
    Do While buf <> ""
        ws.Cells(i, 1).Value = folderPath & buf
        i = i + 1
        buf = Dir()
    Loop

 

ここからの処理は前回の実践編1-2と同じです。

入力する行数は、6行目からなので変数「i」には6をセットしています。

まとめ

今回はボタンを使ってマクロを実行する方法を紹介しました。

ボタンは1つだけではなく、複数設置することができ、ボタンごとにマクロを登録できるので、いろいろな処理を行うことができます。

例えば、前回の検索結果を削除する処理だけを別のマクロとして登録したり、フォルダを入力ではなくダイアログから選択できるようにしたり、といったこともできます。

簡単に設置できるので、練習をかねて試してみてください。