【VBA】テキストファイル(txt/log)をExcelに取り込む方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でできること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. 読み込むテキストファイルを確認する
    2. テキストファイルの形式を確認する
    3. Excelをマクロ有効ブック(.xlsm)で保存する
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(最小版)– テキストファイルをExcelに読み込み
    1. 書き換えポイント
    2. コードの流れ
  7. コード(応用版)– CSV/TSV区切り分割+文字コード指定
    1. 書き換えポイント
    2. コードの流れ
  8. コード(実務版)– 複数ファイル一括取り込み
    1. 書き換えポイント
    2. コードの流れ
  9. よくある落とし穴5選
    1. 1. 文字コード違いで文字化けする
    2. 2. 改行コードの違いで1行にまとまってしまう
    3. 3. 大容量ファイルでExcelがフリーズする
    4. 4. 区切り文字がデータ内に含まれている
    5. 5. Dirの戻り値が空でエラーになる
    6. VBA テキストファイル 読み込み 文字化けの原因と対処
    7. VBA ログファイル Excel 取り込めないときの確認ポイント
    8. VBA テキストファイル 大量データ 読み込み遅い場合の高速化
  10. FAQ
    1. Q1: 特定の行だけ読み込みたい(ヘッダー行をスキップ)
    2. Q2: 特定の文字を含む行だけ取り込みたい
    3. Q3: 読み込み先のシートを新規作成したい
    4. Q4: 読み込んだデータをCSVに書き出したい
    5. Q5: ボタン1つで取り込みを実行したい
  11. まとめ
    1. 関連記事
  12. 次にやりたくなること
  13. もっとカスタマイズしたい場合

この記事でできること

  • VBAでテキストファイル(txt/log)をExcelに自動で読み込める
  • CSV・TSVなど区切り文字を指定して列分割できる(応用版)
  • UTF-8のテキストファイルも文字化けなしで読み込める(応用版)
  • フォルダ内の複数テキストファイルを一括取り込みできる(実務版)

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

  • サーバーやシステムが毎日吐き出すログファイル(.log/.txt)をExcelに取り込んでエラー件数を集計したい
  • CSVやTSV形式のデータファイルを区切り文字で列分割してExcelで分析したい
  • UTF-8で出力されたテキストファイルを文字化けなしでExcelに読み込みたい
  • フォルダに溜まった1週間分のログファイルをまとめて一括取り込みしたい
  • 手作業のコピペ取り込みをやめて、ボタン1つで毎朝の定型作業を終わらせたい

完成イメージ(Before / After)

Before(手作業テキスト取り込み):

  1. テキストファイルをメモ帳で開く
  2. 全選択してコピー
  3. Excelに貼り付け
  4. 「区切り位置」で列を分割
  5. ファイルが複数あれば繰り返し
  6. 行数が多い日は30分コース

After(VBAで自動取り込み):

  1. マクロを実行(またはボタンをクリック)
  2. テキストファイルの内容がExcelに自動で取り込まれる
  3. 区切り文字で列分割済み
  4. 完了メッセージで取り込み行数を確認

自分もシステム管理の仕事をしていたとき、毎朝サーバーが吐き出す.logファイルをメモ帳で開いてExcelにコピペしていた。ドラッグ&ドロップで開くと文字化けする。メモ帳経由でコピペすると列がぐちゃぐちゃ。行数が多い日は貼り付けだけで10分、「区切り位置」で列を整形するところまで入れると30分コース。品管担当に「今日のエラー件数は?」と聞かれても、取り込みが終わるまで答えられなかった。VBAで読み込みを自動化してからは、ボタン1つで完了。朝の30分が5秒になった。同じように毎日のログ確認で時間を取られている人に、この記事でワンクリック化を体験してほしい。

テキストファイルの「読み込み」を自動化すれば、集計・分析に時間を使える。書き出しの自動化は データをCSVファイルに書き出す方法 を参照。

実行前の準備

