Openステートメントとは
ExcelVBAでちょっとしたログファイルを残したい、CSVやテキストファイルの中身を1行ずつ読み込みたい——そんなとき、外部ライブラリを使わずに標準機能だけで完結できるのがOpenステートメントです。
FileSystemObjectのように参照設定やCreateObjectが不要で、VBA単体で完結するのが最大のメリットです。この記事ではOpenステートメントの基本から、テキストファイルの書き込み・読み込み・追記までを、実際に動作するサンプルコード付きで解説します。
Openステートメントは、テキストファイルを直接開いて読み書きするための命令です。ファイルを開くときに「どのモードで開くか」を指定します。
| モード | 説明 |
|---|---|
| Output | 新規書き込み(既存の内容は上書きされる) |
| Append | 追記(ファイル末尾に追加) |
| Input | 読み込み専用 |
基本の書式は以下の通りです。
Open "ファイルパス" For モード As #ファイル番号
ファイル番号には1や2といった整数を指定しますが、他の処理とバッティングしないようにFreeFile関数で自動採番するのが安全です。
テキストファイルに書き込む方法
まずは新規にテキストファイルを作成し、内容を書き込むコードです。
Sub WriteTextFile()
Dim filePath As String
Dim fileNo As Integer
filePath = ThisWorkbook.Path & "\sample.txt"
fileNo = FreeFile
Open filePath For Output As #fileNo
Print #fileNo, "1行目のテキストです"
Print #fileNo, "2行目のテキストです"
Write #fileNo, "カンマ区切り", 123, True
Close #fileNo
MsgBox "書き込みが完了しました: " & filePath
End Sub
PrintとWriteはどちらも1行分のデータを書き込む命令ですが、挙動が異なります。
- Print:見た目そのままのテキストとして出力する
- Write:文字列を
""で囲み、値をカンマ区切りで出力する(CSV的な出力に向いている)
用途に応じて使い分けると良いでしょう。
テキストファイルを読み込む方法
次に、作成したファイルを1行ずつ読み込むコードです。EOF関数でファイルの終端を判定しながらループします。
Sub ReadTextFile()
Dim filePath As String
Dim fileNo As Integer
Dim oneLine As String
Dim allText As String
filePath = ThisWorkbook.Path & "\sample.txt"
fileNo = FreeFile
Open filePath For Input As #fileNo
Do Until EOF(fileNo)
Line Input #fileNo, oneLine
allText = allText & oneLine & vbCrLf
Loop
Close #fileNo
MsgBox allText
End Sub
Line Inputは1行分をまとめて変数に読み込む命令です。CSVのように1行ごとに処理したい場合に便利です。1行の中身をさらにカンマで分割したいときは、Split関数と組み合わせると効率的です。
Sub ReadCsvFile()
Dim filePath As String
Dim fileNo As Integer
Dim oneLine As String
Dim items() As String
filePath = ThisWorkbook.Path & "\sample.csv"
fileNo = FreeFile
Open filePath For Input As #fileNo
Do Until EOF(fileNo)
Line Input #fileNo, oneLine
items = Split(oneLine, ",")
Debug.Print items(0), items(1)
Loop
Close #fileNo
End Sub
既存ファイルに追記する方法
ログファイルのように、既存の内容を残したまま追加で書き込みたい場合はAppendモードを使います。
Sub AppendLog()
Dim filePath As String
Dim fileNo As Integer
filePath = ThisWorkbook.Path & "\log.txt"
fileNo = FreeFile
Open filePath For Append As #fileNo
Print #fileNo, Format(Now, "yyyy/mm/dd hh:nn:ss") & " 処理を実行しました"
Close #fileNo
End Sub
処理の実行タイミングごとにこのコードを呼び出せば、簡易的な実行ログを残すことができます。
エラーを防ぐための注意点
Openステートメントを使う際は、以下の点に注意するとトラブルを防げます。
- Closeし忘れに注意:
Openで開いたファイルは必ずCloseで閉じます。閉じないままだと、次回そのファイルを開こうとしたときにエラーになったり、ファイルが他のアプリから編集できなくなったりします。 - ファイルが存在しない場合:
Inputモードで存在しないファイルを開こうとすると実行時エラーになります。事前にDir関数で存在確認をしておくと安全です。 - 同じファイル番号の重複:
FreeFileを使わずに固定の番号(#1など)を使い回すと、他の処理とファイル番号が衝突してエラーになることがあります。基本的にはFreeFileを使いましょう。
存在確認を加えた安全なコード例は以下の通りです。
Sub SafeReadTextFile()
Dim filePath As String
Dim fileNo As Integer
Dim oneLine As String
filePath = ThisWorkbook.Path & "\sample.txt"
If Dir(filePath) = "" Then
MsgBox "ファイルが見つかりません: " & filePath
Exit Sub
End If
fileNo = FreeFile
Open filePath For Input As #fileNo
Do Until EOF(fileNo)
Line Input #fileNo, oneLine
Debug.Print oneLine
Loop
Close #fileNo
End Sub
まとめ
Openステートメントを使うと、外部ライブラリの参照設定なしに、VBA標準の機能だけでテキストファイルの読み書きが行えます。
- 書き込みは
Output(上書き)とAppend(追記)を使い分ける - 読み込みは
Line InputとEOF関数を組み合わせてループ処理する - ファイル番号は
FreeFileで自動採番し、使い終わったら必ずCloseする
簡易的なログ出力やCSVの読み込みであればOpenステートメントだけで十分対応できます。より高度なファイル操作(フォルダ操作やファイルコピーなど)が必要な場合は、FileSystemObjectの利用もあわせて検討してみてください。


コメント