Excelマクロを使用して、ファイル操作を行うこともあるでしょう!
ファイルを開くときには、ファイルが存在しているかを確認しておかないと、新規作成されてしまったり、エラーになったりしてしまいます
ファイルの存在チェックと聞いて思い出すのは、Dir関数という人も多いですが、ファイルパスが長くなると、Dir関数では扱えないので、汎用性の高いFileSystemObjectについてもう少し調べておきたいと思います
■FileSystemObjectオブジェクト
Objectオブジェクトって妙ですがw
フォルダやファイルの存在確認・作成・コピー・削除したり、テキストファイルを新規作成やオープンして、そのTextStreamオブジェクトを取得することができます
・構文
構文は以下の通りです
Scripting.FileSystemObject
以下の「Excel VBAの参照設定」でも少し触れましたが、FileSystemObjectは、Scriptingライブラリの持ち物です!w
・メソッド
オブジェクトのメソッドは以下の通りです
- BuildPath … パスにフォルダやファイル名を追加
- CopyFile … 1 つ以上のファイルをコピー
- CopyFolder … 1 つ以上のフォルダをコピー
- CreateFolder … 新しいフォルダを作成
- CreateTextFile … 新規に作成したテキストファイルのTextStream オブジェクトを取得
- DeleteFile … 1 つ以上のファイルを削除
- DeleteFolder … 1 つ以上のフォルダを削除
- DriveExists … ドライブが存在するかどうか
- FileExists … ファイルが存在するかどうか
- FolderExists … フォルダーが存在するかどうか
- GetAbsolutePathName … フルパスを取得
- GetBaseName … ファイルまたはフォルダのベース名を取得
- GetDrive … パスのドライブオブジェクトを取得
- GetDriveName … パスのドライブ名を取得
- GetExtensionName … ファイル拡張子を取得
- GetFile … パスのファイル オブジェクトを取得
- GetFileName … パスのファイル名またはフォルダ名を取得
- GetFileVersion … ファイルのファイルバージョンを取得
- GetFolder … パスのフォルダー オブジェクトを取得
- GetParentFolderName … パスの親フォルダ名を取得
- GetSpecialFolder … Windows の特殊フォルダのパスを取得
- GetStandardStream … 標準入出力のStreamを取得
- GetTempName … 一時ファイルまたはフォルダを取得
- MoveFile … 1 つ以上のファイルを移動
- MoveFolder … 1 つ以上のフォルダを移動
- OpenTextFile … 開いたファイルのTextStreamオブジェクトを取得
珍しく、全部のメソッドを書いてみました!w
それだけ重要?使える!という印象です
サイトに寄っては、FileオブジェクトやTextStreamオブジェクトのメソッドとごちゃ混ぜになっているところもありますが、これが正解です!(知らんけどw)
・プロパティ
オブジェクトのプロパティは以下の通りです
- Drives … ドライブのコレクションを取得
全てのプロパティを・・・って、1つしかないですけどねw
■例
・簡単なサンプル
Sub FileSystemObject_Sample()
Dim obj As FileSystemObject
Dim oTxt As TextStream
Dim oDrv As Drive
Dim path As String
Dim path1 As String
Dim path2 As String
Dim path3 As String
Dim prnt As String
Dim file1 As String
Dim file2 As String
Dim file3 As String
Const STR_DRIVE_NAME As String = "E:"
Set obj = New FileSystemObject
With obj
' ドライブは存在するか
If (.DriveExists(STR_DRIVE_NAME) = True) Then
Debug.Print "DriveExists(STR_DRIVE_NAME) = True"
' ドライブ名を取得
Set oDrv = .GetDrive(STR_DRIVE_NAME)
Debug.Print "GetDrive(STR_DRIVE_NAME) : " & oDrv.path
' パスを作成する(ドライブ名に「VBA」フォルダを結合している)
path = .BuildPath(oDrv.path, "VBA")
Debug.Print "BuildPath : " & path
' フォルダが存在しない場合
If (.FolderExists(path) = False) Then
Debug.Print "FolderExists(path) = False"
' フォルダを作成
Call .CreateFolder(path)
End If
' 「VBA」フォルダのパスに「Sample001」を結合
path1 = .BuildPath(path, "Sample001")
Debug.Print "BuildPath : " & path1
' 「Sample001」のパスが存在しない場合
If (.FolderExists(path1) = False) Then
Debug.Print "FolderExists(path1) = False"
' フォルダを作成
Call .CreateFolder(path1)
End If
' 「VBA」フォルダのパスに「Sample002」を結合
path2 = .BuildPath(path, "Sample002")
Debug.Print "BuildPath : " & path2
' 「Sample002」のパスが存在しない場合
If (.FolderExists(path2) = False) Then
Debug.Print "FolderExists(path2) = False"
' 「Sample001」フォルダを「Sample002」フォルダにコピー
Call .CopyFolder(path1, path2)
End If
' 「VBA」フォルダのパスに「Sample003」を結合
path3 = .BuildPath(path, "Sample003")
Debug.Print "BuildPath : " & path3
' 「Sample003」のパスが存在しない場合
If (.FolderExists(path3) = False) Then
Debug.Print "FolderExists(path3) = False"
' 「Sample001」フォルダを「Sample002」フォルダに移動
Call .MoveFolder(path2, path3)
End If
' 「Sample003」のパスの親階層を取得
prnt = .GetParentFolderName(path3)
Debug.Print "ParentFolderName : " & prnt
' 「Sample003」のパスが存在する場合
If (.FolderExists(path3) = True) Then
' フォルダを削除
Call .DeleteFolder(path3)
End If
' ドライブ名を取得
Debug.Print "DriveName : " & .GetDriveName(prnt)
' フォルダオブジェクトを取得
Debug.Print "Folder : " & .GetFolder(prnt)
' 「Sample001」フォルダのパスに「Sample1.txt」を結合
file1 = .BuildPath(path1, "Sample1.txt")
Debug.Print file1
' 「Sample1.txt」が存在する場合
If (.FileExists(file1) = True) Then
Debug.Print "FileExists(file1) = True"
' OpenTextFileメソッドでファイルを開く
Set oTxt = .OpenTextFile(file1)
Else
' 存在しない場合
Debug.Print "FileExists(file1) = False"
' CreateTextFileメソッドでファイルを作成
Set oTxt = .CreateTextFile(file1)
End If
' 「Sample1.txt」のフルパスを取得
Debug.Print "AbsolutePathName : " & .GetAbsolutePathName(file1)
' 「Sample1.txt」のベース名を取得
Debug.Print "BaseName : " & .GetBaseName(file1)
' 「Sample1.txt」の拡張子を取得
Debug.Print "ExtensionName : " & .GetExtensionName(file1)
' 「Sample1.txt」のFileオブジェクトを取得
Debug.Print "File : " & .GetFile(file1)
' 「Sample1.txt」のファイル名を取得
Debug.Print "FileName : " & .GetFileName(file1)
' 「Sample1.txt」のファイルバージョンを取得
Debug.Print "FileVersion : " & .GetFileVersion(file1)
' 「Sample001」フォルダのパスに「Sample2.txt」を結合
file2 = .BuildPath(path1, "Sample2.txt")
Debug.Print "file2 : " & file2
' 「Sample2.txt」が存在しない場合
If (.FileExists(file2) = False) Then
' 「Sample1.txt」を「Sample2.txt」にコピー
Call .CopyFile(file1, file2, True)
End If
' 「Sample001」フォルダのパスに「Sample3.txt」を結合
file3 = .BuildPath(path1, "Sample3.txt")
Debug.Print "file3 : " & file3
' 「Sample3.txt」が存在しない場合
If (.FileExists(file3) = False) Then
Debug.Print "FileExists(file3) = False"
' 「Sample2.txt」を「Sample3.txt」に移動
Call .MoveFile(file2, file3)
End If
' 「Sample3.txt」が存在する場合
If (.FileExists(file3) = True) Then
Debug.Print "FileExists(file3) = True"
' 「Sample3.txt」を削除
Call .DeleteFile(file3)
End If
' 特殊フォルダ(Windows オペレーティング システム)のパスを取得
Debug.Print "WindowsFolder : " & .GetSpecialFolder(WindowsFolder)
' 特殊フォルダ(System フォルダ)のパスを取得
Debug.Print "SystemFolder : " & .GetSpecialFolder(SystemFolder).csv
' 特殊フォルダ(一時ファイルの格納に使用される Temp フォルダ)のパスを取得
Debug.Print "TemporaryFolder : " & .GetSpecialFolder(TemporaryFolder)
' 一時ファイルを取得
Debug.Print "TempName : " & .GetTempName()
Set oDrv = Nothing
Set oTxt = Nothing
End If
End With
Set obj = Nothing
End Sub
・説明
メソッドをふんだんに使ってみましたw
その結果、何が何だかわからなくなりましたw
実行結果を貼り付けておきます!
あ、プロパティ使い忘れた!

・注意点
- コメントは付けましょう!w
- プロパティもお忘れなく!
- DriveNameとフォルダ名をBuildPathしても「¥」を付けてくれない
- 開いたファイルはTextStreamオブジェクトで読み書きします
- GetFileはFileオブジェクトで操作します
- GetFolderはFolderオブジェクトで操作します
・その他
サンプルのコメントは後日付けますw
各メソッドのリファレンスも付けておきたいところですが、それはおいおいで!
今日は眠いので、この辺にしておきます
ではでは
のんびり!のほほん!がモットーです!w
蕎麦食いたい ライブ行きたい 暑いの嫌い