VBA
FileSystemObjectを使用せずにファイルとディレクトリを操作する
サーチ…
備考
Scripting.FileSystemObject
は、このトピックのレガシーメソッドよりはるかに堅牢です。ほとんどすべての場合に好ましいはずです。
フォルダとファイルが存在するかどうかの判断
ファイル:
ファイルが存在するかどうかを判断するには、ファイル名をDir$
関数に渡し、結果が返されるかどうかをテストします。ことに注意してくださいDir$
特定のファイルをテストするために、渡されたので、ワイルドカードをサポートしてpathName
、それは彼らが含まれていないことを確認するためにテストする必要があります。以下のサンプルはエラーを発生させます。これが望ましい動作でない場合、関数を変更して単にFalse
返すことができます。
Public Function FileExists(pathName As String) As Boolean
If InStr(1, pathName, "*") Or InStr(1, pathName, "?") Then
'Exit Function 'Return False on wild-cards.
Err.Raise 52 'Raise error on wild-cards.
End If
FileExists = Dir$(pathName) <> vbNullString
End Function
フォルダ(Dir $メソッド):
Dir$()
関数を使用して、オプションattributes
パラメーターに渡すvbDirectory
を指定して、フォルダーが存在するかどうかを判断することもできます。この場合、渡されたpathName
値はパスの区切り文字( \
)で終わらなければなりません。一致するファイル名は誤検出を引き起こすためです。ワイルドカードは最後のパス区切り文字の後にのみ使用できるので、入力にワイルドカードが含まれていると、下のサンプル関数はランタイムエラー52をスローします。これが目的の動作ではない場合は、機能の上部にある「 On Error Resume Next
コメントを外します。また、 Dir$
は相対ファイルパス(つまり..\Foo\Bar
)をサポートしているので、現在の作業ディレクトリが変更されていない限り、結果は有効であることが保証されます。
Public Function FolderExists(ByVal pathName As String) As Boolean
'Uncomment the "On Error" line if paths with wild-cards should return False
'instead of raising an error.
'On Error Resume Next
If pathName = vbNullString Or Right$(pathName, 1) <> "\" Then
Exit Function
End If
FolderExists = Dir$(pathName, vbDirectory) <> vbNullString
End Function
フォルダ(ChDirメソッド):
ChDir
ステートメントは、フォルダが存在するかどうかをテストするためにも使用できます。このメソッドはVBAが実行されている環境を一時的に変更するため、考慮する場合は代わりにDir$
メソッドを使用する必要があります。そのパラメータをあまり寛容にしないという利点があります。このメソッドは相対ファイルパスもサポートしているので、 Dir$
メソッドと同じ警告があります。
Public Function FolderExists(ByVal pathName As String) As Boolean
'Cache the current working directory
Dim cached As String
cached = CurDir$
On Error Resume Next
ChDir pathName
FolderExists = Err.Number = 0
On Error GoTo 0
'Change back to the cached working directory.
ChDir cached
End Function
ファイルフォルダの作成と削除
注:簡潔にするため、以下の例では、このトピックの「フォルダとファイルが存在するかどうかの判断」の FolderExists関数を使用しています。
MkDir
ステートメントを使用すると、新しいフォルダを作成できます。ドライブ文字( C:\Foo
)、UNC名( \\Server\Foo
)、相対パス( ..\Foo
)、または現在の作業ディレクトリ( Foo
)を含むパスを受け入れます。
ドライブまたはUNC名が省略された場合(つまり\Foo
)、現在のドライブにフォルダが作成されます。これは、現在の作業ディレクトリと同じドライブであっても、そうでなくてもかまいません。
Public Sub MakeNewDirectory(ByVal pathName As String)
'MkDir will fail if the directory already exists.
If FolderExists(pathName) Then Exit Sub
'This may still fail due to permissions, etc.
MkDir pathName
End Sub
RmDir
ステートメントを使用すると、既存のフォルダを削除できます。 MkDir
と同じ形式のパスを受け入れ、現在の作業ディレクトリとドライブと同じ関係を使用します。このステートメントはWindowsのrd
シェルコマンドと似ているので、実行時エラー75がスローされます。ターゲットディレクトリが空でない場合は、「パス/ファイルアクセスエラー」です。
Public Sub DeleteDirectory(ByVal pathName As String)
If Right$(pathName, 1) <> "\" Then
pathName = pathName & "\"
End If
'Rmdir will fail if the directory doesn't exist.
If Not FolderExists(pathName) Then Exit Sub
'Rmdir will fail if the directory contains files.
If Dir$(pathName & "*") <> vbNullString Then Exit Sub
'Rmdir will fail if the directory contains directories.
Dim subDir As String
subDir = Dir$(pathName & "*", vbDirectory)
Do
If subDir <> "." And subDir <> ".." Then Exit Sub
subDir = Dir$(, vbDirectory)
Loop While subDir <> vbNullString
'This may still fail due to permissions, etc.
RmDir pathName
End Sub