業務改善

ファイル情報をエクセルシートに書き出す方法

タイトル画像

何かをするたびに作成する「ファイル」

目的ごとに細かく分けることができるので、とても便利です。

そんなファイルですが、しばらくすると「フォルダの中がファイルでいっぱい」になってしまうことも。

今回は、フォルダの中のファイル名を一覧で取得するVBAを紹介します。

マネするだけで再現できるので、気になった方は参考にしてみてください。

ファイル一覧を書き出す方法

エクセルVBAのワザを使うと、フォルダの中のファイル一覧を書き出すことができます。

使用するエクセルVBAのワザはこれだけです。

使用するVBAワザ

  • FileSystemObject


実際にプログラムを作るには、こちらの知識があると便利です。
(実用的にプログラムを作成の際に知っておくと便利です)

あると便利な知識

  • 変数の宣言
  • If文
  • For Each文
  • Application.FileDialog


プログラムはこちら

さっそくプログラムを紹介します。

行うこと

プログラムではこのようなことをやっています。

  • 1.フォルダを選択
  • 2.選んだフォルダの中のファイル名を取得
  • 3.シート1のA列にファイル名を書き出し

Sub ファイル名取得1()
    Dim folderName As String 'ダイアログで選択したフォルダのパスを格納する
    
   
    
    'フォルダ選択ダイアログで【キャンセル】ボタンをクリックした場合の処理
    ' →何も処理をしないでプログラムを終了する。

    If Application.FileDialog(msoFileDialogFolderPicker).Show = "0" Then
        MsgBox "プログラムおしまい"
        Exit Sub
    End If
    


    'フォルダを選択した場合の処理
    
    'フォルダのフルパスを取得して、変数【filderName】にパスを格納する。
    folderName = Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1)
    
    
    '変数を定義する。
    Dim fs As Object, fileList As Variant
    Dim i As Long: i = 1 'フォルダ数を格納する変数iを宣言する。
    
    'FyleSystemObjectを使用する。
    Set fs = New Scripting.FileSystemObject
    

        For Each fileList In fs.GetFolder(folderName).Files
        
        ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fileList.Name
        ' ******************************************************
        
            '次のファイルに移動する。
            i = i + 1
        Next
    
    '使い終わったらFileSystemObjectを終了する。
    Set fs = Nothing
    
End Sub



プログラムの内容を解説

先ほど紹介したプログラムでやっていることを紹介していきます。

フォルダパスの取得

最初にやっているのは「フォルダパスを格納するための変数の宣言」「フォルダパスを取得」です。
図で説明するとこのようなイメージです。

フォルダパスを取得

最初に【folderName】という変数を作成します(フォルダパスが入るように文字列が入るように指定しています)
※変数名は好きな名前でOKです。分かりやすい名前にすると、後でプログラムを見直す時にラクです。


次にフォルダパスを取得します。

フォルダパスはApplication.FileDialogプロパティを使用します。
(名前の通り、ファイルを選択するダイアログを使用するものです)

先ほどのイメージ画像と同じ「フォルダを選択するダイアログ」が表示されます。


ダイアログでフォルダを指定すると、フォルダパスの取得ができます。


ここでは、取得したフォルダパスを【folderName】変数に格納していきます。

注意ポイント

フォルダパスを取得するダイアログ画面は「キャンセルボタン」を押すとエラーが発生してしまいます。

エクセルVBAを使っている方は問題ないですが、プログラムを使う人からすると「変な画面が出てきた・・」と焦ってしまいます。

そうならないために今回のプログラムでは「キャンセルボタン」が押された時の処理をIf文で追加しています。

やっていることはこちらです。

  1. キャンセルボタンをクリック
  2. 「プログラムおしまい」というメッセージを表示
  3. プログラムを終了

ちょっとしたことですが、If文を使って「プログラムを使う人の動作を予想して先回り」すると使いやすいプログラムができると思います。


ファイル情報を取得

フォルダパスの取得ができたら、「フォルダの中に入っているファイルの情報」を取得していきます。


プログラムのイメージはこちらです。

ファイル情報を取得する

ここで、ファイルの数を入れる変数「fileNum」と取得したファイルの情報を入れる変数「fileList」を作成します。

次に、取得したフォルダパスに対して処理を行うための「FileSystemObject」を使用します。


今回は、FileSystemObjectを使ってデータを取得します。

取得するデータ

  • ファイルの情報

FileSystemObjectは、ファイルに関数たくさんの情報を取得できます。
まとまったファイル情報を取得しておけば、その後に書き出すデータを選べるようになります。


ファイル名を書き出す

ファイルの情報を取得できたら、あとはエクセルシートに書き出すだけです。

プログラムのイメージはこちらです。

ファイル名を書き出す

ファイル名を書き出すために使用する変数「i」を作成します。

変数iは数字を入れるだけです。


変数iの目的

変数iの目的は

  • 取得したデータを書き出すセルの行番号をずらすため

です。

fileSystemObjectで取得したファイル情報をFor Eachで繰り返し処理をしていくのですが、何も指定をしないまま処理をしてしまうと同じセル(今回のプログラムでいうとA1セル)にデータを書き出してしまいます。

