Excel VBA 逆引き集 | TSV連結

Excel VBA
スポンサーリンク

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
  • ポイント:
    • GetOpenFilenameMultiSelect=True で複数選択可能。
    • 選んだファイルを順番に読み込む。

例題で練習

'例1:フォルダ内のTSVを順番に連結
'例2:ヘッダー行を1回だけ取り込む
'例3:複数ファイル選択でTSV連結
VB

初心者向けポイント

  • CSVとTSVの違いは区切り文字 → CSVは「,」、TSVは「vbTab」。
  • フォルダ単位で処理するか、ファイル選択するかを決める
  • ヘッダー行は最初だけ取り込む工夫が必要 → 重複を防げる。
  • Split関数+Resizeで効率的に書き込み → 1行ずつ配列で処理。

👉 この「TSV連結テンプレ」を覚えておけば、Excel VBAで 複数TSVファイルを効率的に連結して1つのシートにまとめる処理 を簡単に作成できます。

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