0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Excel VBA】Dir関数|ファイルやフォルダの存在確認・取得方法と注意点

0
Last updated at Posted at 2025-08-06

この記事ではDir関数の使い方と注意点について解説します。
他のよく使うVBA関数一覧はこちら。

Dir関数の使い方と注意点

Dir関数は、ファイルやフォルダの存在確認や一覧取得を行うための関数です。
指定パスにファイルが存在するかどうかをチェックしたり、複数ファイルを順に取得する際によく使われます。

Dir関数は状態を内部的に保持する特殊な関数です。
使い方を誤ると、想定と異なるファイルを取得したり、取得が途中で止まったりすることがあります。
特に複数フォルダを扱うときは注意が必要です。

構文

Dir[(パス[, ファイル属性])]
  • パス : ファイル名またはパターン(ワイルドカード * や ? を含むことが可能)
  • ファイル属性 : ファイル属性の組み合わせを表す定数(vbDirectory, vbHidden など)。省略可能。
  • 戻り値 : 条件に一致するファイル名またはフォルダ名、それ以外は""

ファイル属性を表す定数

定数 説明
vbNormal 0 通常のファイル(デフォルト)。
vbReadOnly 1 読み取り専用ファイル。
vbHidden 2 隠しファイルや隠しフォルダ。
vbSystem 4 システムファイルやシステムフォルダ。
Macintoshでは使用できません。
vbVolume 8 ボリュームラベル。Macintoshでは使用できません。
vbDirectory 16 フォルダを対象とする(ファイルではなくディレクトリ)。
vbAlias 64 エイリアスファイル。Macintoshでのみ使用できます。

使用例

ファイルの存在確認

Sub Sample()
    If Dir("C:\Temp\sample.txt") <> "" Then
        Debug.Print "ファイルは存在します"
    Else
        Debug.Print "ファイルは存在しません"
    End If
End Sub

▶ 出力結果(ファイルが存在する場合)

ファイルは存在します

特定フォルダ内のファイル一覧を取得

Sub ExportFileListToExcel()
    Dim folderPath As String
    Dim fileName As String
    Dim row As Long

    ' 対象フォルダのパス(最後にバックスラッシュを忘れずに)
    folderPath = "C:\Temp\"
    
    ' 最初のファイルを取得
    fileName = Dir(folderPath & "*.*")
    
    row = 1
    Do While fileName <> ""
        Cells(row, 1).Value = fileName               ' ファイル名
        Cells(row, 2).Value = folderPath & fileName  ' フルパス
        row = row + 1
        fileName = Dir()                             ' 次のファイル
    Loop
End Sub

▶ 出力結果

sample02.png

最初のDir()呼び出しではパスを指定し、2回目以降は引数なしで呼び出す必要があります。
これはDir関数が内部状態を保持して次のファイルを返す仕組みのためです。

隠しファイルやフォルダを含める

Sub Sample()
    Dim fname As String
    fname = Dir("C:\Temp\*", vbHidden Or vbSystem)

    Do While fname <> ""
        Debug.Print fname
        fname = Dir()
    Loop
End Sub

▶ 出力結果(隠しファイル「hidden_sample.txt」)

hidden_sample.txt
sample_01.txt
sample_02.txt
sample_03.txt

Dir("パス", 属性) の属性指定は厳密なフィルタではありません
指定した属性(例:vbHidden)に一致するファイルを1件でも取得すると、
その後の Dir()通常ファイル(vbNormal)まで取得される挙動があります。
属性で厳密に制御したい場合は、FileSystemObject を使って .Attributes を明示的に判定する方法をおすすめします。

⚠️注意

複数回使用するときは状態保持に注意

Dirは状態を共有しているため、別のDir呼び出しで状態が上書きされます。

Sub Sample()
    Dim TextFiles As String, LogFiles As String
    TextFiles = Dir("C:\Temp\*.txt")     ' ← 状態1
    LogFiles = Dir("C:\Logs\*.log")     ' ← 状態2で上書き
    
    Debug.Print "TextFile : " & TextFiles
    Debug.Print "LogFile : " & LogFiles
    Debug.Print "NextFile : " & Dir() ' ← 状態2の続きが出力される
End Sub

▶ 出力結果([C:\Temp]内に複数のtxtファイル、[C:\Logs]内に複数のlogファイル)

TextFile : sample01.txt
LogFile : sample.log
NextFile : sample02.log

複数のディレクトリや拡張子を扱いたい場合は、ループを完全に終えてから次のDirを使うようにしましょう。

Dir "" を実行することで、Dir関数の状態を明示的にリセットできます。
これにより、次の Dir() は空文字を返すようになります。

戻り値はファイル名のみ

Sub Sample()
    Dim fname As String
    fname = Dir("C:\Temp\sample.txt")
    Debug.Print fname
End Sub

▶ 出力結果

sample.txt

フルパスが必要な場合は、自分で結合します。

Sub Sample()
    Dim fullPath As String
    fullPath = "C:\Temp\" & Dir("C:\Temp\sample.txt")
    Debug.Print fullPath
End Sub

▶ 出力結果

C:\Temp\sample.txt

ファイルが存在しないと空文字が返る

Sub Sample()
    Dim result As String
    result = Dir("Z:\NotExist\file.txt")
    
    If result = "" Then
        Debug.Print "存在しません"
    End If
End Sub

▶ 出力結果

存在しません

その他のVBA関数

【Excel VBA】VBAでよく使う関数一覧&基本の使い方

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?