まず、オブジェクト指向のファイル操作を、出来るように、エクセルを、設定しないといけない。
エクセルの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ファイルを、開いて、読み込んだり、書き込んだり、追記したり
したい場合が、発生した時などは、使う必要があるのではないかと、思われます。読み込むだけなら、ネットワーク上でも、
一つのファイルを、エクセルでも、共有できるか!!!追記などの場合などは、利用されるかもしれません。
他にも、いろいろな、メンバ、プロパティが、あるので、いろいろ、試してみるもの、良いかもしれません。 |
|
|