ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.013

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「テキストファイルの操作」です。

【目次】

  1. テキストファイルの操作について
  2. テキストファイル操作の順序
  3. テキストファイル操作関連の構文
  4. 使用例
  5. 終わりに

それでは、始めましょう!

テキストファイルの操作について

テキストファイルとは、メモ帳などで保存したファイルのことです。

ファイルのプロパティを開いたときに「ファイルの種類:テキストドキュメント(.txt)」と表示されているものはテキストファイルとして扱われます。

ExcelVBAでは、これらのテキストファイルを開いて内容を読み込んだり、書き込んだりできます。
また、ファイル名の末尾がtxtではないファイルであっても、テキスト形式のデータファイルであればExcelマクロで操作可能です。

テキストファイル操作の順序

テキストファイルを操作するには、正しい順序でソースコードを記載する必要があります。

まず、読み込む場合の記述順序です。
1.ファイルを読込専用モードで開く
2.テキスト(文字列)を読み込む
3.ファイルを閉じる

書き込む(または追記する)場合には以下の順序になります。
1.ファイルを書込(または追記)モードで開く
2.テキスト(文字列)を書き込む
3.ファイルを閉じる

簡単にまとめると、「ファイルを開く⇒文字列を読むor書く⇒ファイルを閉じる」の順序になります。

テキストファイル操作関連の構文

まず、テキストファイル操作に使用する「ファイル番号」を定義します。
ファイル番号を定義することで、後続のOpenステートメントでファイルを開けるようになります。
ファイル番号を取得するには、FreeFile関数を使用します。

ファイル番号の変数 = FreeFile

補足:ファイル番号は数字で指定することもできますが、FreeFile関数で取得した番号はマクロ実行中に重複しない番号が使用されるため、番号の割り振りを意識せずに済みます。

続いて、ファイルを開くOpenステートメントです。
ここではファイルを開くモードを指定することができ、「読込」「書込」「追記」が指定できます。
各モードの構文は以下の通りです。
書込と追記の違いは、書込は「データクリアしてから書き込む」追記は「データを残したまま書き込む」という違いがありますので、注意してください。

読込モード⇒ Open ファイルパス For Input As #ファイル番号
書込モード⇒ Open ファイルパス For Output As #ファイル番号
追記モード⇒ Open ファイルパス For Append As #ファイル番号

読込モードでテキストファイルを1行ずつ読み込む場合、繰り返し処理(Do-Loopステートメント)を使用します。
この際、EOF関数でファイルの読み込み終了をチェックします。
EOFはEndOfFileの略です。
繰り返し処理実行中は、Line Inputステートメントで1行ずつ読み込みます。
読み込んだ文字列は、文字列格納用変数に格納されます。

Do Until EOF(ファイル番号)
Line Input #ファイル番号, 文字列格納用変数
Loop

書込モードまたは追記モードの場合、Printステートメントでテキストファイルに文字列を書き込みます。

Print #ファイル番号, 文字列

読込みあるいは書き込みが終わったら、Closeステートメントでファイルを閉じます。

Close #ファイル番号

テキストファイルのOpenやCloseはメモリ上で実行されますので、マクロ実行中は画面上にテキストエディタ(メモ帳など)は表示されません。

使用例

使用例① テキストファイルを読み込む
ファイル選択ダイアログで選択したテキストファイルの内容をExcelシート上に展開します。

