「csvファイル」を「二次元配列」に入れる。区切り文字を、カンマ以外にも対応
区切り文字が、カンマの時のマクロは、以下を参照してください。
区切り文字がカンマ以外にも対応できるマクロは、以下です。
'*******
'* csvファイルを二次元配列に入れる。20240509改造。
'* csvFile:csvファイル名、フルパス
'* arr:出力される配列は、参照渡し。配列は、モジュールレベル変数としている。
'* delimiter:区切り文字。デフォルトで、","カンマ区切り。vbTabでタブ区切りに変更可能。
'* 文字コードは、「Shift_JIS」対応。途中の改行には、対応していません。
Private Sub csv_to_array(ByVal csvFile As String, ByRef arr As Variant, Optional ByVal delimiter As String = ",")
'CSVファイルのパスを指定
Dim filePath As String
filePath = csvFile
'CSVファイルを開く
Open filePath For Input As #1
'配列を宣言
Dim dataArray() As String
Dim rowCount As Integer
Dim colCount As Integer
'CSVファイルからデータを読み込む
Dim i As Integer
Dim line As String
i = 1
Do Until EOF(1)
Line Input #1, line
'最初の行の場合、列数をカウントする
If i = 1 Then
colCount = UBound(Split(line, delimiter)) + 1 '区切り(demilter)で分割して、配列の上限を取得
End If
'行数をカウントする
rowCount = rowCount + 1
' 行列を逆の配列を作成。ReDimは、1行づつの追加ができないため
'配列をリサイズしてデータを格納する
ReDim Preserve dataArray(1 To colCount, 1 To rowCount)
Dim j As Integer
For j = 1 To colCount
dataArray(j, rowCount) = Split(line, delimiter)(j - 1) '配列にデータを格納する
Next j
i = i + 1
Loop
'CSVファイルを閉じる
Close #1
' 行列変換関数を使用
arr = TransposeArray(dataArray)
End Sub
' 配列の行列変換
Function TransposeArray(ByVal myArray As Variant) As Variant
Dim x As Long, y As Long
Dim maxX As Long, minX As Long
Dim maxY As Long, minY As Long
Dim tempArr As Variant
'上限と下限を取得
maxX = UBound(myArray, 1)
minX = LBound(myArray, 1)
maxY = UBound(myArray, 2)
minY = LBound(myArray, 2)
'一時的な配列を作成する
ReDim tempArr(minY To maxY, minX To maxX)
'配列の行列変換
For x = minX To maxX
For y = minY To maxY
tempArr(y, x) = myArray(x, y)
Next y
Next x
'出力配列
TransposeArray = tempArr
End Function
このマクロは、デフォルトでカンマ区切り対応ですが、その他の区切り文字の場合、3つ目の引数に指定することで、カンマ以外の区切り文字に対応しました。以下が、区切り文字をタブに指定した使用例です。
Dim arr() As Variant
Private Sub テスト、CSVファイルを二次元配列に()
Call csv_to_array(ThisWorkbook.Path & "\sample8.csv", arr, vbTab)
End Sub
他の区切り文字、例えば、セミコロン”;”の場合も、以下で対応可能です。
Private Sub テスト、CSVファイルを二次元配列に()
Call csv_to_array(ThisWorkbook.Path & "\sample_semi.csv", arr, ";")
End Sub
以下の関数は、
' 配列の行列変換
Function TransposeArray(ByVal myArray As Variant) As Variant
以下を参考にしてください。