【ExcelVBA・マクロ】Openステートメントの使い方|テキストファイルの読み込み・書き込みを完全解説【コピペOK】

ExcelVBA

Openステートメントとは

ExcelVBAでちょっとしたログファイルを残したい、CSVやテキストファイルの中身を1行ずつ読み込みたい——そんなとき、外部ライブラリを使わずに標準機能だけで完結できるのがOpenステートメントです。

FileSystemObjectのように参照設定やCreateObjectが不要で、VBA単体で完結するのが最大のメリットです。この記事ではOpenステートメントの基本から、テキストファイルの書き込み・読み込み・追記までを、実際に動作するサンプルコード付きで解説します。

Openステートメントは、テキストファイルを直接開いて読み書きするための命令です。ファイルを開くときに「どのモードで開くか」を指定します。

モード 説明
Output 新規書き込み(既存の内容は上書きされる)
Append 追記(ファイル末尾に追加)
Input 読み込み専用

基本の書式は以下の通りです。

Open "ファイルパス" For モード As #ファイル番号

ファイル番号には12といった整数を指定しますが、他の処理とバッティングしないように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

PrintWriteはどちらも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 InputEOF関数を組み合わせてループ処理する
  • ファイル番号はFreeFileで自動採番し、使い終わったら必ずCloseする

簡易的なログ出力やCSVの読み込みであればOpenステートメントだけで十分対応できます。より高度なファイル操作(フォルダ操作やファイルコピーなど)が必要な場合は、FileSystemObjectの利用もあわせて検討してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました