FileSystemObject について
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
各メソッドのリファレンスも付けておきたいところですが、それはおいおいで!
今日は眠いので、この辺にしておきます
ではでは