読み込むテキストファイルを確認する

読み込むテキストファイルのパスを確認しておく。エクスプローラーでファイルを右クリック →「パスのコピー」が確実。

例: C:\Users\tanaka\Documents\logs\server.log

テキストファイルの形式を確認する

  • 区切り文字: カンマ区切り(CSV)、タブ区切り(TSV)、スペース区切り、区切りなし(1行1データ)
  • 文字コード: Shift_JIS(Windows標準)か UTF-8 か
  • メモ帳で開いて文字化けしなければShift_JIS。文字化けするならUTF-8の可能性が高い

Excelをマクロ有効ブック(.xlsm)で保存する

拡張子が .xlsx のままだとマクロが保存できない。

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す
  2. VBE(Visual Basic Editor)が開く

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」
  2. 白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Alt + F8 → マクロ名を選んで「実行」

ボタンに割り当てれば毎回Alt+F8を押さなくて済む。方法は マクロをボタン1つで実行する方法 を参照。

コード(最小版)– テキストファイルをExcelに読み込み


'============================================================
' ■ テキストファイルをExcelに読み込み(最小版)
'   → Open / Line Input で1行ずつ読み込み
'   → 1行1行をA列に順番に書き出し
'   → 文字コードは Shift_JIS(Windows標準)
'============================================================
Sub ImportTextFileMinimal()

    '--- ★書き換えポイント ---
    Dim filePath As String
    filePath = "C:\Users\tanaka\Documents\logs\server.log"  '← 読み込むファイル

    Dim sheetName As String
    sheetName = "Sheet1"           '← 書き出し先のシート名

    Dim startRow As Long
    startRow = 1                   '← 書き出し開始行
    '--- ★ここまで ---

    '--- ファイルの存在確認
    If Dir(filePath) = "" Then
        MsgBox "ファイルが見つかりません。" & vbCrLf & _
               filePath, vbExclamation
        Exit Sub
    End If

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(sheetName)

    '--- テキストファイルを開く
    Dim fileNum As Integer
    fileNum = FreeFile
    Open filePath For Input As #fileNum

    '--- 1行ずつ読み込んでセルに書き出し
    Dim lineText As String
    Dim rowIdx As Long
    rowIdx = startRow

    Do Until EOF(fileNum)
        Line Input #fileNum, lineText
        ws.Cells(rowIdx, 1).Value = lineText
        rowIdx = rowIdx + 1
    Loop

    Close #fileNum

    MsgBox (rowIdx - startRow) & " 行を読み込みました。" & vbCrLf & _
           "ファイル: " & filePath, vbInformation

End Sub

書き換えポイント

変数 説明 初期値
filePath 読み込むテキストファイルのフルパス "C:\Users\tanaka\Documents\logs\server.log"
sheetName 書き出し先のシート名 "Sheet1"
startRow 書き出しを開始する行番号 1

コードの流れ

  1. Dir でファイルの存在を確認
  2. Open ... For Input でテキストファイルを読み取りモードで開く
  3. Do Until EOF でファイル末尾まで1行ずつループ
  4. Line Input で1行を読み込み、A列のセルに書き出し
  5. Close でファイルを閉じる

ポイント: FreeFile は使われていないファイル番号を自動で取得する関数で、複数のファイルを同時に扱う場合でも番号が衝突しない。Open ... For Input はファイルを「読み取り専用」で開くモードで、書き込みは行われないため元ファイルが壊れる心配はない。Line Input は改行コード(CRLFまたはLF)で行を区切り、1行分のテキストを変数に格納する。改行のないファイルは全体が1行として読み込まれる点に注意。Dir関数でファイル操作する方法は フォルダ内ファイル一覧を自動取得 も参照。

コード(応用版)– CSV/TSV区切り分割+文字コード指定

実務では「カンマ区切りのCSVを列分割して取り込みたい」「UTF-8のログファイルを文字化けなしで読みたい」ケースが多い。ADODB.Streamで文字コードを指定し、Split関数で区切り文字を分割する。

