この記事でできること
- 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(手作業テキスト取り込み):
- テキストファイルをメモ帳で開く
- 全選択してコピー
- Excelに貼り付け
- 「区切り位置」で列を分割
- ファイルが複数あれば繰り返し
- 行数が多い日は30分コース
After(VBAで自動取り込み):
- マクロを実行(またはボタンをクリック)
- テキストファイルの内容がExcelに自動で取り込まれる
- 区切り文字で列分割済み
- 完了メッセージで取り込み行数を確認
—
自分もシステム管理の仕事をしていたとき、毎朝サーバーが吐き出す.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 のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す - VBE(Visual Basic Editor)が開く
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
- 白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
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 |
コードの流れ
Dirでファイルの存在を確認Open ... For Inputでテキストファイルを読み取りモードで開くDo Until EOFでファイル末尾まで1行ずつループLine Inputで1行を読み込み、A列のセルに書き出し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" に変更可) |
コードの流れ
- ファイル存在確認:
Dirでチェック - ADODB.Stream生成:
CreateObjectで参照設定不要 - 文字コード指定:
.Charsetで UTF-8 / Shift_JIS を指定 - ファイル読み込み:
LoadFromFileでファイルを開く - 1行ずつ処理:
ReadText(-2)で1行読み込み、Splitで区切り分割 - セルに書き出し: 分割した各フィールドをA列から順に書き出し
ポイント: ADODB.Stream は CreateObject で生成しているため、参照設定が不要でどのPC環境でもそのまま動く。.Type = 2 はテキストモードを意味し、バイナリではなくテキストとして読み込む指定。ReadText(-2) の -2 は adReadLine の定数値で、ストリームから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) |
コードの流れ
- フォルダ存在確認:
Dirでチェック - 既存データクリア: シートを初期化
- ヘッダー出力: ファイル名・行番号・データの列ヘッダーを書き出し
- Dir関数でファイルループ: 指定拡張子のファイルを1つずつ処理
- ADODB.Streamで読み込み: 文字コード指定で文字化け防止
- 区切り分割: Split関数で列分割してセルに書き出し
- 列幅自動調整: 読み込み完了後に列幅を整える
—
よくある落とし穴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つで実行する方法 で ImportTextFileMinimal や ImportMultipleTextFiles をボタンに割り当てる。
—
まとめ
テキストファイルのExcel取り込みは、手作業でやると「開く→コピー→貼り付け→列整形」の繰り返しで時間がかかる。VBAで自動化すれば、どんなに行数が多くてもボタン1つで完了する。
Open/Line Inputでテキストファイルを1行ずつExcelに読み込める(最小版・Shift_JIS)ADODB.Streamで文字コードを指定し、Splitで区切り分割できる(応用版・UTF-8対応)Dir関数で複数ファイルを一括取り込みできる(実務版)- 文字コード・改行コードの違いに注意。迷ったら
ADODB.Stream+UTF-8が安全
まずは最小版で1ファイルの取り込みを試して、動作を確認してから応用版・実務版にステップアップするのがおすすめ。
関連記事
- 複数Excelファイルを1つに統合 — 複数ファイル統合との使い分け
- 複数シートを一括処理する方法 — 取り込み先シートの一括処理
- マクロをボタン1つで実行する方法 — 読み込みマクロをボタンに割り当て
—
次にやりたくなること
- データをCSVファイルに書き出す方法: 読み込んだデータを加工してCSVに書き出し。入力→加工→出力の一連の流れを自動化
- 特定の文字を含むセルを検索してハイライト: 取り込んだログから「ERROR」「WARNING」を検索してハイライト表示
- 正規表現でデータを抽出・変換する方法: ログの中からIPアドレスやタイムスタンプなど特定パターンのデータだけを抽出したい場合に
- 実行ログを自動で記録する方法: 「いつ・何ファイル取り込んだか」をログとして自動記録し、取り込み履歴を残す
- 文字列を分割して別セルに展開する方法: 区切り文字以外のルール(固定長など)でデータを列分割したい場合に
—
もっとカスタマイズしたい場合
「特定の行だけ抽出したい」「複数ファイルを条件で振り分けたい」「固定長ファイルを列分割したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。
相談時に伝えると話が早い情報:
- Excel のバージョン / OS
- テキストファイルの形式(区切り文字・文字コード・拡張子)
- 1ファイルあたりの行数の目安
- 読み込み後の加工内容(集計・フィルタなど)


コメント