テキストファイルを操作する(開く)


本稿で紹介する「テキストファイルの操作」は、Shift-JIS形式のテキストファイルを対象にしています。UTF-8形式のファイルを扱うときは、下記ページをご覧ください。

UTF-8形式のテキストファイルから読み込む

UTF-8形式のテキストファイルに書き込む

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

ファイル操作の手順

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

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

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

ファイルを開く

テキストファイルからデータを読み込んだり、テキストファイルにデータを書き込むときは、まずそのファイルを開かなければなりません。このとき使うのがOpenステートメントです。ブックを開くときに使う、WorkbooksコレクションのOpenメソッドは異なりますので、混同しないようにしてください。

Openステートメントでテキストファイルを開くのは、Excelにブックを開くのとは違います。いわば、ファイルを管理しているOS(Windows)に対して「○○というファイルを使わせてください」という申請を出すようなものです。申請が許諾されると、そのテキストファイルは、それ以降「申請したマクロ」が独占的に使用でき、もし他のアプリケーションなどから使用申請(Openステートメント)が出されても「そのファイルは、今Excelのマクロが使ってるからダメ」とOSが断ってくれます。

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

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

ファイル名」には、開くファイルを一般的にフルパスで指定します。「Sample.txt」のようにパスをつけないで指定すると、カレントフォルダのファイルと認識されます。もちろん、存在しないファイルを指定するとエラーになりますので、事前にDir関数で存在を確認するか、[ファイルを開く]ダイアログボックスなどを使うのが無難です。

ファイルの操作[ファイルの存在を調べる]

[ファイルを開く]ダイアログのフィルタリング

開き方」には、そのテキストファイルに対して、何を行うかを明示します。「開き方」には、次のキーワードのうち、いずれかを指定します。

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

開き方」に指定するキーワードは、Excel目線で考えます。テキストファイルからデータを読み込むというのは、Excel側から見ると"受け入れる"わけですからInputを指定します。反対に、テキストファイルにデータを書き込むのは、Excelから見れば"出力する"ことになるので、OutputAppendを指定します。

Outputで開いたテキストファイルに何かのデータを書き込むと、そのファイルにそれまで記録されていたデータは消えてしまいます。上書きみたいなもんですね。対してAppendで開くと、"追記モード"になりますので、マクロから書き込むデータは、ファイルの末尾に追記されます。

一般的によく使われるのは、「Input」「Output」「Append」の3つです。最初はこれだけ覚えればいいでしょう。ちなみに「Random」はデータベースのファイルにアクセスするモードで、「Binary」は画像ファイルなどのバイナリデータを扱うモードです。どちらも、Excelのマクロからは、ほとんど使いません。

最後の「ファイル番号」には、数値を指定します。これは、OS(Windows)に対する許可申請で「これ以降わたしは、このファイルのことを○番と呼びます」のような取り決めです。Openステートメントでテキストファイルを開いたら、マクロではそれ以降、そのファイルをここで指定した番号で指定します。

もし複数のファイルを同時に開く場合、もちろんこのファイル番号が重複してはいけません。そこで、現在使用できる「空いている番号」を返すFreeFile関数というのもありますが、実際にはほとんど使いません。なぜなら、現在何番のファイル番号が空いているのかわからなくなるほど、大量のファイルを同時に開くことは希だからです。

ほとんどの場合は、1つのファイルしか開きません。1つしか開かないのなら、何もFreeFile関数など使わずに、素直に「#1」と指定すればいいです。なお、これ以降、開いたファイルはこの数値で指定することになるのですが、そのとき「#1」と"#"記号をつけなければならない場合と、「1」のように"#"記号をつけなくてもいい場合、あるいは"#"記号をつけてはいけない場合などがあります。いずれの場合も、誤るとVBAがエラーで教えてくれますので、エラーになったら"#"記号をつけたり、はずしたりしてください。なに、やってれば、そのうち覚えます。

ちなみに"#"は「シャープ」ではありません。音楽で使われるシャープ記号は、五線譜の横線と見間違わないように「♯」と横棒が斜めです。「#」は「ナンバー記号」などと呼ばれています。

ファイルを閉じる

ファイルを閉じるときはCloseステートメントを使います。

Close #1    ''1番のファイルを閉じます
Close       ''現在開いているすべてのファイルを閉じます

VBAの仕様では、プロシージャが正常に終了すると、現在開いているファイルはすべて自動的に閉じられます。しかし、万が一何かの事情でマクロが異常終了したりすると、最悪そのファイルが開かれたままになる場合もあります。自分の行った操作に対して、きちんと後始末をするのはプログラマの義務です。たった1行書くだけですから、こんなところで手を抜かず、きちんとCloseステートメントで閉じるようにしましょう。

開いたファイルからデータを読み込んだり書き込む方法は、別のページで解説します。

ファイルから読み込むには

ファイルに書き込むには