CSVをExcelシートに読み込む方法
CSVファイルをExcelのシートに読み込むのをVBAで行う際の方法としては、次の3つがあります。
それぞれに利点などがあるのですが、「先頭0が消える」とか「Shift-Jis とUTF-8の形式相違」問題などを考えると、列のデータ形式の設定やCSVの形式がコード上管理しやすいので「1. QueryTablesメソッドを使う(Worksheetsオブジェクト)」が、私にはしっくりきました。この方法は、マクロの記録機能を使って、テキストデータをExcelシートに手動で読み込む際に記録されるものと一致します(現在はレガシから選択)。
それでは、具体的なコードを見てみましょう。
Sub Querytablesメソッドで取得()
Application.ScreenUpdating = False '画面遷移を停止
'カレントディレクトリの指定(任意設定)
ChDir "C:\Users\yamadataro\Desktop\マクロ"
'取り込み元ファイルパスの取得
Dim filePath As String
filePath = Application.GetOpenFilename
'読み込みシートのクリア
ThisWorkbook.Sheets("sheet1").Cells.ClearContents
'このワークブックの読み込みシートのオブジェクト取り込み
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
'クエリテーブルを作る
Dim queryTb As queryTable
Set queryTb = ws.QueryTables.Add(Connection:="TEXT;" & filePath, _
Destination:=ws.Range("A1"))
'列のデータタイプ(配列)の作成(先頭の「0」落ち防止等)
'ここでは、全部文字列にしています。省略可能
Dim arrDataType() As Integer
Dim i As Long
ReDim arrDataType(255) '※Excel2003の最大列数としました。
For i = 0 To 255
arrDataType(i) = XlColumnDataType.xlTextFormat
Next
'クエリテーブルの定義
With queryTb
.TextFilePlatform = 65001 'ShiftJis「932」UTF-8「65001」
.TextFileParseType = xlDelimited '区切り文字の指定
.TextFileCommaDelimiter = True 'カンマ区切り
.TextFileTabDelimiter = False 'タブ区切り
.TextFileSemicolonDelimiter = False 'セミコロン区切り
.TextFileSpaceDelimiter = False 'スペース区切り
'列ごとのデータタイプを指定(配列)
.TextFileColumnDataTypes = arrDataType
.RefreshStyle = xlOverwriteCells 'セルに上書き
.Refresh 'データを表示
.Delete 'CSVファイルと接続を遮断
End With
Set ws = Nothing
Set queryTb = Nothing
Application.ScreenUpdating = True '画面遷移を戻す
End Sub
QueryTablesメソッドについて
QueryTablesメソッドなんですが、コードにおける.add以下の部分がポイントです。「Connection:」以下で、ファイルのパスを指定しているのですが、「"TEXT;"」でテキスト形式のファイルとして、パスのファイルと接続し、このシートのセル(A1)にテーブルを張り付けたことを意味しています。その後は、その読み込んだQueryTableのプロパティをいじって、整形しています。
主要なプロパティの説明
| プロパティ名 | 定数の説明 |
|---|---|
| TextFilePlatform | ShiftJisなら、「932」UTF-8なら、「65001」 |
| TextFileParseType | 区切り文字なら、「xlDelimited」、固定長なら「xlFixedWidth」 |
| TextFileCommaDelimiter | カンマ区切り 「TRUE」 または 「FALSE」 |
| TextFileTabDelimiter | タブ区切り 「TRUE」 または 「FALSE」 |
| TextFileSemicolonDelimiter | セミコロン区切り 「TRUE」 または 「FALSE」 |
| TextFileSpaceDelimiter | スペース区切り 「TRUE」 または 「FALSE」 |
| TextFileColumnDataTypes |
列のデータ形式 配列で指定(例:Array(1,1,2,3)) <配列の要素> 標準:1(xlGeneralFormat)、文字列:2(xlTextFormat) 日付(YMD):5(xlYMDFormat)など |