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