コードのポイント
- CSV データは一時作業用のエクセルファイルを新規作成し、そこにインポートする。このエクセルは最後に保存しないで削除する。
- QueryTables でインポートしたデータ範囲には、Name をあらかじめ指定できる。これを Range 関数で指定してデータを取得する。
サンプル CSV ファイル
No,氏名,電話番号 1,伊藤健一,0112223333 2,高橋哲也,0114445555 3,佐藤誠,0116667777
VBA コード
''' <summary>
''' CSV ファイルから 2 次元配列を生成するクラスです。
''' </summary>
Option Explicit
Private mstrCsvFilePath As String
''' <summary>
''' 初期化処理を実行します。
''' </summary>
''' <param name="strCsvFilePath">CSV ファイルフルパス</param>
Public Sub Init( _
ByVal strCsvFilePath as String)
' 変数をセット
mstrCsvFilePath = strCsvFilePath
End Function
''' <summary>
''' CSV ファイルを読み込み、2 次元配列を生成して返します。
''' </summary>
''' <returns>1 次元目が行で2 次元目が列に相当し、要素は文字列、Variant の 2 次元配列</returns>
Public Function GetArrary() As Variant
' CSV を読み込む一時的なブックを用意
Dim objTmpBook As Workbook: Set objTmpBook = Workbooks.Add(xlWBATWorksheet)
Dim objTmpSheet As Worksheet: Set objTmpSheet = objTmpBook.Worksheets(1)
' ファイルの各列に適用されるデータ型をテキスト形式のみに指定
Dim vntColDataTypes() As Variant, i As Long: ReDim vntColDataTypes(Column.Count)
For i = 0 To Column.Count: vntColDataTypes(i) = xlTextFormat: Next i
' ファイル読み込み、および、書き込み
With objTmpSheet.QueryTables.Add( _
Connection:="Text;" & mstrCsvFilePath, _
Destination:=objTmpSheet.Range("A1"))
.Name = "CsvToArrayRange"
.RowNumbers = False
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.RefreshPeriod = 0
.TextFilePlatform = 932
.TextFileCommaDelimiter = True
.TextFileColumnDataTypes = vntColDataTypes
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
Dim strConName As String: strConName = .WorkbookConnection.Name
End With
GetArray = objTmpSheet.range("CsvToArrayRange").Value
' 後処理。一時的なブックを削除
Call objTmpBook.Close(False)
End Function
続いては上記のクラスを確認するコードです。
Option Explicit
Public Sub Test()
' 準備
' CSV ファイルパス取得
Dim strCsvFilePath As String
strCsvFilePath = Application.GetOpenfilename( _
Filefilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイルの選択")
If strCsvFilePath = "False" Then
Debug.Print ("CSV ファイルが指定されなかったため、終了")
End
End If
' CSV ファイルから配列を生成
Dim cta As CsvToArray: Set cta = New CsvToArray
Call cta.Init(strCsvFilePath)
Dim values As Variant: values = cta.GetArray
' 結果確認
Dim s As String
Dim i As Long
Dim j As Long
For i = LBound(values, 1) To UBound(values, 1)
For j = LBound(values, 2) To UBound(values, 2)
s = s & values(i, j) & ", "
Next j
Next i
End Sub
結果
No, 氏名, 電話番号, 1, 伊藤健一, 0112223333, 2, 高橋哲也, 0114445555, 3, 佐藤誠, 0116667777,
おわりに
次のページが参考になりました♪ありがとう存じます!
- 一時的な作業ブックを作り、削除する方法
- インポートしたデータを取得する方法
以上です。
