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オブジェクトについて書いてみます

ではでは

広告

やもす ʕ•͡-•ʔ

のんびり!のほほん!がモットーです!w 蕎麦食いたい ライブ行きたい 暑いの嫌い

シェアする