GetFile について
ファイル一覧を作成した時は、GetFolderメソッドで、FilesプロパティをFor Each…Nextステートメントで回して、Fileオブジェクトを取得しました
主なメソッドやプロパティはそこで記載したので、もうお判りでしょう!?w
そのFileオブジェクトを取得するメソッドについてです!
■GetFileメソッド
パラメータで指定したファイルのFileオブジェクトを取得します
・構文
構文は以下の通りです
object.GetFile(filespec)
objectはFileSystemObjectのオブジェクトです
・パラメータ
メソッドのパラメータは以下の通りです
- filespec … オブジェクトを取得したいファイルのパス
ファイルへのパス(絶対パスもしくは相対パス)を指定します
存在しないファイルを指定した場合は、エラーが発生します
・戻り値
メソッドの戻り値は以下の通りです
- Fileオブジェクト
指定したファイルのFileオブジェクトが戻り値として取得できますので、変数にSetしてください
■例
・簡単なサンプル?
①GetFileのサンプル
Function GetFile_Sample1(filespec As String) As File Dim obj As FileSystemObject Dim oFile As File ' オブジェクトを作成 Set obj = New FileSystemObject ' Fileオブジェクトを取得 Set oFile = obj.GetFile(filespec) ' オブジェクトを破棄 Set obj = Nothing ' 結果を返す Set GetFile_Sample1 = oFile ' オブジェクトを破棄 Set oFile = Nothing End Function
②呼び出し元関数のサンプル
Sub CallGetFile_Sample1() Dim filespec As String Dim oFile As File ' オブジェクトを取得したいファイルパス filespec = "E:\VBA\Sample001\Sample.txt" ' 作成した関数を呼び出す Set oFile = GetFile_Sample1(filespec) ' ファイル名を出力 Debug.Print oFile.Name ' Fileオブジェクトを破棄 Set oFile = Nothing End Sub
③簡略化したGetFileのサンプル
Function GetFile_Sample2(filespec As String) As File ' オブジェクトを作成 With New FileSystemObject ' Fileオブジェクトを返す Set GetFile_Sample2 = .GetFile(filespec) End With End Function
・説明
FileSystemObjectを使おうが、別の何かを使おうが、とにかく関数化しておくことをお勧めします!
戻り値がオブジェクトなので、FileSystemObjectとFileの両方のオブジェクトを変数で作成しようとすると、①のように大変回りくどいことになってしまいますw
そのため、シンプルに③のようにするのが良いかと思います
・より良いサンプル
それでも気持ち悪いから嫌だ!という方は、こちらの「より良いサンプル」をどうぞ!w
④GetFileのより良いサンプル
Sub GetFile_Sample3(ByVal filespec As String, ByRef oFile As File) Dim obj As FileSystemObject ' オブジェクトを作成 Set obj = New FileSystemObject ' Fileオブジェクトを取得 Set oFile = obj.GetFile(filespec) ' オブジェクトを破棄 Set obj = Nothing End Sub
⑤呼び出し元関数のサンプル2
Sub CallGetFile_Sample2() Dim filespec As String Dim oFile As File ' オブジェクトを取得したいファイルパス filespec = "E:\VBA\Sample001\Sample.txt" ' 作成した関数を呼び出す Call GetFile_Sample3(filespec, oFile) ' ファイル名を出力 Debug.Print oFile.Name ' Fileオブジェクトを破棄 Set oFile = Nothing End Sub
⑥簡略化したGetFileのより良いサンプル
Sub GetFile_Sample4(ByVal filespec As String, ByRef oFile As File) ' オブジェクトを作成 With New FileSystemObject ' Fileオブジェクトを返す Set oFile = .GetFile(filespec) End With End Sub
・更により良くする
更により良い関数化を行う場合はエラートラップを行って、その結果(エラーが起きたかどうか)を「GetFile_Sample」の戻り値で返す!
そうすると、呼び出し側は引数で受け取ったオブジェクトが正しいかどうかを関数の戻り値で判断できるので、「oFile」を参照して判断する必要がなくなりますね!
「If Not (oFile Is Nothing) Then … End If」で処理してもいいですが、「否定の否定」的な感じになるので「If (戻り値 = True) Then … End If」が良いです
「If (oFile Is Nothing) Then … Else … End If」でもありですけどね!
※この「Is Nothing」は「If ((oFile Is Nothing) = True) Then」のように見えるので、便利ですけどあまり好きじゃないですw
えーーーっと、もうサンプルは書きませんよw
・注意点
- 指定するファイルパスは存在しないとエラーになる
- FileExistsメソッドでファイルの存在確認をしておく
- GetFileメソッドのエラー有無でファイルの存在確認としない
- オブジェクトを返すメソッドを関数化するときは、引数で受け渡す
- 関数内変数にSetしたオブジェクトは、関数内でNothingする
- 引数で受け取って関数内でSetしたオブジェクトは、呼び出し側でNothingする
- 関数内で起きたエラーは、呼び出し側に通知すべき
・その他
Excel VBAでも関数の引数には、ByVal(値渡し)とByRef(参照渡し)があります
趣味の世界かも知れませんが、本来は全ての関数の全ての引数で、正しく宣言するべきです!
※でもーーー、面倒なのでこのブログのサンプルでは使わないと思いますw
この宣言は、ソースコードを書いた人以外の人が見た時に、ByValならば値は変更されない、ByRefならば値を受け取るのだと、関数の中身を見なくてもわかるためなので、プログラマーを目指すなら書くべき!
ま、ただの人なら書かなくてもいいですけどねーw
次はどのメソッドを調べましょうかね?
ではでは