Excel VBA 逆引き集 | TSVを読み込み

Excel VBA
スポンサーリンク

TSVを読み込み

TSV(Tab Separated Values)は「タブ区切りのテキストファイル」。CSVとほぼ同じですが、区切り文字がカンマではなく タブ です。業務ではログやシステム出力でよく使われます。初心者向けに最短コードから安全テンプレまで整理しました。


基本:Workbooks.Openでそのまま開く

Sub TsvOpen_Basic()
    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\Data\data.tsv")
    MsgBox "開いたブック名: " & wb.Name
    wb.Close SaveChanges:=False
End Sub
VB
  • ポイント:
    • Excelは拡張子が .tsv でも自動でタブ区切りとして開いてくれる。
    • 手軽だが、型変換(先頭ゼロ落ち、日付変換)に注意。

区切りを指定して読み込む(OpenText)

Sub TsvImport_OpenText()
    Workbooks.OpenText _
        Filename:="C:\Data\data.tsv", _
        DataType:=xlDelimited, _
        Tab:=True, _                          'タブ区切りを指定
        TextQualifier:=xlTextQualifierDoubleQuote, _
        Local:=True, _
        FieldInfo:=Array( _
            Array(1, 2), _                    '1列目はテキスト(先頭ゼロ保持)
            Array(2, 1), _                    '2列目は一般
            Array(3, 1))                      '3列目は一般
End Sub
VB
  • ポイント:
    • Tab:=True を指定するとタブ区切りで読み込む。
    • FieldInfo で列ごとの型を指定できる。品番や郵便番号は「文字列」にして桁落ち防止。

シートへ直接インポート(QueryTables)

Sub TsvImport_QueryTables()
    Dim ws As Worksheet: Set ws = ActiveSheet
    With ws.QueryTables.Add(Connection:="TEXT;C:\Data\data.tsv", Destination:=ws.Range("A1"))
        .TextFileTabDelimiter = True
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileColumnDataTypes = Array(xlTextFormat, xlGeneralFormat, xlGeneralFormat)
        .Refresh BackgroundQuery:=False
    End With
End Sub
VB
  • ポイント:
    • QueryTablesは「データ取り込みウィザード」をVBAで自動化したもの。
    • 列型や文字コードを制御できるので業務で安定。

1行ずつ読み込む(Line Input)

Sub TsvRead_LineInput()
    Dim fn As Integer, line As String, parts As Variant
    Dim r As Long, i As Long
    fn = FreeFile
    Open "C:\Data\data.tsv" For Input As #fn
    r = 2
    Do Until EOF(fn)
        Line Input #fn, line
        parts = Split(line, vbTab)            'タブ区切りで分割
        For i = LBound(parts) To UBound(parts)
            Cells(r, i + 1).Value = parts(i)
        Next i
        r = r + 1
    Loop
    Close #fn
End Sub
VB
  • ポイント:
    • Split(line, vbTab) でタブ区切りを分割。
    • 柔軟に加工できるので、ログや特殊フォーマットに向く。

UTF-8/BOM付きTSVを読み込む(ADODB.Stream)

Sub TsvRead_UTF8()
    Dim st As Object, text As String, lines As Variant
    Set st = CreateObject("ADODB.Stream")
    st.Type = 2
    st.Charset = "UTF-8"
    st.Open
    st.LoadFromFile "C:\Data\data_utf8.tsv"
    text = st.ReadText
    st.Close

    lines = Split(text, vbCrLf)
    Dim r As Long, parts As Variant, i As Long
    r = 2
    For i = LBound(lines) To UBound(lines)
        If Len(lines(i)) > 0 Then
            parts = Split(lines(i), vbTab)
            Range("A" & r).Resize(1, UBound(parts) + 1).Value = parts
            r = r + 1
        End If
    Next
End Sub
VB
  • ポイント:
    • UTF-8のTSVでも文字化けしにくい。
    • BOM付きでも安定して読み込める。

例題で練習

例題1:相対パスのTSVを開く

Sub Example_OpenRelative()
    Dim p As String: p = ThisWorkbook.Path & "\input.tsv"
    Workbooks.OpenText Filename:=p, DataType:=xlDelimited, Tab:=True, Local:=True
End Sub
VB

例題2:TSVを選んで読み込む(ダイアログ)

Sub Example_TsvPicker()
    Dim sel As Variant
    sel = Application.GetOpenFilename("TSVファイル (*.tsv),*.tsv", , "TSVを選択")
    If sel = False Then Exit Sub
    Workbooks.OpenText Filename:=sel, DataType:=xlDelimited, Tab:=True, Local:=True
End Sub
VB

例題3:TSVを1行ずつ読み込み、空白は「N/A」で補完

Sub Example_TsvFillBlanks()
    Dim fn As Integer, line As String, parts As Variant, r As Long, i As Long
    fn = FreeFile
    Open "C:\Data\data.tsv" For Input As #fn
    r = 2
    Do Until EOF(fn)
        Line Input #fn, line
        parts = Split(line, vbTab)
        For i = LBound(parts) To UBound(parts)
            If Trim(parts(i)) = "" Then
                Cells(r, i + 1).Value = "N/A"
            Else
                Cells(r, i + 1).Value = parts(i)
            End If
        Next i
        r = r + 1
    Loop
    Close #fn
End Sub
VB

実務の落とし穴と対策

  • 文字コード: Shift-JIS前提のOpenTextはUTF-8で文字化けすることがある → ADODB.Streamで指定。
  • 先頭ゼロ落ち: 郵便番号や品番は「文字列型」で取り込む。
  • 日付変換: 「20250101」が勝手に日付になる → FieldInfoで文字列指定。
  • 改行やタブ混在: Line Input+Splitは簡易対応。厳密にはOpenText/QueryTablesが安全。
  • 複数ファイル: FileDialogで選択→ループで処理。
タイトルとURLをコピーしました