■ エクセルからファイルを操作しよう3
前回に続き、FileSystemObjectファイルシステムオブジェクトについて解説します。
■TextStream オブジェクト
テキスト ファイルを読み書きできます。
「TextStream オブジェクトのプロパティの一覧 」
・AtEndOfLine TextStreamファイルのファイルポインタが行末記号直前に置かれている場合に真を、それ以外は偽を返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
MyTxt.ReadLine
Debug.Print MyTxt.AtEndOfLine
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、ReadLineメソッドで1行だけ読み込ませています。テキストファイルの文章が1行しかなければAtEndOfLineはTrueを、複数行ならFalseを返します。(行末の改行は無視します) |
・AtEndOfStream TextStreamファイル内でファイルポインタがファイル終端に置かれている場合真を、それ以外は偽を返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
MyTxt.Read(5)
Debug.Print MyTxt.AtEndOfStream
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、Readメソッドで5文字だけ読み込ませています。テキストファイルの文章が5文字以内ならAtEndOfStreamはTrueを、5文字を超えるならFalseを返します。 |
・Column ファイルポインタの文字位置(カラム番号)を返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
MyTxt.Read(5)
Debug.Print MyTxt.Column
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、Readメソッドで5文字だけ読み込ませています。Columnプロパティは"6"を返します。 |
・Line ファイルポインタの行位置(行番号)を返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
MyTxt.ReadLine
Debug.Print MyTxt.Line
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、ReadLineメソッドで1行だけ読み込ませています。Lineプロパティは"2"を返します。 |
「TextStream オブジェクトのメソッドの一覧 」
・Close TextStreamファイルを閉じます。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
Debug.Print MyTxt.ReadLine
MyTxt.Close
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、ReadLineメソッドで1行だけ読み込ませた後、Closeメソッドで閉じています。 |
・Read 指定された文字数を読み込んで返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
Debug.Print MyTxt.Read(5)
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、Readメソッドで5文字だけ読み込ませています。 |
・ReadAll TextStreamファイル全体を読み込んで返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
Debug.Print MyTxt.ReadAll
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、ReadAllメソッドでテキストファイルの文章全体を読み込んでいます。 |
・ReadLine 1行分を(改行文字を除く)読み込んで返します。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
Debug.Print MyTxt.ReadLine
Set MyTxt = Nothing
この例では、test.txtをTextStreamオブジェクトに取得したあと、ReadLineメソッドで1行だけ読み込ませています。 |
・Skip 指定された文字数をスキップして読み込みます。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
MyTxt.Skip 1
Debug.Print MyTxt.Read(5)
Set MyTxt = Nothing
この例では、TextStreamオブジェクトを1文字スキップし2文字目から5文字を読み込んでいます。テキストファイルの内容が「0123456789」の場合、「12345」が出力されます。 |
・SkipLine 1行分スキップして読み込みます。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt")
MyTxt.SkipLine
Debug.Print MyTxt.ReadAll
Set MyTxt = Nothing
この例では、TextStreamオブジェクトの先頭1行をスキップし、残りのすべてを読み込んでいます。1行目がヘッダ行で、とばして読み込みたいときなどに便利です。 |
・Write 指定した文字列を書き込みます。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt", 8)
MyTxt.Write "12345"
MyTxt.Write "67890"
Set MyTxt = Nothing
TextStreamオブジェクトを取得する際、OpenTextFileメソッドの第2引数を、2の書き込みまたは、8の追記で開きます。Writeメソッドは改行を行いませんので、この例ではtest.txtの末尾に「1234567890」の文字列が追記されます。 |
・WriteLine 1行分の文字列と改行文字を書き込みます。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt", 8)
MyTxt.WriteLine "12345"
MyTxt.WriteLine "67890"
Set MyTxt = Nothing
WriteLineメソッドは文字列と改行を書き込みます。文字列を省略した場合は、改行だけを書き込みます。 |
・WriteBlankLines 指定された数の改行文字を書き込みます。
(例)
Dim MyTxt As TextStream
Set MyTxt = FSO.OpenTextFile("C:\test\test.txt", 8)
MyTxt.WriteBlankLines 1
Set MyTxt = Nothing
WriteBlankLinesメソッドは指定した行数分の改行を行います。この例ではtest.txtの末尾に1行分の改行(空行)が追記されます。 |
以上で、FileSystemObjectの解説を終わります。
なおサンプルコードでは、全てファイルパスが決め打ちされていましたが、実際に利用する際にはファイルの選択をダイアログから行いたい場合が多々あります。最後に、ファイル選択ダイアログの解説をしておきましょう。
■ファイルを開くダイアログを使用する
Application.GetOpenFilenameメソッドを実行します。選んだファイルのフルパスを取得します。キャンセルを選択した場合はFalseが返ります。
(例)
Sub test()
Dim FSO As New FileSystemObject
Dim MyTxt As TextStream
Dim StrPath As String
StrPath = Application.GetOpenFilename( _
FileFilter:="テキスト文書(*.txt),*.txt," & _
"CSVファイル(*.csv),*.csv", _
FilterIndex:=1, _
Title:="GetOpenFilenameTest", _
MultiSelect:=False _
)
Set MyTxt = FSO.OpenTextFile(StrPath, 8)
MyTxt.WriteLine "*** GetOpenFilenameTest Succeeded ***"
Set MyTxt = Nothing
Set FSO = Nothing
End Sub
この例では、ファイルを開くダイアログより拡張子がtxtまたはcsvのファイルを選択し、そのフルパスを取得します。
取得したフルパスを使用して、TextStreamオブジェクトを作成、選択したテキストの末尾に
"*** GetOpenFilenameTest Succeeded ***"の文字列を追記します。 |
GetOpenFilenameの引数を詳しく見ていきましょう。
・FileFilter
ダイアログに表示するファイルの種類を指定します。サンプルコードではテキスト文書とCSVファイルが選択できるようになっています。選択できるファイルの種類を増やしたいときは、さらに","で区切ってファイルの種類を追加します。
・FilterIndex
FileFilterで複数のファイルを設定しているときにどのファイル種類をデフォルトで表示するかを設定します。サンプルコードでは1の"テキスト文書(*.txt)"がデフォルトになります。
・Title
ダイアログのタイトルバーに表示される文字列を設定します。
・MultiSelect
複数ファイルの選択を許可するかしないかを設定します。Trueで複数ファイルの選択を許可、Falseで許可しない設定になります。複数ファイルの選択を許可した場合、サンプルコードのStrPath変数はVariant型で定義する必要があります。MultiSelectをTrueにすると、Variant変数StrPathに開始値1の配列が返されます。たとえば、test1.txtとtest2.txtを選択した場合、StrPath(1)にtest1.txtのフルパスが、StrPath(2)にtest2.txtのフルパスがそれぞれ返ります。
以上、3回に分けてFileSystemObjectの解説を行ってきました。
ファイルを操作する方法はたくさんありますが、このFileSystemObjectオブジェクトは最も手軽に、その機能を実現してくれます。
あなたの開発する業務アプリをさらにグレードアップする、FileSystemObjectオブジェクト。
この機会に、ぜひマスターしてください。
|