UTF-8のログファイルをOpen文で読み込んだら全角文字が文字化け。Shift_JIS前提だと気づくまで20分かかった。ADODB.Streamに切り替えてからは文字化けゼロになった。


'============================================================
' ■ テキストファイル読み込み — 区切り分割+文字コード指定(応用版)
'   → ADODB.Stream で文字コードを指定(UTF-8 / Shift_JIS)
'   → Split関数で区切り文字(カンマ/タブ)ごとに列分割
'============================================================
Sub ImportTextFileAdvanced()

    '--- ★書き換えポイント ---
    Dim filePath As String
    filePath = "C:\Users\tanaka\Documents\logs\data.txt"  '← 読み込むファイル

    Dim sheetName As String
    sheetName = "Sheet1"           '← 書き出し先のシート名

    Dim startRow As Long
    startRow = 1                   '← 書き出し開始行

    Dim delimiter As String
    delimiter = ","                '← 区切り文字("," or vbTab or " ")

    Dim charSet As String
    charSet = "UTF-8"              '← 文字コード("UTF-8" or "Shift_JIS")
    '--- ★ここまで ---

    '--- ファイルの存在確認
    If Dir(filePath) = "" Then
        MsgBox "ファイルが見つかりません。" & vbCrLf & _
               filePath, vbExclamation
        Exit Sub
    End If

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(sheetName)

    '--- ADODB.Stream でテキストファイルを開く
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")

    stream.Type = 2              '← adTypeText(テキストモード)
    stream.charSet = charSet
    stream.Open
    stream.LoadFromFile filePath

    '--- 1行ずつ読み込んでセルに書き出し
    Dim lineText As String
    Dim rowIdx As Long
    Dim fields As Variant
    Dim j As Long

    rowIdx = startRow

    Do Until stream.EOS
        lineText = stream.ReadText(-2)   '← -2 = adReadLine(1行読み込み)

        '--- 空行はスキップ
        If Len(Trim(lineText)) > 0 Then
            '--- 区切り文字で分割
            fields = Split(lineText, delimiter)

            For j = 0 To UBound(fields)
                ws.Cells(rowIdx, j + 1).Value = Trim(fields(j))
            Next j

            rowIdx = rowIdx + 1
        End If
    Loop

    stream.Close
    Set stream = Nothing

    MsgBox (rowIdx - startRow) & " 行を読み込みました。" & vbCrLf & _
           "ファイル: " & filePath & vbCrLf & _
           "文字コード: " & charSet, vbInformation

End Sub

書き換えポイント

変数 説明 初期値
filePath 読み込むテキストファイルのフルパス "C:\Users\tanaka\Documents\logs\data.txt"
sheetName 書き出し先のシート名 "Sheet1"
startRow 書き出し開始行 1
delimiter 区切り文字 "," (タブなら vbTab、スペースなら " "
charSet 文字コード "UTF-8""Shift_JIS" に変更可)

コードの流れ

  1. ファイル存在確認: Dir でチェック
  2. ADODB.Stream生成: CreateObject で参照設定不要
  3. 文字コード指定: .Charset で UTF-8 / Shift_JIS を指定
  4. ファイル読み込み: LoadFromFile でファイルを開く
  5. 1行ずつ処理: ReadText(-2) で1行読み込み、Split で区切り分割
  6. セルに書き出し: 分割した各フィールドをA列から順に書き出し

ポイント: ADODB.StreamCreateObject で生成しているため、参照設定が不要でどのPC環境でもそのまま動く。.Type = 2 はテキストモードを意味し、バイナリではなくテキストとして読み込む指定。ReadText(-2)-2adReadLine の定数値で、ストリームから1行だけ読み取る。Split 関数は指定した区切り文字で文字列を配列に分割し、各要素を別々のセルに書き出している。

