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

実行結果を貼り付けておきます!

あ、プロパティ使い忘れた!

FileSystemObject について 3
実行結果

・注意点

  • コメントは付けましょう!w
  • プロパティもお忘れなく!
  • DriveNameとフォルダ名をBuildPathしても「¥」を付けてくれない
  • 開いたファイルはTextStreamオブジェクトで読み書きします
  • GetFileはFileオブジェクトで操作します
  • GetFolderはFolderオブジェクトで操作します

・その他

サンプルのコメントは後日付けますw

各メソッドのリファレンスも付けておきたいところですが、それはおいおいで!

今日は眠いので、この辺にしておきます

ではでは

広告

やもす ʕ•͡-•ʔ

のんびり!のほほん!がモットーです!w 蕎麦食いたい ライブ行きたい 暑いの嫌い

シェアする