本稿で紹介する「テキストファイルの操作」は、Shift-JIS形式のテキストファイルを対象にしています。UTF-8形式のファイルを扱うときは、下記ページをご覧ください。
ファイル操作の最後に、テキストファイルへの読み書きテクニックをご紹介します。VBAでマクロを作成していると、たまにテキストファイルへデータを書き込むと便利なケースに遭遇します。たとえば、現在の設定を保存して後で利用したり、ユーザーが行った操作のログを残したり・・・。テキストファイルの操作は Excelのシートやセルの操作とは異なり、どちらかというとVisual Basic的なテクニックです。詳細に解説しているマニュアル本も少ないかもしれません。ここでは、テキストファイルからデータを読み込むときのセオリーや、テキストファイルにデータを書き込む方法などを解説します。
まず、テキストファイルを扱うときの手順を覚えましょう。
この 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から見れば"出力する"ことになるので、OutputやAppendを指定します。
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ステートメントで閉じるようにしましょう。
開いたファイルからデータを読み込んだり書き込む方法は、別のページで解説します。