wrote :: 2001.12.05

トップページ > Excel > VBA > 講座:ファイルの操作 > テキストファイルを操作する


テキストファイルを操作する

ファイル操作の最後に、テキストファイルへの読み書きテクニックをご紹介します。VBA でマクロを作成していると、たまにテキストファイルへデータを書き込むと便利なケースに遭遇します。たとえば、現在の設定を保存して後で利用したり、ユーザーが行った操作のログを残したり……。テキストファイルの操作は Excel のシートやセルの操作とは異なり、どちらかというと Visual Basic 的なテクニックです。詳細に解説しているマニュアル本も少ないかもしれません。ここでは、テキストファイルにデータを書き込むときのセオリーと、最後にテキストファイルに保存されているデータを読み込んでシートに代入するサンプルをご紹介します。

■ファイル操作の基本

まず、テキストファイルを扱うときの手順を覚えましょう。

 1. 操作したいテキストファイルを開く
 2. テキストファイルにデータを書き込む
 3. 操作したテキストファイルを閉じる

この 3ステップが基本ですです。

1.ではOpen ステートメントを使います。Workbooks コレクションの Open メソッドとは異なりますので混同しないようにしてください。

Open ステートメントの書式は次の通りです。

Open ファイル名 For 開き方 As #ファイル番号

引数"ファイル名"には操作したいファイル名を指定します。D:\tmp\Sample.txt のようにパスを付加することもできます。存在しないファイル名を指定するとエラーになりますので [ファイルを開く] ダイアログボックスでファイルを指定するか、Open ステートメントの前にファイルの存在を確認しておくといいでしょう。

ポイントは、引数"開き方"です。Open ステートメントでファイルを開くときは、そのファイルに対して「何をするか」を宣言してやらなければなりません。引数"開き方"に指定できるキーワードと意味は次の通りです。

キーワード 処理 モード
 Input  読み込み  入力モード
 Output  書き込み  出力モード
 Append  書き込み  追加モード
 Random  読み込み/書き込み  ランダムアクセスモード
 Binary  読み込み/書き込み  バイナリモード


ファイルからデータを読み込みたいときは Input を指定します。逆にデータを書き込むのでしたら Output です。覚えておきたいのは Append です。Append で開いたファイルも Output と同じようにデータを書き込むことができます。ただし Output で開いたファイルにデータを書き込むと、既存のファイルが上書きされてしまいます。Append は上書きせず、既存データの末尾に新しいデータを追記します。ログファイルなどに記録を残す場合に便利です。Random はデータベースのデータファイルにアクセスするモードです。Excel で使う機会は少ないです。Binary は画像データなどを扱うモードです。関係なさそうなモードですが、実はファイルのデータを一気に読み込むときに重宝します。後ほどサンプルをお見せしましょう。

最後の引数"ファイル番号"には、ユーザーが任意に指定した数値を指定します。いくつでもよいのですが、開いたファイルを操作するとき、ここで指定した番号を使います。複数のファイルを開くときには重複しないよう注意してください。心配性の方は 使われていないファイル番号を自動的に割り振ってくれる FreeFile 関数を使うといいでしょう。

忘れてならないのは3.の作業です。開いたファイルは明示的に閉じなければなりません。閉じるのは Close ステートメントです。実はマクロが正常に終了すると、それまで Open ステートメントで開いていたファイルは自動的に閉じられるのですが、万が一マクロが異常終了したときなどはメモリ上でファイルが開かれたままになってしまいます。たった 1 行のコードを書くだけですから、開いたファイルは自分で忘れずに閉じておきましょう。

■ファイル操作の基本

さあ、それでは実際にやってみます。D:\test.txt を「書き込みモード」で開いて、現在の日付を書き込みます。もし D:\test.txt が存在しない場合は自動的に作成されます。D:\test.txt がすでに存在すると、今までのデータは消えてしまいます。

Sub Sample21()
    Dim n As Long
    n = FreeFile
    Open "D:\Test.txt" For Output As #n
        Print #n, Now
    Close #n
End Sub

For Output を For Append に変えて試してみてください。既存データが削除されるか、末尾に追記されるかがわかります。

■テキストファイルからデータを読み込む

今度はデータの読み込みです。開くモードは Input ですね。さて、テキストファイルのデータを読み込むにはさまざまなケースが考えられます。最初のサンプルは、

123,tanaka,789,toru

といった「カンマで区切られたデータ」をセルに代入します。セルの操作がわからない方は後ほど解説する「セルの操作編」をご覧ください。そのうち書きます...(^^;

Sub Sample22()
    Dim n As Long, buf As Variant, tmp As String
    n = FreeFile
    Open "D:\Test.txt" For Input As #n
        Line Input #n, tmp                     ''<------(1)
    Close #n
    buf = Split(tmp, ",")                      ''<------(2)
    Worksheets("Sheet1").Range("A1:D1") = buf  ''<------(3)
End Sub

(1)の Line Input ステートメントはファイルから 1 行分のデータを読み込んで変数に格納します。Do Loop などと併用すれば 1 行ずつデータの最終行まで読み込むことも可能です。変数 tmp には「123,tanaka,789,toru」というデータが入っていますので、これを「,」で区切ります。これには Split 関数を使います。あ……ごめんなさい、Split 関数は Excel 2000 で追加された関数です。Excel 95/97 ではエラーになってしまいます。区切った各データは変数 buf に配列として格納されます。そこで、(3)のように 4 つのセルに一気に代入します。

■テキストファイルからデータを一気に読み込む

CSV のように各データがカンマで区切られたデータは Sample22 のようにして読み込みます。では、文字列ばかりが入力されているテキストファイルをシート上に展開するにはどうしたらいいでしょうか。Line Input ステートメントで 1 行ずつ読んでもいいのですが、Binary モードを使うと一瞬で終わってしまいます。ここでは、Sheet1 に C:\config.sys を読み込むサンプルをご紹介します。

Sub Sample23()
    Dim TargetFile As String, n As Long, buf As String
    n = FreeFile
    TargetFile = "C:\config.sys"
    buf = Space(FileLen(TargetFile))
    Open TargetFile For Binary As #n
        Get #n, , buf
    Close #n
    Worksheets("Sheet1").Range("A1") = buf
End Sub

binary モードで開いたファイルからデータを読み込むには Get ステートメントを使います。このとき、Get ステートメントで読み込んだデータを格納する変数は、あらかじめデータの大きさを確保しておかなければなりません。そこで、スペースを挿入する Space 関数を使って変数 buf のサイズを指定しておきます。スペースの数は C:\config.sys のサイズと同じです。そこで FileLen 関数を使って C:\config.sys の大きさを取得します。

ちょっと裏技的な Tips みたくなってしまいました。まあ、こんなこともできる……と、そんなとこで勘弁してください。リクエストが多いようなら、もう少し詳細に解説いたします。


[ファイルの一覧を取得する]戻る← | →最初に戻る[目次]