【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クラスに列挙型でデータタイプが存在するのですが、それを数値で書いているだけのようです。
つまり、Array(xlColumnDataType.xlTextFormat, xlColumnDataType.xlTextFormat)と同じということですね。
これで何となくCSVファイルの取り込み方が分かりました。
すっきりして作業を進めていきます。
No comments.