みなさん、こんにちは!
フジタニ(@libartweb)です。
エクセルVBAでQueryTableオブジェクトを使って高速にCSVを取り込む方法をシリーズでお伝えしております。
前回の記事はこちら
QueryTables.AddメソッドでWorksheet上にクエリテーブルを作成して、そこにCSVを取り込む方法をお伝えしました。
QueryTableオブジェクトを使用したCSV取り込みを理解する上で、第一歩である「クエリテーブルの作成」は非常に重要な内容でした。
今回は、クエリテーブルに取り込んだCSVをWorksheetに出力する方法をお伝えいたします!
QueryTable.RefreshメソッドでWorksheetにCSVを出力する
QueryTable.Addメソッドで作成したクエリテーブルの状態
QueryTables.Addメソッドでクエリテーブルを作成しただけではWorksheetを見ても、空の状態です。
クエリテーブルという見えないテーブル上にCSVが取り込まれた状態ですが、まだそれをWorksheetに出力するための命令をしていないからです。
この後、Worksheetに出力する命令が必要となってきます。では、その方法を見ていきましょう!
QueryTable.Refreshとは
今回のサンプルコードは以下の通りです!
Private Sub csvImport()
Dim strPath As String
Dim qtCsv As QueryTable
strPath = "C:\Users\hirom\Desktop\test.csv"
'QueryTableオブジェクトをQueryTables.Addメソッドで追加する
Set qtCsv = Sheet1.QueryTables.Add(Connection:="TEXT;" & strPath, _
Destination:=Sheet1.Range("A1")) '取り込むCSVファイルパスと、出力先のシート、セルを指定
qtCsv.Refresh BackgroundQuery:=False 'CSVをWorksheetに出力する
End Sub
WorksheetにCSVを出力するには以下のメソッドを使用します。
Refreshメソッドは非常に単純で、QueryTableオブジェクト内のCSVの内容をWorksheetに出力します。もしここでプロパティを設定していれば、設定した内容で出力されます。
このメソッドを実行しないと、取り込んだCSV、設定したプロパティなどはすべて反映されず、Worksheetは空の状態のままになってしまいます。
必ず記述しましょう。
QueryTable.Refreshの引数
引数にはBackgroundQueryがあります。TrueかFalseを指定します。
BackgroundQuery:=False
バグの原因となるので、通常はFalseを指定しましょう。
Trueを指定すると、バックグラウンドでのテーブル更新が有効となり、まだWorksheetへの出力が終わっていないのに、次のステップへ進んでしまいます。
場合によっては正しく出力されない、といったこともあります。
CSV取り込み時は基本的にFalse指定と覚えておいてください
実行結果
サンプルコードではQueryTableオブジェクトがどのような動きをするか?を最もシンプルな形で理解していただくために、何もプロパティを指定していません。
プロパティを指定しなかったらどうなるか?とりあえずCSVを出力します。
CSV自体は正しくWorksheetに反映されていますね!
でも、すべてのデータがカンマで区切られず、Aセルに出力されてしまっています。プロパティを指定しないとこんな結果になってしまいます。これでは使えません。
次回以降の記事で説明するプロパティを使えば、文字列の型や、カンマ区切りの指定など様々な設定が可能です。
以下の記事の、「ループを使用したCSV取り込みの方法」と同じように、カンマで区切ってCSVを取り込むこともできちゃいます。
まとめ・次回予告
以上、クエリテーブルに取り込んだCSVを、Worksheetに出力する方法を紹介しました。
この段階ではプロパティの指定がありませんので、出力されたCSVはデータとして使えるものではありません。
次回はいよいよプロパティの紹介です。
CSV取り込みでよく使うプロパティを取り上げます。え、こんなカンタンなの?!と驚くようなプロパティがたくさんあります。
プロパティを使いこなすことができれば、QueryTableオブジェクトを使用したCSV取り込みは、取り込みだけでなくコーディングまで高速化できます。
どうぞお楽しみに!
連載目次:エクセルVBAのQueryTableで高速にCSVを取り込む
一般的なループを使用したCSV取り込みよりも、更に高速にCSVを取り込むことのできるQueryTableオブジェクトに関する連載です。サイズの大きなCSVを取り込む際に非常に便利です。- エクセルVBAでQueryTableオブジェクトを使って高速にCSVを取り込む方法
- エクセルVBAのQueryTables.Addメソッドでクエリテーブルを作成する方法
- エクセルVBAのQueryTable.RefreshメソッドでCSVをシートに出力する方法
- エクセルVBAのQueryTableオブジェクトのプロパティの基本とCSVをカンマ区切りする方法
- エクセルVBAのQueryTableオブジェクトであらゆる種類のCSVを取り込む方法
- エクセルVBAで高速にCSVを取り込むQueryTableオブジェクトの最終処理
- エクセルVBAでCSVを高速に取り込むQueryTableオブジェクト使用時の注意点