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でも自動でタブ区切りとして開いてくれる。 - 手軽だが、型変換(先頭ゼロ落ち、日付変換)に注意。
- Excelは拡張子が
区切りを指定して読み込む(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で選択→ループで処理。
