ファイル VBAファイル・フォルダ・ドライブを使用のより詳しい使い方のヒント

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

VBAファイル・フォルダ・ドライブを使用のより詳しい使い方のヒント

  • 利用可能なオプション

    • VBA 関数
    • Microsoft Scripting Runtime オブジェクト ライブラリ
    • Office FileSearch オブジェクト
    • ファイル システム関連の Windows API 関数
    • この資料では、Windows API 関数についてだけは説明していません。
    • Windows API 関数について独自に調査する場合は、FindFirstFile、FindNextFile、および FindClose 関数を参照してください。
  • VBA 関数を使用した作業

  • 使用できる関数
  • 関数 説明
    Dir 指定したパターンまたはファイル属性に一致するファイル、ディレクトリ、またはフォルダの名前を返します。
    GetAttr ファイル、ディレクトリ、またはフォルダの属性を返します。
    SetAttr ファイル、ディレクトリ、またはフォルダの属性を指定します。
    CurDir カレント ディレクトリを返します。
    ChDir カレント ディレクトリを変更します。
    ChDrive 現在のドライブを変更します。
    MkDir 新しいディレクトリを作成します。
    RmDir 既存のディレクトリを削除します。
    Kill 1 つ以上のファイルを削除します。
    FileLen ディスク上のファイルの長さをバイト単位で返します。
    LOF 開いているファイルの長さをバイト単位で返します。
    FileCopy ディスク上のファイルをコピーします。
    FileDateTime ファイルが作成された、または最後に変更された日付と時刻を返します。
    Name ファイルの名前を変更し、ディスク上の別の場所に移動します。
    Open ディスク上のファイルを読み取り用または書き込み用に開きます。
    Input 開いているファイルから文字列を読み取ります。
    Print シーケンシャル ファイルにテキストを書き込みます。
    Write シーケンシャル ファイルにテキストを書き込みます。
    Close Open ステートメントを使用して開いたファイルを閉じます。
  • Dir 関数と GetAttr 関数について説明
  • ファイルが存在するかどうかを調べるために Dir 関数を使用する方法
  • Dir 関数は、 pathname 引数で指定したファイルの名前を返します。
  • 一般的には、Dir 関数を使用して、以下の DoesFileExist 関数で示すように、指定したファイルが存在するかどうかを調べます。
  • サンプルコード
  • Option Explicit

    Function DoesFileExist(strFileSpec As StringAs Boolean
        ' strFilespec 引数で指定されたファイルが存在する
        ' 場合は True を返します。
        ' strFileSpec が有効なファイルではない場合、または
        ' strFileSpec がディレクトリの場合は False を返します。
        Const INVALID_ARGUMENT As Long = 53
        On Error GoTo DoesfileExist_Err
        If (GetAttr(strFileSpec) And vbDirectory) <> vbDirectory Then
            DoesFileExist = CBool(Len(Dir(strFileSpec)) > 0)
        Else
            DoesFileExist = False
        End If
    DoesfileExist_End:
        Exit Function
    DoesfileExist_Err:
        DoesFileExist = False
        Resume DoesfileExist_End
    End Function
  • 説明
  • この例では、GetAttr 関数を使用して、 strFileSpec 引数の値がディレクトリでないことを確認しています。
  • これは、有効なディレクトリ名を Dir 関数に渡すと、関数がそのディレクトリで最初に見つけたファイルを返すためです。
  • フォルダ内のすべてのファイル名を取得するために Dir 関数を使用する方法
  • pathname 引数が、フォルダ内のファイル名ではなく、フォルダへのパスを含んでいる場合、Dir 関数はそのフォルダで最初に見つけたファイルの名前を返します。
  • その後、引数を指定しないで再度 Dir 関数を呼び出すと、フォルダ内でその後に見つけた各ファイルの名前を順次取得します。
  • たとえば、以下のプロシージャは、 strDirPath 引数で指定されたディレクトリ内のすべてのファイル名を保持する配列を返します。
  • サンプルコード
  • Option Explicit

    Function GetAllFilesInDir(ByVal strDirPath As StringAs Variant
        ' strDirPath で指定されたディレクトリをループしてすべて調べ、
        ' 配列に各ファイル名を保存します。その後、呼び出し側のプロ
        ' シージャにその配列を返します。
        ' strDirPath が有効なディレクトリではない場合は False を返します。
        Dim strTempName As String
        Dim varFiles() As Variant
        Dim lngFileCount As Long

        On Error GoTo GetAllFiles_Err

        ' strDirPath が "\" 文字で終わっていることを確認します。
        If Right$(strDirPath, 1) <> "\" Then
            strDirPath = strDirPath & "\"
        End If

        ' strDirPath がディレクトリであることを確認します。
        If (GetAttr(strFileSpec) And vbDirectory) = vbDirectory Then
            strTempName = Dir(strDirPath, vbDirectory)
            Do Until Len(strTempName) = 0
                ' "." と ".." を除外します。
                If (strTempName <> ".") And (strTempName <> "..") Then
                    ' サブディレクトリ名がないことを確認します。
                    If (GetAttr(strDirPath & strTempName) _
                        And vbDirectory) <> vbDirectory Then
                        ' 見つかったファイル名に応じて配列の
                        ' サイズを増加し、そのファイル名を配列
                        ' に追加します。
                        ReDim Preserve varFiles(lngFileCount)
                        varFiles(lngFileCount) = strTempName
                        lngFileCount = lngFileCount + 1
                    End If
                End If
                ' Dir 関数を使用して、次のファイル名を検索します。
                strTempName = Dir()
            Loop
            ' 見つかったファイルの配列を返します。
            GetAllFilesInDir = varFiles
        End If
    GetAllFiles_End:
        Exit Function
    GetAllFiles_Err:
        GetAllFilesInDir = False
        Resume GetAllFiles_End
    End Function
  • 説明
  • GetAllFilesInDir 関数は、ディレクトリ内の各項目をループして作業し、その項目がファイルの場合は、ファイル名を配列に追加します。
  • 最初に Dir を呼び出す場合は、引数にディレクトリ名を指定します。
  • その後の各呼び出しでは引数を指定しないで Dir を呼び出します。プロシージャは、GetAttr 関数を使用して、 strDirPath 引数が有効なディレクトリを保持しているか確認します。
  • また、配列にサブディレクトリ名が追加されるの防ぐためにも GetAttr 関数を使用しています。
  • さらに、プロシージャではカレント ディレクトリと親ディレクトリを表す "." と ".." も配列に追加しないようにしていることに注意してください。
  • 以下のプロシージャを使用して、
  • GetAllFilesInDir プロシージャをテストできます。
  • strDirName 引数に別の値を指定後、F8 キーを使用して、1 ステップずつコードを実行し、プロシージャがどのように機能しているかを確認できます。
  • サンプルコード
  • Option Explicit


    Sub TestGetAllFiles()
        Dim varFileArray As Variant
        Dim lngI As Long
        Dim strDirName As String

        Const NO_FILES_IN_DIR As Long = 9
        Const INVALID_DIR As Long = 13

        On Error GoTo Test_Err

        strDirName = "c:\my documents"
        varFileArray = GetAllFilesInDir(strDirName)
        For lngI = 0 To UBound(varFileArray)
            Debug.Print varFileArray(lngI)
        Next lngI

    Test_Err:
        Select Case Err.Number
            Case NO_FILES_IN_DIR
                MsgBox "The directory named '" & strDirName _
                    & "' contains no files."
            Case INVALID_DIR
                MsgBox "'" & strDirName & "' is not a valid directory."
            Case 0
            Case Else
                MsgBox "Error #" & Err.Number & " - " & Err.Description
        End Select
    End Sub
  • Microsoft Scripting Runtime オブジェクト ライブラリを使用した作業

  • Microsoft Scripting Runtime オブジェクト ライブラリは、Microsoft Office 2000 と共にインストールされ、ファイルやディレクトリを使った作業に使用できるオブジェクトを持っています。
  • ファイルやディレクトリにアクセスする場合、オブジェクト ライブラリは、上記で説明した VBA 関数よりも容易に使用できます。
  • オブジェクト ライブラリを使用する前に、このライブラリへの参照を設定する必要があります。
  • Microsoft Scripting Runtime が [プロジェクト] メニューの [参照設定] ダイアログ ボックスに表示されない場合は、Scrrun.dll というファイルを C:\Windows\System サブフォルダから検索する必要があります。
  • Scripting Runtime ライブラリに含まれるオブジェクトを説明
  • オブジェクト コレクション 説明
    Dictionary   トップ レベル オブジェクト。VBA Collection オブジェクトと同じものです。
    Drive Drives システム上のドライブまたはドライブのコレクションのことです。
    File Files ファイル システム内のファイルまたはファイルのコレクションのことです。
    FileSystemObject   トップ レベル オブジェクト。ファイル システム内のドライブ、フォルダ、およびファイルへのアクセスに使用します。
    Folder Folders ファイル システム内のフォルダまたはフォルダのコレクションのことです。
    TextStream   テキスト ファイルとの間で、読み取り、書き込み、または追加を行うテキストのストリームのことです。
  • 説明
  • Scripting Runtime オブジェクト ライブラリのトップ レベル オブジェクトは、Dictionary オブジェクトと FileSystemObject オブジェクトです。
  • Dictionary オブジェクトを使用するには、Dictionary 型のオブジェクト変数を作成します。
  • その後、Dictionary オブジェクトの新規インスタンスを設定します。
  • Option Explicit

    Dim dctDict As Scripting.Dictionary

    Set dctDict = New Scripting.Dictionary
  • コードでその他の Scripting Runtime ライブラリ オブジェクトを使用するには、以下のコード例で示すように、最初に FileSystemObject 型の変数を作成し、New キーワードを使用して、FileSystemObject の新規インスタンスを作成します。
  • Option Explicit

    Dim fsoSysObj As Scripting.FileSystemObject

    Set fsoSysObj = New Scripting.FileSystemObject
  • その後、FileSystemObject を参照する変数を使用して、Drive、Folder、File、および TextStream オブジェクトを使った作業が可能になります。
  • FileSystemObject を使用してファイルやフォルダで作業する方法

  • FileSystemObject の新規インスタンス作成後に、これを使用してファイル システム内のドライブ、フォルダ、およびファイルを使って作業できます。
  • 以下のプロシージャは、Dictionary オブジェクトに特定のフォルダ内のファイルを返します。
  • GetFiles プロシージャには 3 つの引数があります。
  • 最初の引数はディレクトリへのパス、2 番目の引数は Dictionary オブジェクトです。
  • 3 番目の引数は省略可能な Boolean 型の引数で、このプロシージャが再帰的に呼び出されるかどうかを指定します。
  • プロシージャは、プロシージャが正常終了したかどうかを示す Boolean 値を返します。
  • プロシージャは、最初に Folder オブジェクトを返す GetFolder メソッドを使用します。
  • その後、そのフォルダの Files コレクション全体をループして各ファイルのパスとファイル名を Dictionary オブジェクトに追加します。
  • blnRecursive 引数が True に設定されている場合は、GetFiles プロシージャは各サブフォルダ内のファイルを返すために再帰的に呼び出されます。
  • サンプルコード
  • Option Explicit


    Function GetFiles(strPath As String, _
                    dctDict As Scripting.Dictionary, _
                    Optional blnRecursive As BooleanAs Boolean

       ' このプロシージャは、ディレクトリ内のすべてのファイルを
       ' Dictionary オブジェクトに返します。再帰的に呼び出
       ' される場合は、サブフォルダ内のファイルもすべて返します。

       Dim fsoSysObj      As Scripting.FileSystemObject
       Dim fdrFolder      As Scripting.Folder
       Dim fdrSubFolder   As Scripting.Folder
       Dim filFile        As Scripting.File

       ' 新しい FileSystemObject を返します。
       Set fsoSysObj = New Scripting.FileSystemObject

       On Error Resume Next
       ' フォルダを取得します。
       Set fdrFolder = fsoSysObj.GetFolder(strPath)
       If Err <> 0 Then
          ' パスが間違っています。
          GetFiles = False
          GoTo GetFiles_End
       End If
       On Error GoTo 0

       ' Files コレクションをループし、Dictionary に追加します。
       For Each filFile In fdrFolder.Files
          dctDict.Add filFile.Path, filFile.Path
       Next filFile

       ' 再帰フラグが真の場合、再帰的に呼び出します。
       If blnRecursive Then
          For Each fdrSubFolder In fdrFolder.SubFolders
             GetFiles fdrSubFolder.Path, dctDict, True
          Next fdrSubFolder
       End If

       ' エラーが発生しなかった場合は、True を返します。
       GetFiles = True

    GetFiles_End:
       Exit Function
    End Function


  • 以下のプロシージャを使用して、
  • GetFiles プロシージャをテストできます。
  • このプロシージャは、新規 Dictionary オブジェクトを作成し、作成したオブジェクトを GetFiles プロシージャに渡します。
  • その後、strDirPath ディレクトリとそのサブディレクトリ内のすべてのファイルをイミディエイト ウィンドウに出力します。
  • サンプルコード
  • Option Explicit


    Sub TestGetFiles()
       ' GetFiles 関数をテストするために呼び出します。

       Dim dctDict As Scripting.Dictionary
       Dim varItem As Variant
       Dim strDirPath As String

       strDirPath = "c:\my documents\"
       ' 新規 Dictionary を作成します。
       Set dctDict = New Scripting.Dictionary
       ' 再帰的に呼び出し、Dictionary オブジェクトにファイルを返します。
       If GetFiles(strDirPath, dctDict, TrueThen
          ' Dictionary 内の項目を出力します。
          For Each varItem In dctDict
             Debug.Print varItem
          Next
       End If
    End Sub
  • 説明
  • strDirPath 引数に別の値を指定して、このプロシージャが別のディレクトリを使用してどのように機能するかを調べることができます。
  • FileSystemObject を使用し、ファイル属性を用いて作業する方法
  • 以下の例で示すように、File オブジェクトと Folder オブジェクトは、ファイルやフォルダの属性を設定または取得できる Attributes プロパティを提供します。
  • ChangeFileAttributes プロシージャには 4 つの引数があります。
    1. 最初の引数はフォルダへのパスです。
    2. 2 番目の引数は省略可能で、設定する属性を指定する定数です。
    3. 3 番目の引数も省略可能で、削除する属性を指定する定数です。
    4. 4 番目の引数も省略可能で、プロシージャが再帰的に呼び出されるかどうかを指定します。
  • 渡されたフォルダへのパスが有効な場合、プロシージャは Folder オブジェクトを返します。
  • 次に lngSetAttr 引数が指定されているかどうかを調べます。
  • 指定されている場合は、プロシージャはフォルダ内のすべてのファイルをループして、新しい属性を既存の属性に追加します。続いて、 lngRemoveAttr 引数に対しても同様の処理を行います。
  • ただし、この場合はコレクション内にファイルが存在するときに指定した属性を削除します。
  • 最後に、プロシージャは blnRecursive 引数が True に設定されているかどうかを調べます。
  • 設定されている場合は、 strPath 引数の各サブフォルダ内のファイルごとにプロシージャを呼び出します。
  • サンプルコード
  • Option Explicit

    Function ChangeFileAttributes(strPath As String, _
                                Optional lngSetAttr As FileAttribute, _
                                Optional lngRemoveAttr As FileAttribute, _
                                Optional blnRecursive As BooleanAs Boolean

       ' この関数は、ディレクトリ パス、設定するファイル属性を示す値、
       ' 削除するファイル属性を示す値、および再帰的に呼び出される
       ' かどうかを示すフラグを引数として受け取ります。
       ' エラーが発生しなかった場合は True を返します。

       Dim fsoSysObj      As Scripting.FileSystemObject
       Dim fdrFolder      As Scripting.Folder
       Dim fdrSubFolder   As Scripting.Folder
       Dim filFile        As Scripting.File

       ' 新規 FileSystemObject を返します。
       Set fsoSysObj = New Scripting.FileSystemObject

       On Error Resume Next
       ' フォルダを取得します。
       Set fdrFolder = fsoSysObj.GetFolder(strPath)
       If Err <> 0 Then
          ' パスが間違っています。
          ChangeFileAttributes = False
          GoTo ChangeFileAttributes_End
       End If
       On Error GoTo 0

       ' 呼び出し側が設定する属性を渡した場合は、すべてに対して設定します。
       If lngSetAttr Then
          For Each filFile In fdrFolder.Files
             If Not (filFile.Attributes And lngSetAttr) Then
                filFile.Attributes = filFile.Attributes Or lngSetAttr
             End If
          Next
       End If

       ' 呼び出し側が削除する属性を渡した場合は、すべてに対して削除します。
       If lngRemoveAttr Then
          For Each filFile In fdrFolder.Files
             If (filFile.Attributes And lngRemoveAttr) Then
                filFile.Attributes = filFile.Attributes - lngRemoveAttr
             End If
          Next
       End If

       ' 呼び出し側が blnRecursive 引数に True を設定した場合は、
       ' 関数を再帰的に呼び出します。
       If blnRecursive Then
          ' サブフォルダをループします。
          For Each fdrSubFolder In fdrFolder.SubFolders
             ' サブフォルダのパスを指定して関数を呼び出します。
             ChangeFileAttributes fdrSubFolder.Path, lngSetAttr, _
                lngRemoveAttr, True
          Next
       End If
       ChangeFileAttributes = True

    ChangeFileAttributes_End:
       Exit Function
    End Function
  • 以下のプロシージャを使用して、
  • ChangeFileAttributes プロシージャをテストできます。
  • この例では、My Documents フォルダのすべてのファイルの隠しファイル属性を可視に設定します。
  • サンプルコード
  • Option Explicit

    Sub TestChangeAttributes()
        If ChangeFileAttributes("c:\my documents", , _
            Hidden, False) = True Then
            MsgBox "File attributes succesfully changed!"
        End If
    End Sub
  • ChangefileAttributes の引数に別の値を指定して、プロシージャがどのように機能するかを調べることができます。
  • FileSearch オブジェクトを使用した作業

  • FileSearch オブジェクトは、Microsoft Office 9.0 Object Library のメンバです。
  • このライブラリは、Office の [ファイルを開く] ダイアログ ボックスのすべての機能に対するプログラム インターフェイスを公開します。
  • 公開されるインターフェイスには、[ファイルを開く] ダイアログ ボックスから利用できる [高度な検索] ダイアログ ボックスが持つ機能も含まれます。
  • FileSearch オブジェクトのオブジェクト、メソッド、およびプロパティを使用して、指定した条件に基づいて、ファイルやファイルのコレクションを検索できます。
  • 以下の例は、FileSearch オブジェクトを使用して、 strFilespec 引数で指定された種類のファイルを 1 つ以上検索する方法を示しています。
  • セミコロンで区切られた拡張子のリストを指定することにより、複数のファイル拡張子を検索できるところに注目してください。
  • サンプルコード
  • Option Explicit


    Function CustomFindFile(strFileSpec As String)
        ' このプロシージャは、"c:\" ディレクトリ内で strFileSpec
        ' 引数で指定されるファイル指定に一致するすべてのファ
        ' イルの名前を持つメッセージ ボックスを表示する簡単な
        ' ファイル検索ルーチンを示しています。
        ' strFileSpec 引数は、セミコロンで区切られたリストを使
        ' 用して、1 つ以上のファイル指定を含むことができます。
        ' たとえば、strFileSpec 引数に "*.log;*.bat;*.ini" を指
        ' 定すると、 "c:\" 内でこれらの拡張子を持つファイルが
        ' すべて返されます。

        Dim fsoFileSearch   As Office.FileSearch
        Dim varFile         As Variant
        Dim strFileList     As String

        ' 入力が有効な場合に、ファイル検索を行います。
        If Len(strFileSpec) >= 3 And InStr(strFileSpec, "*.") > 0 Then
            Set fsoFileSearch = Application.FileSearch
            With fsoFileSearch
                .NewSearch
                .LookIn = "c:\"
                .Filename = strFileSpec
                .SearchSubFolders = False
                If .Execute() > 0 Then
                    For Each varFile In .FoundFiles
                        strFileList = strFileList & varFile & vbCrLf
                    Next varFile
                End If
            End With
            MsgBox strFileList
        Else
            MsgBox strFileSpec & " is not a valid file specification."
            Exit Function
        End If
    End Function


  • 説明
  • FileSearch オブジェクトは 2 つのメソッドといくつかのプロパティを持っています。
  • これらを使用して、独自の Office ソリューションに独自のファイル検索機能を構築できます。
  • 上記の例では、NewSearch メソッドを使用して以前の検索条件を消去し、Execute メソッドを使用して指定したファイルの検索を行います。
  • Execute メソッドは、見つかったファイル数を返します。
  • このメソッドは並べ替え順、並べ替えの方法、および検索の実行に保存した Find Fast インデックスだけを使用するかどうかなど、省略可能なパラメータもサポートします。
  • 検索で見つかったすべての一致するファイルの名前を持つ FoundFiles オブジェクトへの参照を返すには、FoundFiles プロパティを使用します。
  • LookIn プロパティを使用して、検索するディレクトリを指定します。
  • さらに、LookIn プロパティで指定したディレクトリのサブディレクトリも検索するかどうかを指定するために SearchSubFolders プロパティを使用します。
  • FileName プロパティは、ワイルドカード文字や、複数のファイル名またはファイルの種類を指定するセミコロンで区切られたリストもサポートします。

 

2000年01月01日|[VBサンプルコード]:[ファイル]