テキストファイル読み込みマクロをボタン(マクロをボタン1つで実行する方法)に割り当てれば、毎朝の取り込みがボタン1つで完了する。

コード(実務版)– 複数ファイル一括取り込み

フォルダに溜まった1週間分のログファイルを一括取り込みできるようにしてから、月曜朝の集計作業が劇的に楽になった。


'============================================================
' ■ 複数テキストファイル一括取り込み(実務版)
'   → 指定フォルダ内の txt/log ファイルを全て読み込み
'   → ADODB.Stream で文字コード指定
'   → 区切り文字で列分割
'   → ファイルごとに区切り行を挿入(任意)
'============================================================
Sub ImportMultipleTextFiles()

    '--- ★書き換えポイント ---
    Dim folderPath As String
    folderPath = "C:\Users\tanaka\Documents\logs\"  '← 読み込むフォルダ

    Dim fileExtension As String
    fileExtension = "*.log"        '← 対象ファイル("*.txt" or "*.log" or "*.csv")

    Dim sheetName As String
    sheetName = "Sheet1"           '← 書き出し先のシート名

    Dim delimiter As String
    delimiter = vbTab               '← 区切り文字("," or vbTab or " ")

    Dim charSet As String
    charSet = "UTF-8"              '← 文字コード("UTF-8" or "Shift_JIS")

    Dim insertSeparator As Boolean
    insertSeparator = True         '← ファイル間に区切り行を入れるか
    '--- ★ここまで ---

    '--- パスの末尾に \ を付ける
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"

    '--- フォルダの存在確認
    If Dir(folderPath, vbDirectory) = "" Then
        MsgBox "フォルダが見つかりません。" & vbCrLf & _
               folderPath, vbExclamation
        Exit Sub
    End If

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(sheetName)

    '--- 既存データをクリア
    ws.Cells.Clear

    '--- ヘッダー行(任意)
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "行番号"
    ws.Cells(1, 3).Value = "データ"
    ws.Range("A1:C1").Font.Bold = True

    Dim rowIdx As Long
    rowIdx = 2           '← データ開始行(ヘッダーの次)

    Dim fileCount As Long
    fileCount = 0

    Dim totalLines As Long
    totalLines = 0

    '--- フォルダ内のファイルをループ
    Dim fileName As String
    fileName = Dir(folderPath & fileExtension)

    Do While fileName <> ""

        Dim fullPath As String
        fullPath = folderPath & fileName

        '--- 区切り行を挿入
        If insertSeparator And fileCount > 0 Then
            ws.Cells(rowIdx, 1).Value = "---"
            ws.Cells(rowIdx, 1).Font.Bold = True
            rowIdx = rowIdx + 1
        End If

        '--- ADODB.Stream でファイルを開く
        Dim stream As Object
        Set stream = CreateObject("ADODB.Stream")

        stream.Type = 2
        stream.charSet = charSet
        stream.Open
        stream.LoadFromFile fullPath

        '--- 1行ずつ読み込み
        Dim lineText As String
        Dim lineNum As Long
        lineNum = 0

        Do Until stream.EOS
            lineText = stream.ReadText(-2)
            lineNum = lineNum + 1

            '--- 空行はスキップ
            If Len(Trim(lineText)) > 0 Then
                ws.Cells(rowIdx, 1).Value = fileName
                ws.Cells(rowIdx, 2).Value = lineNum

                '--- 区切り文字で分割
                If Len(delimiter) > 0 And delimiter <> "" Then
                    Dim fields As Variant
                    fields = Split(lineText, delimiter)
                    Dim j As Long
                    For j = 0 To UBound(fields)
                        ws.Cells(rowIdx, 3 + j).Value = Trim(fields(j))
                    Next j
                Else
                    ws.Cells(rowIdx, 3).Value = lineText
                End If

                rowIdx = rowIdx + 1
                totalLines = totalLines + 1
            End If
        Loop

        stream.Close
        Set stream = Nothing

        fileCount = fileCount + 1
        fileName = Dir()   '← 次のファイル
    Loop

    '--- 列幅を自動調整
    ws.Columns("A:Z").AutoFit

    If fileCount = 0 Then
        MsgBox "対象ファイルが見つかりませんでした。" & vbCrLf & _
               "フォルダ: " & folderPath & vbCrLf & _
               "対象: " & fileExtension, vbExclamation
    Else
        MsgBox fileCount & " ファイル、合計 " & totalLines & " 行を読み込みました。" & vbCrLf & _
               "フォルダ: " & folderPath, vbInformation
    End If

