VBA Dir関数 vs FileSystemObject(FSO) 比較

どちらを利用したら良いか?

NoやりたいことDir関数(標準VBA)例FSO(参照設定要)例備考
1ファイルの存在確認If Dir(path) <> "" ThenIf fso.FileExists(path) ThenDirはvbNormalでもOK
2フォルダの存在確認If Dir(path, vbDirectory) <> "" ThenIf fso.FolderExists(path) ThenDirは属性必須
3隠しファイル/隠しフォルダも対象Dir(path, vbHidden Or vbDirectory)If fso.GetFolder(path).Attributes And 2 ThenFSOは属性チェック必要
4拡張子を指定してファイル一覧取得f = Dir("*.xlsx")Do While f <> ""For Each f in fso.GetFolder(...).Files → 拡張子判定Dirはワイルドカード可
5フォルダ一覧取得(サブフォルダ含)If (GetAttr(path) And vbDirectory) <> 0 Then + DirFor Each fld in fso.GetFolder(...).SubFoldersFSOの方が自然
6ファイルサイズ取得❌できないfso.GetFile(path).SizeFSO限定機能
7作成日時・更新日時取得❌できないfso.GetFile(path).DateCreatedFSO限定機能
8ファイル削除If Dir(path) <> "" Then Kill pathfso.DeleteFile path両対応(Dirは簡単)
9フォルダ削除RmDir path(空のみ)fso.DeleteFolder path, TrueFSOは中身ごと削除OK
10ファイルコピー❌(APIかVBA関数要)fso.CopyFile src, destFSOが楽
11フォルダコピー❌(APIか手動)fso.CopyFolder src, destFSOが楽
12フォルダ作成MkDir pathfso.CreateFolder(path)Dirの方が簡単
13空フォルダか確認❌難しいIf fso.GetFolder(path).Files.Count = 0FSO限定機能
14フォルダ再帰走査Dir + 再帰手動ループ必要For Each sub In folder.SubFolders で簡単FSO推奨
15参照設定不要で使える✅可能❌「Microsoft Scripting Runtime」が必要Dir有利
16属性で条件分岐(読み取り専用など)GetAttr(path) And vbReadOnlyfso.GetFile(path).Attributes And 1両対応(FSOの方が直感的)

結論:どっちを使うべき?

パターン推奨手段
軽量・一時的なチェック Dir関数
拡張子つき一覧をとりたい Dir関数
再帰処理・属性アクセスが必要 FSO
ファイル操作全般(削除/コピー) FSO
参照設定なし・可搬性が大事 Dir関数

Dir関数の方が便利な場面・小ネタ集

ファイル or フォルダの存在確認が1行で済む!

If Dir("C:\test\sample.xlsx", vbNormal) <> "" Then MsgBox "ファイルあり!"
If Dir("C:\test", vbDirectory) <> "" Then MsgBox "フォルダあり!"

→ FSOだと4~5行+参照設定が必要。

特定拡張子のファイル一覧をループで取得

Dim fileName As String
fileName = Dir("C:\Data\*.csv")

Do While fileName <> ""
    Debug.Print fileName
    fileName = Dir() ' 次のファイルへ
Loop

→ FSOだとフォルダ→Filesコレクション取得→拡張子判定が必要。
Dirフィルタ付き検索が可能!

属性指定で隠しフォルダやシステムファイルも扱える

If Dir("C:\Secret", vbDirectory Or vbHidden) <> "" Then
    MsgBox "隠しフォルダあり"
End If

→ FSOでは属性を直接指定できないので、ループして .Attributes を見る必要がある。

テンポラリなチェック用途に最適

If Dir(tempPath, vbNormal) = "" Then
    MkDir tempPath ' なければ作る
End If

→ 存在チェックから作成まで流れが自然に書ける!

一時的なチェックでFSO生成せずに済む!

If Dir(path) <> "" Then Kill path

Dir は何も参照設定しなくても KillMkDir などと即連携可

FileSystemObject(FSO)を使った方が便利なケース集

VBAでは Dir関数 でも基本的なファイルやフォルダの操作はできる。
でも、「もう少し柔軟に」「もう少し正確に」ファイル操作したい場面になると、
FileSystemObject(FSO) の方が圧倒的に便利になることがあるよ

ファイルやフォルダの詳細情報(属性)を取得したい

  • 作成日時(DateCreated)
  • 最終更新日時(DateLastModified)
  • 最終アクセス日時(DateLastAccessed)
  • サイズ(Size)
  • 読み取り専用・隠しファイルなどの属性(Attributes)

→ Dir関数 では取得できない。
→ ログ出力・監査・更新チェックなどに便利!

拡張子やファイル名・フォルダ名を簡単に分離したい

fso.GetFileName(path)         ' ファイル名のみ取得
fso.GetExtensionName(path)    ' 拡張子のみ取得
fso.GetParentFolderName(path) ' 親フォルダパス取得

文字列操作(Left, Right, InStr…)を駆使する必要なし!

再帰的にフォルダ構造を調べたいとき(サブフォルダ走査)

For Each subFolder In folder.SubFolders
    ' 中のファイルやサブフォルダをさらにチェック
Next

Dir関数 ではループと再帰の組み合わせが面倒。
→ FSOなら SubFolders で簡潔に走査できる!

フォルダが空かどうかを調べたいとき

If folder.Files.Count = 0 And folder.SubFolders.Count = 0 Then
    MsgBox "空のフォルダです"
End If

Dir関数 では一つ一つ調べる必要がある。
→ FSOなら .Files.Count で即判定。

ファイルやフォルダのコピー・削除・移動をしたいとき

fso.CopyFile src, dest
fso.DeleteFile path
fso.MoveFolder srcFolder, destFolder

Dir関数 では対応不可。APIやShellを呼ぶ必要あり。

ファイル一覧の中から属性でフィルタしたいとき

If file.Attributes And 1 Then ' 読み取り専用か?
If file.Attributes And 2 Then ' 隠しファイルか?

→ フィルタ処理や分類処理にとても役立つ。

エラーハンドリングをきちんとしたいとき

FSOは「存在しなければNothingを返す or Falseを返す」設計で、
Dir関数よりもTry構造に近い書き方ができる。

注意点(デメリット)

デメリット

デメリット内容
事前バインディング(参照設定)
または
遅延バインディング(実行時バインディング)
が必要
事前バインディング(参照設定):
[ツール] → [参照設定] → “Microsoft Scripting Runtime” にチェック
遅延バインディング:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
若干コードが長くなるオブジェクト生成 → メソッド呼び出し
少し重い処理になるDirよりも処理コストはやや大きい

参照設定あり:補完・型チェックが使える
遅延バインディング:補完なし。参照設定不要で移植性が高い

オススメの使い方

  • 軽量な一時チェックやダイアログ補助に Dir関数
  • 本格的なファイル処理・管理には FSO

コメント