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)など |