テキストファイル操作方法は2通り
VBAでのテキストファイル操作方法には大きく2つの方法があります。
1つは、OpenとCloseを使う方法で、もう1つは、FileSystemObjectを使う方法です。
FileSystemObjectを使う場合は、VBA画面のツールメニュー→参照設定で、Microsoft Scripting Runtimeにチェックを付ける必要があります。
Open/CloseとFileSystemObjectはどちらを使うべきか
テキストファイルを開いて読み書きして閉じる、というファイル操作の基本のみであればOpen、Read、Write、Closeで十分でしょう。
ファイルサイズ調べたいとか、フォルダの中にあるファイルを列挙したいとか、ファイルを別のフォルダに移動させたいなど、ファイル操作全般を行うのであればFileSystemObjectを利用します。
ちなみに私は自分が書くときはほとんどの場合、FileSystemObjectを使っています。
Open、Closeで書いたあとに複雑なことをやりたいことが発生したときにFileSystemObjectに書きなおすのが面倒なことと、後述するファイル操作関数を用意しているためそちらを使う方がラクなのが理由です。
以下はFileSystemObjectを利用した各関数です。
1つの標準モジュールにまとめて書きます。
FileSystemObject用ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
Option Explicit '//---------------------------------------------------------------------------- '// モジュール変数 '//---------------------------------------------------------------------------- Private m_oFso As FileSystemObject '// FileSystemObject Private m_oTso As TextStream '// TextStream '//---------------------------------------------------------------------------- '// 関数名 :FileOpen '// 機能 :ファイルを開く '// 引数 :(O) a_oFS As FileSystemObject :ファイルシステムオブジェクト '// :(O) a_oTS As TextStream :テキストストリーム '// :(I) a_sFilePath :ファイルパス '// :(I) Optional a_iMode = ForReading :ファイルを開く際のオプション '// :(I) Optional a_iCreate = False :ファイルが存在しない場合に新規作成するかどうか。作成する場合はTrue。 '// 戻り値 :なし '// 備考 :なし '//---------------------------------------------------------------------------- Public Sub FileOpen(a_oFS As FileSystemObject, a_oTS As TextStream, a_sFilePath, Optional a_iMode = ForReading, Optional a_iCreate = False) Set a_oFS = CreateObject("Scripting.FileSystemObject") Set a_oTS = a_oFS.OpenTextFile(a_sFilePath, a_iMode, a_iCreate, TristateFalse) End Sub '//---------------------------------------------------------------------------- '// 関数名 :FileCreate '// 機能 :ファイルを作成する '// 引数 :(O) a_oFS As FileSystemObject :ファイルシステムオブジェクト '// :(O) a_oTS As TextStream :テキストストリーム '// :(I) a_sFilePath :ファイルパス '// 戻り値 :なし '// 備考 :既存ファイルは上書き '//---------------------------------------------------------------------------- Sub FileCreate(a_oFS As FileSystemObject, a_oTS As TextStream, a_sFilePath) Dim sFile As String sFile = a_sFilePath Set a_oFS = CreateObject("Scripting.FileSystemObject") Set a_oTS = a_oFS.CreateTextFile(sFile, True, False) End Sub '//---------------------------------------------------------------------------- '// 関数名 :FileRead '// 機能 :ファイル行を読み込む '// 引数 :(I) a_oTS As TextStream :テキストストリーム '// :(O) a_sReadLine :読み込みファイル行 '// 戻り値 :なし '// 備考 :なし '//---------------------------------------------------------------------------- Sub FileRead(a_oTS As TextStream, a_sReadLine) a_sReadLine = a_oTS.ReadLine End Sub '//---------------------------------------------------------------------------- '// 関数名 :FileWrite '// 機能 :ファイルにレコードを追加する '// 引数 :(I) a_oTS As TextStream :テキストストリーム '// :(I) a_sWriteLine :書き込みファイル行 '// 戻り値 :なし '// 備考 :なし '//---------------------------------------------------------------------------- Sub FileWrite(a_oTS As TextStream, a_sWriteLine) Dim sWrite sWrite = a_sWriteLine & vbCrLf Call a_oTS.Write(sWrite) End Sub '//---------------------------------------------------------------------------- '// 関数名 :FileClose '// 機能 :ファイルを閉じる '// 引数 :(I) a_oFS As FileSystemObject :ファイルシステムオブジェクト '// :(I) a_oTS As TextStream :テキストストリーム '// 戻り値 :なし '// 備考 :なし '//---------------------------------------------------------------------------- Sub FileClose(a_oFS As FileSystemObject, a_oTS As TextStream) a_oTS.Close Set a_oTS = Nothing Set a_oFS = Nothing End Sub |
使い方
使い方は以下のようになります。こちらは上とは別の標準モジュールに作成します。
Cドライブにあるtest.txtを1行読み込んでDebug.Print命令でVBAのイミディエイトウインドウに出力します。
FileWriteは利用していませんがFileReadと同じような感じで使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub bbb() Dim fs As FileSystemObject Dim ts As TextStream Dim sLine Call FileOpen(fs, ts, "C:\test.txt") Do While ts.AtEndOfStream <> True Call FileRead(ts, sLine) Debug.Print sLine Loop Call FileClose(fs, ts) End Sub |
是非、活用してください。