Sub ExcelVBA_013_001()
    '使用例① テキストファイルを読み込む
    
    'テキストファイル選択ダイアログ表示
    Dim objFD
    Set objFD = Application.FileDialog(msoFileDialogFilePicker) '選択ダイアログをオブジェクト定義
    Dim FilePath As String
    With objFD
        .AllowMultiSelect = False 'ファイル複数選択を禁止
        If .Show = True Then
            'ダイアログ表示⇒ファイルが選択された場合
            FilePath = .SelectedItems(1) 'ファイルパスを記録する
        Else
            'ダイアログ表示⇒キャンセルボタンが押された場合
            MsgBox "キャンセルされました", vbInformation 'メッセージ表示
            Exit Sub 'マクロ終了
        End If
    End With
    '文字列展開前にExcelシートのデータをクリア
    Cells.Clear
    'テキストファイルの読込み操作
    Dim FileNum
    Dim BufLine
    Dim Cnt As Long
    FileNum = FreeFile 'ファイル番号を取得
    Open FilePath For Input As #FileNum '読込モードでファイルを開く
    Cnt = 0 '読み込み行数のカウンタ
    Do Until EOF(FileNum) '読込終了(EOF)まで繰り返す
        Line Input #FileNum, BufLine '1行読込み
        Cnt = Cnt + 1 '読込み行数をカウントアップ
        Cells(Cnt, 1).Value = BufLine '読み込んだ文字列をExcelシートへ転記する
    Loop
    Close #FileNum 'ファイルを閉じる
    MsgBox "処理が終了しました", vbInformation
End Sub

マクロを実行すると、テキストファイルの内容がExcelシートへ展開されます。

使用例② テキストファイルへ書き込む
ExcelシートのA列の文字列をテキストファイルへ書き込みます。
テキストファイルはExcelマクロファイルの保存されたフォルダにSample.txtという名前で保存されます。

Sub ExcelVBA_013_002()
    '使用例② テキストファイルへ書き込む

    'テキストファイルの書き込み操作
    Dim FileNum
    Dim RowCnt As Long, LastRow As Long
    Dim FilePath As String
    FileNum = FreeFile 'ファイル番号を取得
    FilePath = ThisWorkbook.Path & "\Sample.txt" 'テキストファイルの保存先パスを指定
    Open FilePath For Output As #FileNum   '書込モードでファイルを開く
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'ExcelシートA列の最終行を取得
    For RowCnt = 1 To LastRow '1行目から最終行まで繰り返し
        Print #FileNum, Cells(RowCnt, 1).Value 'ExcelシートA列の値を書き込み
    Next
    Close #FileNum 'ファイルを閉じる
    MsgBox "処理が終了しました", vbInformation
End Sub

マクロを実行すると、Excelシートの文字列がテキストファイルに書き込まれます。

使用例③ テキストファイルへ追記する
ファイル選択ダイアログで選択したテキストファイルへ文字列(例として現在時刻)を追記します。

Sub ExcelVBA_013_003()
    '使用例③ テキストファイルへ追記する

    'テキストファイル選択ダイアログ表示
    Dim objFD
    Set objFD = Application.FileDialog(msoFileDialogFilePicker) '選択ダイアログをオブジェクト定義
    Dim FilePath As String
    With objFD
        .AllowMultiSelect = False 'ファイル複数選択を禁止
        If .Show = True Then
            'ダイアログ表示⇒ファイルが選択された場合
            FilePath = .SelectedItems(1) 'ファイルパスを記録する
        Else
            'ダイアログ表示⇒キャンセルボタンが押された場合
            MsgBox "キャンセルされました", vbInformation 'メッセージ表示
            Exit Sub 'マクロ終了
        End If
    End With
    'テキストファイルの追記操作
    Dim FileNum
    Dim Cnt As Long
    FileNum = FreeFile 'ファイル番号を取得
    Open FilePath For Append As #FileNum '追記モードでファイルを開く
    Print #FileNum, Now 'ファイルに現在時刻を追記する
    Close #FileNum 'ファイルを閉じる
    MsgBox "処理が終了しました", vbInformation
End Sub

マクロを実行すると、指定したファイルの末尾に文字列(現在時刻)が追記されます。

終わりに

以上、Excelマクロでのテキストファイル操作を紹介いたしました。
テキスト形式はさまざまな業務で使われているフォーマットですので、テキストファイル操作できるようになるとExcelマクロづくりの幅はグンと広がります。
インフラ構築の現場ではログファイルに触れる機会が多いので、今回の内容は活かしやすいのではないでしょうか。

それでは、また次回お会いしましょう!