エクセルのVBAでの汎用的なCSVを読み込む関数を作ってみました。
readCSVwithDoubleQuatation関数は、”で囲まれていて、カンマで区切られているCSV用の関数です。
readCSVwithSingleQuatation関数は、’で囲まれていて、カンマで区切られているCSV用の関数です。
readCSVwithNoQuatation関数は、カンマで区切られているだけのCSV用の関数です。
analyseCSV関数はCSVファイルを読み込むためのメインの処理の関数です。
CSVファイルをただ読み込むならエクセルで開くのが簡単ですが、ただ読み込むだけではなく、読み込んだ時に何かしらの処理をしたい場合にひな形になるVBAです。
analyseCSV関数の中の「'do something」の所で処理したい内容を書き込む
とよいと思います。
なお、読み込んだデータは表示されているシートに読み込まれます。
Option Explicit
'カンマで区切られて、各データが"(ダブルクォーテーション)で囲まれているファイル用
Public Sub readCSVwithDoubleQuatation()
Dim FD As FileDialog, f As Variant
Set FD = Application.FileDialog(msoFileDialogOpen)
With FD
With .Filters
.Clear
.Add "テキストファイル", "*.csv;*.txt", 1
End With
If .Show = True Then
Debug.Print .SelectedItems(1)
Call analyseCSV(.SelectedItems(1), """")
End If
End With
End Sub
'カンマで区切られて、各データが'(シングルクォーテーション)で囲まれているファイル用
Public Sub readCSVwithSingleQuatation()
Dim FD As FileDialog, f As Variant
Set FD = Application.FileDialog(msoFileDialogOpen)
With FD
With .Filters
.Clear
.Add "テキストファイル", "*.csv;*.txt", 1
End With
If .Show = True Then
Debug.Print .SelectedItems(1)
Call analyseCSV(.SelectedItems(1), "'")
End If
End With
End Sub
'カンマで区切られて、各データがクォーテーションで囲まれていないファイル用
Public Sub readCSVwithNoQuatation()
Dim FD As FileDialog, f As Variant
Set FD = Application.FileDialog(msoFileDialogOpen)
With FD
With .Filters
.Clear
.Add "テキストファイル", "*.csv;*.txt", 1
End With
If .Show = True Then
Debug.Print .SelectedItems(1)
Call analyseCSV(.SelectedItems(1), "")
End If
End With
End Sub
'メインの処理用関数
Private Sub analyseCSV(ByVal fileName As String, ByVal quote As String)
Dim fileNum As Integer
Dim buf As String
'カンマでスプリットした後の配列
Dim arrLineData() As String
Dim strSplit As String
'ワークシートの行番号
Dim row As Integer
Dim i As Integer
'くぉーとの長さ
Dim length As Integer
If fileName = "" Then
Exit Sub
End If
'クォーテーションの長さを取得しておく(汎用のため)
length = Len(quote)
strSplit = quote & "," & quote
'ワークシートの行の番号
row = 1
'空いているファイル番号を取得
fileNum = FreeFile
Open fileName For Input As #fileNum
Do Until EOF(fileNum)
Line Input #fileNum, buf
'行の最初と最後の囲み文字を削除する処理
buf = Left(buf, Len(buf) - length)
buf = Right(buf, Len(buf) - length)
'1行のデータを各項目に分解する処理
arrLineData = Split(buf, strSplit)
'何かの処理をしたい場合はここで処理を書き込む
'do something
'ワークシートのセルに書き込む
For i = 0 To UBound(arrLineData)
If quote = """" Then
arrLineData(i) = Replace(arrLineData(i), """""", """")
End If
Cells(row, i + 1) = arrLineData(i)
Next i
'ワークシートの行番号をカウントアップする
row = row + 1
Loop
Close #fileNum
End Sub
