【VBA】テキストファイルの中身をエクセルに出力してみた

VBA VBA

Excelのマクロ機能を利用してテキストファイルの中身をエクセルに出力してみました。

広告

実行するスクリプトの流れ

実行するスクリプトは以下の流れで実行します。

  • ①:「C:\hogehoge\」フォルダから[hoge]で始まり、拡張子が[.txt]であるものを取得し
      ※この時取得したファイルのフルパスをメッセージBOXで出力
  • ②:上記①で取得したテキストファイルの内容をエクセルのセルに書き込む

今回は hogehoge から始まるファイル名として [hogehoge12345.txt] を用意して実行してみました。
ファイルの内容は以下のように記載しています。

[hogehoge12345.txt]の中身

スクリプト

Sub hogehoge()

    '➀特定のファイルを取得
    Dim fso As Object
    Dim folder_path, file_path
    Dim folder_list, file_item

    Set fso = CreateObject("Scripting.FileSystemObject")
    folder_path = "C:\hogehoge\"
    Set folder_list = fso.GetFolder(folder_path)

    For Each file_item In folder_list.Files
        If LCase(fso.GetExtensionName(file_item.Name)) = "txt" Then
            If file_item.Name Like "hoge*.txt" Then
                file_path = folder_path & file_item.Name
                MsgBox file_path
            End If
        End If
    Next
    Set fso = Nothing

    '➁テキストファイルの内容をエクセルのセルに書き込む
    Open file_path For Input As #1

    Dim buf, r
    r = 1
    
    Do Until EOF(1)
        Line Input #1, buf
            Cells(r, 1) = buf
        Next
        r = r + 1
    Loop
    
    Close #1

End Sub

スクリプトの解説

➀特定のファイルを取得

    Dim fso As Object
    Dim folder_path, file_path
    Dim folder_list, file_item

4~6行目では、変数を定義します。

    Set fso = CreateObject("Scripting.FileSystemObject")
    folder_path = "C:\hogehoge\"
    Set folder_list = fso.GetFolder(folder_path)

↑8~10行目では、[fso]を定義しオブジェクト化、パスの変数を定義、フォルダの一覧情報を取得して変数 [folder_list] にその値を格納します。

    Set fso = CreateObject("Scripting.FileSystemObject")
    folder_path = "C:\hogehoge\"
    Set folder_list = fso.GetFolder(folder_path)

    For Each file_item In folder_list.Files
        If LCase(fso.GetExtensionName(file_item.Name)) = "txt" Then
            If file_item.Name Like "hoge*.txt" Then
                file_path = folder_path & file_item.Name
                MsgBox file_path
            End If
        End If
    Next
    Set fso = Nothing

12~20行目では、for文を用いて変数 [folder_list] の値すべてに対して「もし拡張子がtxtであり、ファイル名がhoge*.txt(*はどんな文字・文字数でも可)であったならば、そのファイル名のフルパスを[file_path]という変数に格納して、[MsgBox]を利用してポップアップとして出力させる」という処理を実行します。

➁テキストファイルの内容をエクセルのセルに書き込む

    Open file_path For Input As #1

↑23行目では、Openステートメントを利用してファイルを開き、[#]でファイル番号を指定します。

    Dim buf, r
    r = 1

↑25,26行目では、変数を定義して、「r」に値を入れます。

    Do Until EOF(1)
        Line Input #1, buf
            Cells(r, 1) = buf
        Next
        r = r + 1
    Loop

↑28~33行目では、EOF関数を利用して、読み込んでいるファイルの末尾まで繰り返し処理を行います。引数は5段落目で指定したファイル番号です。
繰り返し処理の内容は、「テキストファイルを1行目から順番に読み込み、読み込んだ値をエクセルの今開いているシートのA列の1行目から順番に格納していく」という処理になります。

    Close #1

↑最後の35行目で、Openステートメントで開いたファイルを閉じます。

スクリプトの実行結果

まず、メッセージボックスにテキストファイルのフルパスが出力されます。

vbaの実行結果(メッセージボックスにテキストファイルのフルパスが出力される)

その後、OKを押すとA列に文字列が入力されます。

vbaの実行結果(A列に文字列が入力される)

これで特定のファイルを取得してファイルの中身をエクセルに出力することができました。

[参考] 条件に一致するファイルが複数ある場合の挙動について

今回のスクリプトでは、「For Each」を利用しているのでそれぞれのファイル名に対してポップアップが出ます。

試しに [hogehoge12345.txt] の他に [hogehoge1.txt] というテキストファイルを用意して再度実行してみます。

実行結果

以下のようにそれぞれのファイル名に対して、連続してポップアップが出ます。

実行結果(メッセージボックスに [hogehoge1.txt] と表示される)
実行結果(メッセージボックスに [hogehoge12345.txt] と表示される)

さいごに

テキストファイルの文字をエクセルに転記する必要があったときに、マクロを組めば簡単にできないかなと思い作成してみました。

他にもエクセルを利用して効率的に作業ができたらその内容を紹介していきたいと思います。

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