TSV連結の基本
CSVと似ていますが、TSV(Tab Separated Values) は「タブ区切り」でデータを保存したテキストファイルです。業務では「CSVはカンマ区切り、TSVはタブ区切り」と使い分けられることが多いです。
ここでは初心者向けに、フォルダ内の複数TSVファイルを連結して1つのシートにまとめる方法 をコード例とテンプレートで解説します。
基本の考え方
- TSV連結とは?
複数のTSVファイルを読み込み、1つのシートに順番に書き込む処理。 - 用途:
- システムから出力された複数TSVをまとめて集計
- 日次ファイルを月次単位で統合
- 手作業のコピー&ペーストを自動化
テンプレ1:フォルダ内のTSVを順番に連結
Sub MergeTSV_Folder()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim fso As Object, folder As Object, file As Object
Dim lineData As String, arr As Variant
Dim rowCount As Long
ws.Cells.Clear
rowCount = 1
' フォルダ選択ダイアログ
Dim folderPath As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "TSVフォルダを選択してください"
If .Show <> -1 Then Exit Sub
folderPath = .SelectedItems(1)
End With
' FileSystemObjectでフォルダ内のファイルを取得
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = "tsv" Then
' TSVを直接読み込み
Open file.Path For Input As #1
Do Until EOF(1)
Line Input #1, lineData
arr = Split(lineData, vbTab) ' ← タブ区切り
ws.Cells(rowCount, 1).Resize(1, UBound(arr) + 1).Value = arr
rowCount = rowCount + 1
Loop
Close #1
End If
Next file
MsgBox "フォルダ内のTSVを連結しました!"
End Sub
VB- ポイント:
Split(lineData, vbTab)でタブ区切りを配列化。Resizeで配列を一括書き込み。- フォルダ内の全TSVを順番に処理。
テンプレ2:ヘッダー行を1回だけ取り込む
複数TSVに同じヘッダーがある場合、最初のファイルだけヘッダーを取り込み、以降はデータ部分だけを連結。
Sub MergeTSV_HeadersOnce()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim fso As Object, folder As Object, file As Object
Dim lineData As String, arr As Variant
Dim rowCount As Long, firstFile As Boolean
ws.Cells.Clear
rowCount = 1
firstFile = True
Dim folderPath As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "TSVフォルダを選択してください"
If .Show <> -1 Then Exit Sub
folderPath = .SelectedItems(1)
End With
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(folderPath)
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = "tsv" Then
Open file.Path For Input As #1
Dim lineCount As Long: lineCount = 0
Do Until EOF(1)
Line Input #1, lineData
arr = Split(lineData, vbTab)
' 最初のファイルはヘッダー込み、それ以降は2行目から
If firstFile Or lineCount > 0 Then
ws.Cells(rowCount, 1).Resize(1, UBound(arr) + 1).Value = arr
rowCount = rowCount + 1
End If
lineCount = lineCount + 1
Loop
Close #1
firstFile = False
End If
Next file
MsgBox "TSVをヘッダー付きで連結しました!"
End Sub
VB- ポイント:
lineCountで行番号を判定。- 最初のファイルはヘッダー込み、それ以降はデータのみ。
テンプレ3:複数ファイル選択でTSV連結
Sub MergeTSV_MultiSelect()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim filePath As Variant
Dim lineData As String, arr As Variant
Dim rowCount As Long
ws.Cells.Clear
rowCount = 1
' 複数ファイル選択
filePath = Application.GetOpenFilename("TSVファイル (*.tsv), *.tsv", , "TSVファイル選択", , True)
If IsArray(filePath) = False Then Exit Sub
Dim i As Long
For i = LBound(filePath) To UBound(filePath)
Open filePath(i) For Input As #1
Do Until EOF(1)
Line Input #1, lineData
arr = Split(lineData, vbTab)
ws.Cells(rowCount, 1).Resize(1, UBound(arr) + 1).Value = arr
rowCount = rowCount + 1
Loop
Close #1
Next i
MsgBox "選択したTSVを連結しました!"
End Sub
VB- ポイント:
GetOpenFilenameのMultiSelect=Trueで複数選択可能。- 選んだファイルを順番に読み込む。
例題で練習
'例1:フォルダ内のTSVを順番に連結
'例2:ヘッダー行を1回だけ取り込む
'例3:複数ファイル選択でTSV連結
VB初心者向けポイント
- CSVとTSVの違いは区切り文字 → CSVは「,」、TSVは「vbTab」。
- フォルダ単位で処理するか、ファイル選択するかを決める。
- ヘッダー行は最初だけ取り込む工夫が必要 → 重複を防げる。
- Split関数+Resizeで効率的に書き込み → 1行ずつ配列で処理。
👉 この「TSV連結テンプレ」を覚えておけば、Excel VBAで 複数TSVファイルを効率的に連結して1つのシートにまとめる処理 を簡単に作成できます。
