-
- VBA 関数
- Microsoft Scripting Runtime オブジェクト ライブラリ
- Office FileSearch オブジェクト
- ファイル システム関連の Windows API 関数
- この資料では、Windows API 関数についてだけは説明していません。
- Windows API 関数について独自に調査する場合は、FindFirstFile、FindNextFile、および FindClose 関数を参照してください。
-
-
-
関数 |
説明 |
Dir |
指定したパターンまたはファイル属性に一致するファイル、ディレクトリ、またはフォルダの名前を返します。 |
GetAttr |
ファイル、ディレクトリ、またはフォルダの属性を返します。 |
SetAttr |
ファイル、ディレクトリ、またはフォルダの属性を指定します。 |
CurDir |
カレント ディレクトリを返します。 |
ChDir |
カレント ディレクトリを変更します。 |
ChDrive |
現在のドライブを変更します。 |
MkDir |
新しいディレクトリを作成します。 |
RmDir |
既存のディレクトリを削除します。 |
Kill |
1 つ以上のファイルを削除します。 |
FileLen |
ディスク上のファイルの長さをバイト単位で返します。 |
LOF |
開いているファイルの長さをバイト単位で返します。 |
FileCopy |
ディスク上のファイルをコピーします。 |
FileDateTime |
ファイルが作成された、または最後に変更された日付と時刻を返します。 |
Name |
ファイルの名前を変更し、ディスク上の別の場所に移動します。 |
Open |
ディスク上のファイルを読み取り用または書き込み用に開きます。 |
Input |
開いているファイルから文字列を読み取ります。 |
Print |
シーケンシャル ファイルにテキストを書き込みます。 |
Write |
シーケンシャル ファイルにテキストを書き込みます。 |
Close |
Open ステートメントを使用して開いたファイルを閉じます。 |
-
-
- Dir 関数は、 pathname 引数で指定したファイルの名前を返します。
- 一般的には、Dir 関数を使用して、以下の DoesFileExist 関数で示すように、指定したファイルが存在するかどうかを調べます。
-
-
Option Explicit
Function DoesFileExist(strFileSpec As String) As 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 関数に渡すと、関数がそのディレクトリで最初に見つけたファイルを返すためです。
-
- pathname 引数が、フォルダ内のファイル名ではなく、フォルダへのパスを含んでいる場合、Dir 関数はそのフォルダで最初に見つけたファイルの名前を返します。
- その後、引数を指定しないで再度 Dir 関数を呼び出すと、フォルダ内でその後に見つけた各ファイルの名前を順次取得します。
- たとえば、以下のプロシージャは、 strDirPath 引数で指定されたディレクトリ内のすべてのファイル名を保持する配列を返します。
-
-
Option Explicit
Function GetAllFilesInDir(ByVal strDirPath As String) As 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 関数を使用しています。
- さらに、プロシージャではカレント ディレクトリと親ディレクトリを表す "." と ".." も配列に追加しないようにしていることに注意してください。
- 以下のプロシージャを使用して、
-
- 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 Office 2000 と共にインストールされ、ファイルやディレクトリを使った作業に使用できるオブジェクトを持っています。
- ファイルやディレクトリにアクセスする場合、オブジェクト ライブラリは、上記で説明した VBA 関数よりも容易に使用できます。
- オブジェクト ライブラリを使用する前に、このライブラリへの参照を設定する必要があります。
- Microsoft Scripting Runtime が [プロジェクト] メニューの [参照設定] ダイアログ ボックスに表示されない場合は、Scrrun.dll
というファイルを C:\Windows\System サブフォルダから検索する必要があります。
-
-
オブジェクト |
コレクション |
説明 |
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 の新規インスタンス作成後に、これを使用してファイル システム内のドライブ、フォルダ、およびファイルを使って作業できます。
- 以下のプロシージャは、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 Boolean) As 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
|
- 以下のプロシージャを使用して、
-
- このプロシージャは、新規 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, True) Then
' Dictionary 内の項目を出力します。
For Each varItem In dctDict
Debug.Print varItem
Next
End If
End Sub
|
-
- strDirPath 引数に別の値を指定して、このプロシージャが別のディレクトリを使用してどのように機能するかを調べることができます。
- FileSystemObject を使用し、ファイル属性を用いて作業する方法
- 以下の例で示すように、File オブジェクトと Folder オブジェクトは、ファイルやフォルダの属性を設定または取得できる Attributes
プロパティを提供します。
- ChangeFileAttributes プロシージャには 4 つの引数があります。
- 最初の引数はフォルダへのパスです。
- 2 番目の引数は省略可能で、設定する属性を指定する定数です。
- 3 番目の引数も省略可能で、削除する属性を指定する定数です。
- 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 Boolean) As 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
|
- 以下のプロシージャを使用して、
-
- この例では、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 オブジェクトは、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 プロパティは、ワイルドカード文字や、複数のファイル名またはファイルの種類を指定するセミコロンで区切られたリストもサポートします。
|