End Sub

書き換えポイント

変数 説明 初期値
folderPath 読み込むフォルダのパス "C:\Users\tanaka\Documents\logs\"
fileExtension 対象ファイルの拡張子 "*.log""*.txt""*.csv" に変更可)
sheetName 書き出し先のシート名 "Sheet1"
delimiter 区切り文字 vbTab(カンマなら ","
charSet 文字コード "UTF-8""Shift_JIS" に変更可)
insertSeparator ファイル間の区切り行 True(不要なら False

コードの流れ

  1. フォルダ存在確認: Dir でチェック
  2. 既存データクリア: シートを初期化
  3. ヘッダー出力: ファイル名・行番号・データの列ヘッダーを書き出し
  4. Dir関数でファイルループ: 指定拡張子のファイルを1つずつ処理
  5. ADODB.Streamで読み込み: 文字コード指定で文字化け防止
  6. 区切り分割: Split関数で列分割してセルに書き出し
  7. 列幅自動調整: 読み込み完了後に列幅を整える

よくある落とし穴5選

1. 文字コード違いで文字化けする

自分もこれで20分溶かした。UTF-8のログファイルを Open 文(Shift_JIS固定)で読み込んだら、全角文字が全部文字化け。原因に気づくまで「ファイルが壊れた?」と焦った。

対策: UTF-8のファイルは応用版・実務版の ADODB.Stream を使う。charSet"UTF-8" に設定する。

2. 改行コードの違いで1行にまとまってしまう

原因: Mac/Linuxで作成されたファイルは改行コードが LF(\n)のみ。Line Input は CR+LF(\r\n)を前提としているため、ファイル全体が1行として読み込まれることがある。

対策: ADODB.Streamの ReadText(-2) は LF のみの改行にも対応している。応用版のコードを使えば解決する。

3. 大容量ファイルでExcelがフリーズする

原因: 数十万行のテキストファイルを一度に読み込むとメモリ不足になる。

対策: 読み込み行数に上限を設ける。例:If rowIdx > 100000 Then Exit Do

4. 区切り文字がデータ内に含まれている

原因: カンマ区切りのファイルで、データ内にカンマが含まれていると列がずれる。

対策: ダブルクォートで囲まれたフィールドを正しく処理するには、単純な Split ではなく専用の解析処理が必要。CSVファイルの場合は データをCSVファイルに書き出す方法 のダブルクォート処理を参考にする。

5. Dirの戻り値が空でエラーになる

原因: Dir(folderPath & "*.txt") で対象ファイルがない場合、空文字が返る。存在確認なしで読み込もうとするとエラー。

対策: 実務版では Do While fileName <> "" で空文字チェックしている。ファイルがない場合はメッセージを表示して終了する。

VBA テキストファイル 読み込み 文字化けの原因と対処

テキストファイルをVBAで読み込んだときに文字化けする原因は、ほぼ100%「文字コードの不一致」。VBAの Open 文はShift_JIS固定で読み込むため、UTF-8やUTF-8 BOM付きのファイルを開くと日本語が全て化ける。対処法はシンプルで、ADODB.Stream に切り替えて .Charset = "UTF-8" を指定すること。どちらの文字コードかわからない場合は、メモ帳でファイルを開いて右下のステータスバーに表示される文字コードを確認する。それでも解決しない場合は、全角半角を変換する方法文字列を置換する方法で取り込み後にデータを修正するアプローチもある。

VBA ログファイル Excel 取り込めないときの確認ポイント

「マクロを実行してもログファイルが取り込めない」場合、まず確認すべきは3つ。1つ目はファイルパスの指定ミス。パスに全角スペースや日本語フォルダ名が含まれていないか、ファイルの存在確認のコードで事前チェックするのが確実。2つ目はファイルが他のプログラムで開かれたままロックされているケース。サーバーがログを書き込み中だと Open 文でエラーになることがある。この場合はファイルをコピーしてからコピー先を読み込むと回避できる。3つ目は拡張子フィルタの不一致。実務版で "*.log" を指定しているのに実際のファイルが .txt だった、というのはよくあるミス。

VBA テキストファイル 大量データ 読み込み遅い場合の高速化

数万行以上のテキストファイルを読み込むと処理が遅くなる場合がある。原因は1行ごとにセルへ書き込む処理がボトルネックになっているため。対処法は、まず Application.ScreenUpdating = False で画面更新を止めること。さらに高速化したい場合は、一度配列にデータを溜めてからまとめてセルに書き出す方法が有効。処理時間を計測する方法で改善前後の速度を比較すると効果が実感できる。

FAQ

Q1: 特定の行だけ読み込みたい(ヘッダー行をスキップ)

行カウンターで制御する:


Dim lineNum As Long
lineNum = 0

Do Until EOF(fileNum)
    Line Input #fileNum, lineText
    lineNum = lineNum + 1
    If lineNum >= 2 Then   '← 2行目から読み込み(1行目=ヘッダーをスキップ)
        ws.Cells(rowIdx, 1).Value = lineText
        rowIdx = rowIdx + 1
    End If
Loop

Q2: 特定の文字を含む行だけ取り込みたい

InStr で条件判定する:


If InStr(lineText, "ERROR") > 0 Then   '← "ERROR"を含む行だけ取り込み
    ws.Cells(rowIdx, 1).Value = lineText
    rowIdx = rowIdx + 1
End If

Q3: 読み込み先のシートを新規作成したい

シートの存在を確認し、なければ追加する:


Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Worksheets(sheetName)
On Error GoTo 0

If ws Is Nothing Then
    Set ws = ThisWorkbook.Worksheets.Add
    ws.Name = sheetName
End If

Q4: 読み込んだデータをCSVに書き出したい

データをCSVファイルに書き出す方法 を参照。読み込み→加工→書き出しの一連の流れを自動化できる。

Q5: ボタン1つで取り込みを実行したい

マクロをボタン1つで実行する方法ImportTextFileMinimalImportMultipleTextFiles をボタンに割り当てる。

まとめ

テキストファイルのExcel取り込みは、手作業でやると「開く→コピー→貼り付け→列整形」の繰り返しで時間がかかる。VBAで自動化すれば、どんなに行数が多くてもボタン1つで完了する。

  • Open/Line Input でテキストファイルを1行ずつExcelに読み込める(最小版・Shift_JIS)
  • ADODB.Stream で文字コードを指定し、Split で区切り分割できる(応用版・UTF-8対応)
  • Dir 関数で複数ファイルを一括取り込みできる(実務版)
  • 文字コード・改行コードの違いに注意。迷ったら ADODB.Stream + UTF-8 が安全

まずは最小版で1ファイルの取り込みを試して、動作を確認してから応用版・実務版にステップアップするのがおすすめ。

関連記事

次にやりたくなること

もっとカスタマイズしたい場合

「特定の行だけ抽出したい」「複数ファイルを条件で振り分けたい」「固定長ファイルを列分割したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。

相談時に伝えると話が早い情報:

  • Excel のバージョン / OS
  • テキストファイルの形式(区切り文字・文字コード・拡張子)
  • 1ファイルあたりの行数の目安
  • 読み込み後の加工内容(集計・フィルタなど)

コメント

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