トップに戻る

オブジェクト指向のファイル操作

まず、オブジェクト指向のファイル操作を、出来るように、エクセルを、設定しないといけない。
エクセルのVBAエディターを、まず、立ち上げます。そこで、
以下のような操作をします。
ツール、参照設定を、実行します。
左記のファイルをチェックして、
OKします。
そうすると、
オブジェクト指向のファイル操作に関する。
クラス、メンバ、プロパティが、
VBAに、追加されます。

Public Sub filesousa()

    'ファイル操作のオブジェクトを作る
    Dim fso As New FileSystemObject
    'ファイルのオブジェクトを作る
    Dim f As File
    'テキストストリームを作る
    Dim st As TextStream


End Sub
まず、標準モジュールに上記の様な、コーディングをしました。
準備段階で、上記の三つのオブジェクトを、作ります。
気をつけないといけないのは、FileSystemObjectは、Newで、作らないといけません。
全部、プルダウンメニューから、選べばいいので、コーディングは、非常に楽です。

先ずは、新規ファイルの作成をして、CSV形式で、テキストを出力します。
Public Sub filesousa()

    Dim fso As New FileSystemObject
    Dim f As File
    Dim st As TextStream

    Set st = fso.CreateTextFile("新規ファイル.txt")

    st.Write ("まずは、第一歩")
    st.Write (",")
    st.WriteLine ("第二歩")

    st.Close

End Sub

オブジェクトを、作成後、新規ファイルの作成、、テキストデータの書き出し。
Writeで、書き出すと、改行コードが、書き出されないので、連続的に続くデータになる。
カンマを、書き出すことにより、カンマを区切り文字とした、CSVファイル形式になる。
最後に、WriteLineで、書き出すと、文字の最後に、改行コードが、ファイルに出力される。
コードが、ほとんど、プルダウンメニューから、選んで、書き込むことが出来るので、
コードミスが、少なく防げると思われます。
また、今回の使い方を、解ったら、WriteLineだけでも、それなりの、テキストファイルを、作れることがわかるが、
ただ、改行コードが、たくさん、テキストファイルに、入るので、効率は、悪くなるかもしれません。

次に、すでに、テキストファイルが、出来ている場合は、ちょっとコードを変えると、
いろいろな、モードで、テキストファイルを、開くことが出来るようになるようなります。
Public Sub filesousa()

    Dim fso As New FileSystemObject
    Dim f As File
    Dim st As TextStream
    Dim buf As String

    Set f = fso.GetFile("新規ファイル.txt")
    Set st = f.OpenAsTextStream(ForReading)

    buf = st.ReadLine()

    st.Close

    Debug.Print buf

End Sub

左記コーディングの、7行目は左下の図の様になります。
ForAppending  追加モード
ForReading    読み込みモード
ForWriting     新規書き込みモード
で、ファイルを、開くことが出来る事が解ります。
GetFileで、ファイルオブジェクトに代入していますが、
ファイルオブジェクトを作成しなくとも、テキストファイルを
開くことも出来ますが、この様に、ファイルオブジェクトを
作っておくと、長いプログラムの時は、便利です。
今回は、ファイルオブジェクトから、オープンテキストファイルを
しています。
ReadLineで、前回書き込んだテキストを、読み込んでいます。
一行読み込みなので、左記のコードを、実行した結果は、
下のように、なります。

では、CSV形式のテキストファイルを、読み込むと、データが、カンマ続きで、つながっているので、利用するときは、
不便です。ちょっと工夫が、要りますね。そこで、使うのが、Split()メンバです。
この関数の使い方は、指定の文字で、区切られた文字列を、分割してくれます。
Public Sub filesousa()

    Dim fso As New FileSystemObject
    Dim f As File
    Dim st As TextStream
    Dim buf As String
    Dim buf1() As String
    Dim i As Integer

    Set f = fso.GetFile("新規ファイル.txt")
    Set st = f.OpenAsTextStream(ForReading)
    buf = st.ReadLine()
    st.Close
    Debug.Print buf
    buf1() = Strings.Split(buf, ",")
    For i = 0 To UBound(buf1)
         Debug.Print buf1(i)
    Next
End Sub

上記コードを、実行すると、右上の図の様になります。
buf1()の配列に、カンマで区切られた文字が、分割され、代入されていることがわかります。

テキストデータを、読む場合、最後のデータを、読み込んだら、ファイルの最後を何らかの形で知らねばならない。
そこで、新規ファイル.txtのファイルの中身を、少し変えてみる。
Public Sub filesousa()
    Dim fso As New FileSystemObject
    Dim f As File
    Dim st As TextStream
    Dim buf As String
    Dim buf1() As String
    Dim i As Integer

    Set f = fso.GetFile("新規ファイル.txt")
    Set st = f.OpenAsTextStream(ForReading)
    Do While Not (st.AtEndOfLine)
        buf = st.ReadLine()
        Debug.Print st.AtEndOfLine
        Debug.Print buf
    Loop
        st.Close

End Sub
テキストファイルを、中央上のように、書き換えました。その後、左上のように、コードを書き換え、実行してみると、
右上のように、なりました。AtEndOfLineのプロパティを、利用すると、簡単に、ファイルの最後を検出できます。
以上で、VBAによる、ファイル操作を、終わりとします。
追加書き込み、新規書き込み等のコーディングは、応用すれば、できると思います。
注意する点としては、テキストファイルの、ファイルパスです。
エクセルのブックのディレクトリ位置によって、テキストファイルの位置も調整しないと、エラーや、変な所に、ファイルを作成してしまったり、
結構不都合があると思います。
あと、もともと、エクセルには、CSVファイルを、開く機能があるのに、こんなの必要ないのでは????
と、疑問に持つ人もいるかもしれませんが、ネットワーク上で、一つのCSVファイルを、開いて、読み込んだり、書き込んだり、追記したり
したい場合が、発生した時などは、使う必要があるのではないかと、思われます。読み込むだけなら、ネットワーク上でも、
一つのファイルを、エクセルでも、共有できるか!!!追記などの場合などは、利用されるかもしれません。
他にも、いろいろな、メンバ、プロパティが、あるので、いろいろ、試してみるもの、良いかもしれません。