【VBA】同一フォルダ上にあるファイル名を取得する方法について
マクロ初心者が一日でも早くマクロを習得できるようにするため、役立つコンテンツを執筆しているFamillit編集部@マクロ班です。
今回は「同一フォルダ上にあるファイル名を取得する方法」をご紹介していきます。
これ単体で何か出来るという訳ではありませんが、例えば「同一フォルダに置かれたファイルを順番に開いていき、データの整合性をチェックする」ようなマクロを開発することが出来るため、この様な題材をテーマにしてみました。
1.全体のコード概要
早速コードからみていきましょう!
'************************************************************************************
' ◆機能
' 同一フォルダ上にあるファイル名を取得し、出力用のシートに自動でファイル名を書き込む関数。
'************************************************************************************
Sub Main()
' 変数宣言
Dim wbThis As Workbook ' このブック
Dim wsThis As Worksheet ' このブックに結果を出力するシート名
Dim myPath As String ' このブックのフォルダ
Dim stFileName As String ' 開くファイル名を一時的に格納する変数
Dim cnt As Integer ' カウント用変数
' 初期値の設定
Set wbThis = ThisWorkbook ' 変数にこのブックをセット
Set wsThis = wbThis.Worksheets("対象のシート名") ' 変数に結果を出力するシートをセット
cnt = 3 ' 3行目からスタート
' このブックのフォルダ名を変数に代入
myPath = wbThis.Path
' 一時格納用変数にこのブックと同じフォルダのファイル名を代入
stFileName = Dir(myPath & "\*")
' フォルダ内のファイルがある限りループ処理を実行
Do While stFileName <> ""
' データ入力
wsThis.Cells(cnt, 1) = cnt - 2 ' ナンバーを入力
wsThis.Cells(cnt, 2) = stFileName ' ファイル名を入力
DataCheck (stFileName) ' ファイルを開いた場合の処理に遷移
' 後処理
stFileName = Dir() ' 一時的ファイル名変数に次のファイル名を代入
cnt = cnt + 1 ' カウントアップする
Loop
End Sub
となります。皆さんが動かす際には、「対象のシート名」と書いた部分を実際に参照するシート名に合わせれば問題ありません。(DataCheck (stFileName)の部分は、「ファイルを開いて実際に値を持ってくる」をテーマにしようとした関数となりますので消してしまっても問題ありません。)
これを見て「あっ、これならすぐに使える!」という方はそのまま使っていただいて問題ありませんが、少しでも分からない部分があれば次の解説を読んでいきましょう!
2.コードの解説
今回のコードでポイントになるのが、次の4つになります。
- ブックからフォルダのパスを取得する
- フォルダにあるファイル名を取得する
- Do Whileのループ処理の使い方
- 順番にセルを移動して値を書き込む
2-1.ブックからフォルダのパスを取得する方法
該当箇所は以下になります。
myPath = wbThis.Path
今回は分かりやすさを重視するために敢えて変数にいれていますが、実際には以下のようなコードでも問題ありません。
ThisWorkbook.Path
フォルダのパスを取得するのは結構使うことが多いと思いますので、是非覚えておいていただければ幸いです!
2-2.フォルダにあるファイル名を取得する方法
該当箇所は以下になります。
stFileName = Dir(myPath & "\*")
多分、多く方が一番知りたかったところではないでしょうか?こちらはDir関数によって実装をしています。Dir関数は他にも使う機会が多い関数となりますので、簡単に使い方についても触れておきたいと思います。
Dir関数の構文
Dir[path][attributes]
Dir関数のpath
今回は同一フォルダにあるファイル名を取りたいので自身のパスを設定しましたが、実際には色々な場所のパスを指定することも可能です。
※省略可能
※注意しなければならない点として、別フォルダに置いてあるファイルなどを参照すると、いざファイルを移動してしまった場合などに修正する手間がかかるため、極力同一フォルダ内にファイルを入れるなど運用面を工夫するようにしましょう。
Dir関数のattributes
定数名 | 値 | 説明 |
vbNormal | 0 | 属性のないファイル。 省略した場合は、自動的にこの設定になります。 |
vbReadOnly | 1 | 属性のないファイルと読み取り専用のファイル。 |
vbHidden | 2 | 属性のないファイルと隠しファイル。 |
vbSystem | 4 | 属性のないファイルとシステム ファイル。 Macintosh では使用できません。 |
vbVolume | 8 | ボリューム ラベル 他の属性を指定した場合は、vbVolume は無視。 Macintosh では使用できません。 |
vbDirectory | 16 | 属性のないファイルとディレクトリまたはフォルダ。 |
vbAlias | 64 | 指定されたファイル名はエイリアス。 Macintosh でのみ使用可能。 |
※省略可能
※属性とは、「読み取り専用」「システムファイル」「ディレクトリ」「隠し属性」等のことです。
2-3.Do Whileループの使い方について
Do Whileループの書き方については次のようになります。
Do while 条件式
処理
Loop
Do Whileは条件式がTrueであれば、繰り返し処理を続けるループ文です。そのため、条件式が初めからFalseの場合は、ループ内の処理は1度も実行されずに、ループ外の次の処理に移行してしまいます。
だからこそ、以下のコードで事前にファイル名を入れておいてあげたという訳です。
stFileName = Dir(myPath & "\*")
ループ文はこれ以外にも多くありますので、少しずつでもいいから覚えていけるといいですね!
2-4.順番にセルを移動して値を書き込む
ループ時にカウントアップ用の変数に+1をし続けることで、順番にセルを移動しています。
cnt = cnt + 1 ' カウントアップする
こういった自動でカウントアップすることを、プログラムの世界では「インクリメント」というのが一般的になるため、今回はその言葉とやり方を覚えていただければと思います。
※他言語でインクリメントは「cnt+」や「cnt++」のように短縮した表現ができるものですが、残念ながらVBAではそういった記述は出来ませんでした。
3.まとめ
今回はゴールを決めているため、結構実践的なコードになっています。初めての頃はこういったコードをコピペして業務削減を出来れば十分だと思いますが、そのうち自分で色々書けるようになると便利な存在がマクロです。
それでは、次回は「ファイルを開いて実際の処理を行う」ようにしていきますのでお楽しみに!