コードのポイント
- 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,
おわりに
次のページが参考になりました♪ありがとう存じます!
- 一時的な作業ブックを作り、削除する方法
- インポートしたデータを取得する方法
以上です。