カテゴリー
Microsoft

【Excel VBA】CSV ファイルを 2 次元配列として得るクラスのコード♪

コードのポイント

  • 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, 

おわりに

次のページが参考になりました♪ありがとう存じます!

以上です。

コメントを残す