全ファイルの情報を同じセルに書き出していった結果、最後のファイル情報だけがA1セルに表示されるだけになってしまいます。

そうならないために、変数iを作成して「データの書き出し先のセル座標」をずらしています。

ちなみに変数名のiはなんでも問題ありません。


ファイル一覧を書き出す処理が役立つ場面

ファイル一覧を書き出す処理が役立つ場面はこのような場合です。


役立つ場面

  • フォルダ内のファイル名を書き出してほしいと頼まれたとき


かなりレアケースですが、もしこのような依頼で時間を取られてしまっている方がいらっしゃったなら・・・かなりの時短になりそうです。


フォルダの中のファイル名を書き出したいとき

もし「フォルダの中のファイル名を書き出してほしい」という依頼があった場合は、手作業でもできてしまうかもしれません。

その場合に具体的にやることは・・・

チェックリスト

  • フォルダを開く
  • エクセルファイルを開く(フォルダ名を記録するもの)
  • フォルダの中のファイルを見ながら、エクセルにファイル名を入力してい

かなりめんどうですが、手作業で十分対応できそうな作業です。


ですが「フォルダの中のファイル数が膨大な場合」「ファイル名を書き出す作業を行う頻度が多い(毎日など)」時間をどんどん取られてしまいます。


また、手作業だと「入力ミス」「ファイルのチェック漏れ」も発生してしまいます。
(ミスが見つかると、入力内容の確認作業・・・のようにさらに時間がかかってしまいます)

【発展】書きだすデータを変えるには

最初に紹介したプログラムは、エクセルシートにファイル名を書き出す処理を行いました。

ですが、中には「ファイル名以外の情報を書き出さないといけない・・」という方もいらっしゃるかもしれません。

やることは、最初に紹介したプログラムの「データ書き出し」のコードを書き換えるだけです。

        ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fileList.Name
        ' ******************************************************

ファイル作成日時を取得

ファイル作成日時を書きだしたい場合はDateCreatedを使用します。

DateCreatedを使えば、ファイルを作成した日時(年月日だけでなく時間まで取得)を取得できます。


やることは「データ書き出し」のコードを書き換えるだけです。

     ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fileList.DateCreated
        ' ******************************************************


最終更新日時を取得

ファイルの最終更新日時を書きだしたい場合はDateLastModifieを使用します。


データ書き出し部分のコードを書き換えるだけです。

     ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fileList.DateLastModified
        ' ******************************************************


ファイルサイズを取得

ファイルのサイズを書き出したい場合はSizeを使用します。

取得するファイルサイズは「バイト(単位)」です。


データ書き出し部分のコードを書き換えるだけです。

     ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fileList.Size
        ' ******************************************************


ファイル名(拡張子なし)を取得

最初に紹介したプログラムはファイル名(拡張子あり)を取得するものでした。


中には「拡張子なしのファイル名」を書き出したいという方もいらっしゃるかもしれません。


やることは、データ書き出し部分のコードを書き換えるだけです。

     ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fs.GetBaseName(fileList)
        ' ******************************************************

ファイルの拡張子だけを取得

ファイル名ではなく「ファイルの拡張子」だけ取得したい場合は「プログラムのデータ書き出し部分」を書き換えます。

     ' *****データ書き出し************************************
        Sheet1.Range("C" & i) = fs.GetExtensionName(fileList)
        ' ******************************************************


ドライブ名を取得

今回紹介したプログラムでは、既にどのフォルダで処理を行うか指定しているので、あまり必要ないかもしれませんが・・・ドライブ名を取得することもできます。

     ' *****データ書き出し************************************
        Sheet1.Range("D" & i) = fs.GetDriveName(fileList)
        ' ******************************************************


親ファイルのパスを取得

(こちらもフォルダ指定している場合にはあまり意味がありませんが)親ファイルのパスを取得することもできます。

     ' *****データ書き出し************************************
        Sheet1.Range("E" & i) = fileList.ParentFolder
        ' ******************************************************

複数の情報を取得

最初に紹介したプログラムでは、ファイル名(拡張子あり)のデータをA列に書き出すものでした。


複数の情報を書き出したい場合についても紹介したいと思います。

やることは、別の列(B列、C列など)を使って処理を書いていくだけです。


     ' *****データ書き出し************************************
        Sheet1.Range("A" & i) = fs.GetBaseName(fileList)
        Sheet1.Range("B" & i) = fileList.Name
        ' ******************************************************

A列には拡張子なしのファイル名、B列には拡張子ありのファイル名をそれぞれ書き出すことができます。

先ほど紹介した、ファイル情報をそれぞれの列に書き出すだけでもデータベースのようになります。


あとがき

今回は、指定したフォルダの中のファイル情報をエクセルシートに書き出すプログラムを紹介しました。

使用機会はかなり限られてしまいそうですが、「ちょうど、この作業で時間を取られている・・」という方がいらっしゃったなら役に立つ情報かもしれません。

ファイル情報を一括取得する方法が分かるとプログラムの幅が広がりますので、実用的なプログラム作成にもつながるかな、と思います。

気になった方は試してみてください。

-業務改善
-, ,