■ エクセルからファイルを操作しよう1
業務用アプリケーションを開発する上で、システムからファイル操作を行うことは避けて通れません。
エクセル本体にも多くのデータを確保できますが、他アプリケーションとの連携やデータの運用を考えた場合、別ファイルとして保存したほうが保守性がよいパターンは数多く存在します。
エクセルからファイル操作をする上で、最も扱いやすいのがFileSystemObject(FSO)ファイルシステムオブジェクトでしょう。
FileSystemObjectオブジェクトは、ドライブ、フォルダ、ファイル等の操作(追加、移動、削除)をしたり、情報の取得や変更ができる大変便利なオブジェクトです。Scrrun.dll内のスクリプティングタイプライブラリとして提供されており、ExcelVBAから実行ができます。
ExcelVBAからFileSystemObjectを利用するには、プロジェクト>参照設定で、Microsoft Scripting Runtimeの参照にチェックを入れるか、CreateObject関数を実行してFileSystemObjectのインスタンスを作成します。
参照設定でMicrosoft Scripting Runtimeにチェックを入れた場合
Dim FSO As New FileSystemObject
で、インスタンスが作成されます。 ※1
CreateObject関数を使用する場合
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
で、インスタンスが作成されます。
※ なお、Microsoft Scripting Runtimeに参照設定を行わない場合は、コードの記述の際に自動メンバ表示や自動データヒントといったコード補完機能が働かないので注意してください。
では早速、FileSystemObjectについて解説していきましょう。
なお、この後に出るサンプルコードはいずれも上記の方法で、あらかじめFSOのインスタンスを作成しているものとします。実際に使用する場合は、下記コードの中にサンプルコードを挿入して使用します。
※省略されているコード(参照設定でMicrosoft Scripting Runtimeにチェックを入れる場合)
Sub test()
Dim FSO As New FileSystemObject
'この部分にサンプルコードが入る
Set FSO = Nothing
End Sub
※省略されているコード(CreateObject関数を使用する場合)
Sub test()
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
'この部分にサンプルコードが入る
Set FSO = Nothing
End Sub
■FileSystemObject のオブジェクト
FileSystemObjectには、次のオブジェクトとコレクションが存在します。
FileSystemObject
最上位のオブジェクトで、ドライブ、フォルダ、およびファイルに関して、作成、削除、情報の取得などの一般的な操作を行うためのメソッドとプロパティが用意されています。
「FileSystemObject オブジェクトのプロパティの一覧 」
・Drives システムで利用できるすべてのDrivesコレクションを返します。
(例)
Dim Drv As Variant
For Each Drv In FSO.Drives
Debug.Print Drv.DriveLetter
Next Drv
この場合、システムに接続されている全てのドライブの一覧を返します。 |
「FileSystemObject オブジェクトのメソッドの一覧 」
・BuildPath パスの末尾にフォルダ名を追加したパス名を返します。
(例)
Dim MyStr As String
MyStr = "hoge"
Debug.Print FSO.BuildPath("C:\test", MyStr)
この場合「C:\test\hoge」という文字列が作成されますが、実際にフォルダが作成されるわけではないので注意してください。 |
・CopyFile ファイルをコピーします。
・CopyFolder フォルダをコピーします。
(例)
FSO.CopyFile "C:\test\001.bmp", "C:\test\hoge\"
FSO.CopyFile "C:\test\001.bmp", "C:\test\hoge\002.bmp"
上の例は、C:\testにある001.bmpをC:\test\hogeに同名でコピーしています。
下の例では、C:\test\hogeに002.bmpとリネームしてコピーしています。 |
(例)
FSO.CopyFile "C:\test\*.bmp", "C:\test\hoge\"
また、ワイルドカード"*"を使用することもできます。この場合、C:\testにある全てのbmpファイルをC:\test\hogeにコピーします。ワイルドカードはパスの途中には使用できません。C:\tes*\001.bmpなどはエラーになります。 |
(例)
FSO.CopyFile "C:\test\001.bmp", "C:\test\hoge\", True
FSO.CopyFile "C:\test\001.bmp", "C:\test\hoge\", False
第3引数にFalseを指定すると上書きを行いません。同名のファイルが既に存在する場合はエラーになります。第3引数を省略するとTrueとみなされます。 |
(例)
FSO.CopyFolder "C:\test", "C:\test2"
FSO.CopyFolder "C:\test\hoge", "C:\test2\"
フォルダも同様にコピーできます。
上の例は、C:\testフォルダと同じものをC:\test2にリネームしてコピーします。
下の例では、C:\test\hogeフォルダをC:\test2フォルダ内にコピーします。 |
・CreateFolder フォルダを作成します。
(例)
FSO.CreateFolder "C:\test\hoge"
この場合は、C:\testフォルダ内にhogeというフォルダを作成しています。同名のフォルダが既に存在する場合はエラーになります。 |
・CreateTextFile テキストファイルを作成します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.CreateTextFile("C:\test\test.txt")
MyTxt.WriteLine ("*** CreateTextFileTest Succeeded ***")
MyTxt.Close
Set MyTxt = Nothing
この場合、C:\testフォルダ内にtest.txtを作成し
「*** CreateTextFileTest Succeeded ***」の文字列を書き込みます。 |
(例)
Set MyTxt = FSO.CreateTextFile("C:\test\test.txt", False, True)
CreateTextFileの第2引数は上書きの許可を、第3引数は文字コードを指定します。
第2引数がFalseの場合は、上書きを許可しません。省略した場合はTrueとみなされます。
第3引数がTrueの場合はUnicodeファイルで、Falseの場合はAsciiファイルで作成します。省略した場合はFalseとみなされます。この例の場合は、上書きをせずにUnicodeファイルでtest.txtを作成します。 |
・DeleteFile ファイルを削除します。
・DeleteFolder フォルダおよびフォルダ内を削除します。
(例)
FSO.DeleteFile "C:\test\test.txt"
FSO.DeleteFile "C:\test\test.txt", True
第2引数は読み取り専用のファイルの削除を許可するかしないかの指定です。
上の例はtest.txtが読み取り専用だった場合エラーになりますが、下の例ではエラーになりません。省略した場合はFalseとみなされます。またワイルドカードも使用できます。 |
(例)
FSO.DeleteFolder "C:\test\hoge"
この場合、C:\test\hogeとそのフォルダ内を全て削除します。第2引数にTrueを指定すると読み取り専用ファイルも削除されます。省略した場合はFalseとみなされます。DeleteFile、DeleteFolder共、存在しないファイル・フォルダを削除しようとするとエラーになります。 |
・DriveExists 指定されたドライブが存在する場合は真を、存在しない場合は偽を返します。
・FileExists 指定されたファイルが存在する場合は真を、存在しない場合は偽を返します。
・FolderExists 指定されたフォルダが存在する場合は真を、存在しない場合は偽を返します。
(例)
Debug.Print FSO.DriveExists("D")
この場合は、Dドライブが存在すればTrueを存在しない場合はFalseを出力します。 |
(例)
Debug.Print FSO.FileExists("C:\test\test.txt")
Debug.Print FSO.FolderExists("C:\test")
上の例ではファイルの存在を、下の例ではフォルダの存在を調べています。 |
・GetAbsolutePathName 指定されたパスの完全なパス名を返します。
(例)
Debug.Print FSO.GetAbsolutePathName("test.txt")
Debug.Print FSO.GetAbsolutePathName("\")
カレントフォルダが"C:\test"だった場合、上の例では"C:\test\test.txt"を、下の例では"C:\"を返します。 |
・GetBaseName ファイルのベース名 (ファイル拡張子を除いたもの) を返します。
・GetExtensionName 指定されたファイルの拡張子を返します。
(例)
Debug.Print FSO.GetBaseName("C:\test\001.bmp")
Debug.Print FSO.GetExtensionName("C:\test\001.bmp")
上の例では"001"が返り、下の例では"bmp"が返ります。 |
・GetDrive 指定されたドライブのDriveオブジェクトを返します。
・GetFile 指定されたファイルのFileオブジェクトを返します。
・GetFolder 指定されたフォルダのFolderオブジェクトを返します。
(例)
Debug.Print Debug.Print FSO.GetDrive("A").IsReady
この例では、Aドライブのオブジェクトを取得して、ドライブの準備ができているかどうかを判定させています。 |
(例)
Debug.Print FSO.GetFile("C:\test\001.bmp").Type
この例では、001.bmpのファイルオブジェクトを取得して、ファイルタイプを出力させています。出力される文字列は"ビットマップ イメージ"になります。 |
(例)
Debug.Print FSO.GetFolder("C:\test").Size
この例では、C:\testフォルダのフォルダオブジェクトを取得して、フォルダサイズを出力させています。出力されるのはC:\testフォルダの全容量バイト数です。 |
・GetDriveName 指定されたドライブ名を返します。
・GetFileName 指定されたファイル名またはフォルダ名を返します。
・GetParentFolderName 指定されたファイルまたはフォルダの親フォルダ名を返します。
(例)
Debug.Print FSO.GetDriveName("C")
(例)
Debug.Print FSO.GetFileName("C:\test\001.bmp")
(例)
Debug.Print FSO.GetParentFolderName("C:\test\001.bmp")
・GetSpecialFolde 特殊フォルダのパスを返します。
特殊フォルダの種類に指定できる値
0 Windowsによりセットアップされたファイルの置かれているフォルダが返されます。
1 ライブラリ、フォント、デバイスドライバなどの置かれているフォルダが返されます。
2 一時ファイルの格納に使用されるフォルダが返されます。
(例)
Debug.Print FSO.GetSpecialFolder(0).Path
Debug.Print FSO.GetSpecialFolder(1).Path
Debug.Print FSO.GetSpecialFolder(2).Path
0の値を指定した場合"C:\WINDOWS"のパスが、
1の値を指定した場合"C:\WINDOWS\system32"のパスが、
2の値を指定した場合環境変数TMPのパスが、それぞれ返ります。 |
・GetTempName 一時ファイル、フォルダの名前をランダムに生成します。
(例)
Debug.Print FSO.GetTempName
この場合、"rad00A00.tmp"等のファイル名がランダムに作成されます。 |
・MoveFile 一つまたは複数のファイルを移動します。
・MoveFolder 一つまたは複数のフォルダを移動します。
(例)
FSO.MoveFile "C:\test\test.txt", "C:\test\hoge\"
FSO.MoveFolder "C:\test\hoge", "C:\test2\"
CopyFile,CopyFolderメソッドと基本的に同じです。コピーではなく移動させます。 |
・OpenTextFile 指定されたファイルを開き、読み取り、または書き込みに使用できるTextStreamオブジェクトを返します。
(例)
Debug.Print FSO.OpenTextFile("C:\test\test.txt").ReadAll
この場合、test.txtに書かれている全てのテキストを読み取り、出力します。 |
(例)
FSO.OpenTextFile("C:\test\test2.txt", 2, True, -1).Write _
"*** OpenTextFileTest Succeeded ***"
第2引数は入出力モードを指定します。1は読み込み、2は書き込み、8は追記です。省略すると1が指定されたとみなされます。
第3引数は新規作成をするかしないかを指定します。Trueなら新規作成をし、Falseなら新規作成をしません。省略するとFalseが指定されたとみなされます。
第4引数は文字コードを設定します。 0のときはASCIIファイルで、-1のときはUnicodeファイルで、-2のときはシステムの規定値でファイルが開かれます。省略すると0が指定されたとみなされます。
上記の例では、C:\testフォルダに"*** OpenTextFileTest Succeeded ***"と書かれたtest2.txtをUnicodeファイルで新規作成しています。 |
次回はDriveオブジェクト、Fileオブジェクト、Folderオブジェクトについて解説します。
※1 実際にインスタンスが生成されるタイミングはFSOが使用される時になります。
|