OpenTextFile について
シート一覧を作ろうと思ってたんですが、仕事でCSVファイルを開く処理を作らないといけなくなったので、調べたことを書いておきます!w
■OpenTextFileメソッド
テキストファイルを開いて、そのファイルの読み書きに使用できるTextStraemオブジェクトを取得するメソッドです
・構文
構文は以下の通りです
object.OpenTextFile (filename, [ iomode, [ create, [ format ]]])
objectはFileSystemObjectのオブジェクトです
・パラメータ
メソッドのパラメータは以下の通りです
- filename … 開くファイルのパス
- [iomode] … 入出力モード
- [create] … ファイルを新規作成するか
- [format] … ファイルの形式
filenameには、開くファイルのパスを設定します(必須項目)
[iomode]には、開くファイルの入出力モードを下記の「IOMode列挙型」から指定可能です
[create]には、指定したファイルが存在しない場合、新規作成するかどうかを指定可能です
True : 新規作成する、False : 新規作成しない【デフォルト】
[format]には、ファイルの形式を下記の「TRristate列挙型」から指定可能です
– IOMode列挙型
パラメータで指定できる項目は以下の通りです
- 1:ForReading(読み取り専用)【デフォルト】
- 2:ForWriting(上書き書き込み)
- 8:ForApending(追加書き込み)
編集しない場合や他からのアクセスが考えられる場合は「ForReading」で開く
元のファイルの内容を気にしない場合は「ForWriting」で開く
元のファイルの内容の行末尾に追加する場合は「ForApending」で開く
– Tristate列挙型
パラメータで指定できる項目は以下の通りです
- 0:TristateFalse(ASCII[Shift-JIS])【デフォルト】
- -1:TristateTrue(Unicode[UTF-16])
- -2:TristateUseDefault(システムのデフォルト設定)
- -2:TristateMixed(混在)
ASCII(Shift-JIS)ファイルとする場合は「TristateFalse」で開く
Unicode(UTF-16)ファイルとする場合は「TristateTrue」で開く
システムのデフォルト設定とする場合は「TristateUseDefault」で開く
※混在は「システムのデフォルト設定」と同じ値なので、「TristateMixed」でも「TristateUseDefault」と同じです
てか、省略したら「システムのデフォルト設定」ではなく、「ASCII」なんですね!w
・戻り値
メソッドの戻り値は以下の通りです
- TextStreamオブジェクト
指定したファイルのTextStreamオブジェクトなので、変数にSetしてください
■例
・簡単なサンプル
①OpenTextFileのサンプル
Sub OpenTextFile_Sample(fileName As String, oText As TextStream)
Dim obj As FileSystemObject
' オブジェクトを作成
Set obj = New FileSystemObject
' TextStreamオブジェクトを取得
Set oText = obj.OpenTextFile(fileName, ForReading, False, TristateFalse)
' オブジェクトを破棄
Set obj = Nothing
End Sub
②呼び出し元関数のサンプル
Sub CallOpenTextFile_Sample()
Dim oText As TextStream
Dim fileName As String
' オブジェクトを取得したいファイルパス
fileName = "E:VBASample001Sample.txt"
' 作成した関数を呼び出す
Call OpenTextFile_Sample(fileName, oText)
With oText
' ファイルの最後まで読み込む
Do Until .AtEndOfStream
' 一行(改行コードまで)を読み込む
Debug.Print .ReadLine
' 行番号を返す
Debug.Print .Line
Loop
' フィルを閉じる
.Close
End With
' TextStreamオブジェクトを破棄
Set oText = Nothing
End Sub
③簡略化したOpenTextFileのサンプル
Sub OpenTextFile_Sample2(ByVal fileName As String, ByRef oText As TextStream)
' オブジェクトを作成
With New FileSystemObject
' TextStreamオブジェクトを返す
Set oText = .OpenTextFile(fileName)
End With
End Sub
・説明
Callと簡略化だけでよくないか?と思い始めましたが・・
口を酸っぱくするくらいに言いますが、FileSystemObjectを使用する場合は、関数化して呼び出すようにして、エラートラップを施してください
呼び出し元の関数内に、FileSystemObjectが出てこないのが理想です!
取得したTextStreamオブジェクトの使い方については、別途記事にしていきます
ここでは簡単に、読み取り専用で開いて、ファイルの最後まで1行毎に読み取る処理にしています
・注意点
- 指定したファイルが存在しても読み取り専用や排他状態だった場合、IOModeで「書き込み」を指定するとエラーになる
- 指定したファイルが読み取り専用かどうかは、FileオブジェクトのAttributesプロパティで調べることができる
- 排他状態は困難な(Attributesプロパティでわからない)ので、読み取り専用で開こう!
- 書き込みたいなら、新規ファイルを作成しよう!w
- 指定したファイルがなければ、新規作成ができるらいしいが、親フォルダや階層がなかったら!?
- オブジェクトを返すメソッドを関数化するときは、引数で受け渡す
- 引数で受け取って関数内でSetしたオブジェクトは、呼び出し側でNothingする
・その他
OpenTextFileメソッドに限ったことではないですが・・
複数のオブジェクトを1つの関数内で扱うと破棄する処理が大変になります
1オブジェクト1関数で対応するようにしましょ!
※個人的な見解ですが、汎用性が高いソースコードになると思います
TextStreamオブジェクトが出てきたので、読み書きのサンプルを紹介がてら、次回は、TextStreamオブジェクトについて書いてみます
ではでは