【VBA】CSVファイルをExcelに取り込む

【VBA】CSVファイルをExcelに取り込む

慣れないVBAの開発をしています。

ローカルにあるCSVファイルをExcelシートにコピーするという、頻繁にありそうな動きすら分からなかったのでメモです。

既存のVBAの改修なのでコピペしても良いのですが、理解できた方が気持ちが良いですよね。

いくつか方法はあるようなのですが、既存のものはこういう状態です。

内容としては「C:\VBATest\FileName.csv」を「work」シートにコピーしています。

'「work」シートをアクティブにする
ThisWorkbook.Worksheets("work").Activate
'「work」シートのクリアを行う
Cells.Select
Selection.ClearContents
Selection.ClearFormats

'CSVをExcelシートに展開する
With ActiveSheet.QueryTables.Add(Connection:="text;C:\VBATest\FileName.csv", _
   Destination:=Range("A1"))
   .TextFileCommaDelimiter = True
   .TextFileColumnDataTypes = Array(2, 2)
   .Refresh
   .Delete
End With

「work」シートをアクティブにして、内容をクリアするところまでは何となく分かります。

その後ろの、Withからが怪しいですね。

ちょこちょこと調べていきました。

https://msdn.microsoft.com/ja-jp/library/wc500chb.aspx

久しぶりに見ましたが、Withというのはオブジェクト単位で処理を行う際に使用します。

WithからEnd Withの間の、「.」で始まる部分はWithの後ろのオブジェクトの処理になります。

つまり、こういうことです。

ActiveSheet.QueryTablesのAddメソッドの戻り値を変数に格納し、Withでそれを使用するということですね。

'CSVをExcelシートに展開する
Set queryTables = ActiveSheet.QueryTables.Add(Connection:="text;C:\VBATest\FileName.csv", _
                  Destination:=Range("A1"))
With queryTables
   .TextFileCommaDelimiter = True
   .TextFileColumnDataTypes = Array(2, 2)
   .Refresh
   .Delete
End With

もっと詳しく書くと、こういうことです。

'CSVをExcelシートに展開する
Set queryTables = ActiveSheet.QueryTables.Add(Connection:="text;C:\VBATest\FileName.csv", _
                  Destination:=Range("A1"))
'オブジェクトに対して処理を行う
queryTables.TextFileCommaDelimiter = True
queryTables.TextFileColumnDataTypes = Array(2, 2)
queryTables.Refresh
queryTables.Delete

問題はここからで、ActiveSheet.QueryTablesのAddメソッドがどうなっているかということですね。

https://msdn.microsoft.com/ja-jp/library/office/ff837764.aspx

URLを読むと「新しいクエリ テーブルを作成します。」とあります。

指定されたソースからデータを読み込む、くらいのレベルで大丈夫でしょうか。

ソースの引数から考えると、「C:\VBATest\FileName.csv」を「A1」を左上端としてコピーするということになります。

次に、Withの内容を見てみます。

TextFileCommaDelimiter

https://msdn.microsoft.com/ja-jp/library/office/ff838853.aspx

TextFileColumnDataTypes

https://msdn.microsoft.com/ja-jp/library/office/ff193261.aspx

Refresh

https://msdn.microsoft.com/ja-jp/library/office/ff197503.aspx

Delete

https://msdn.microsoft.com/ja-jp/library/office/ff823139.aspx

TextFileCommaDelimiterでカンマ区切りを指定し、TextFileColumnDataTypesでデータタイプを指定します。

RefreshでCSVの内容をシートに書き込み、DeleteでqueryTablesを削除しているようです。

データタイプが少し分かりづらいのですが、配列で(2, 2)と指定しているのは何でしょうか。

xlColumnDataTypeクラスに列挙型でデータタイプが存在するのですが、それを数値で書いているだけのようです。

https://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.xlcolumndatatype(v=office.11).aspx

つまり、Array(xlColumnDataType.xlTextFormat, xlColumnDataType.xlTextFormat)と同じということですね。

これで何となくCSVファイルの取り込み方が分かりました。

すっきりして作業を進めていきます。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です