みなさん、こんにちは!
フジタニ(@libartweb)です。
エクセルVBAでCSVを高速に取り込むQueryTableオブジェクトの使い方についてシリーズでお伝えしております。
前回の記事はこちら
QueryTableオブジェクトはただ速いだけでなく、UTF-8などのあらゆる種類のCSVを取り込むことができること、それらをシンプルなソースコードで実現できることを紹介しました。
今回は、QueryTableオブジェクトを使用したCSV取り込みの最終処理であるQueryTable.Deleteメソッドを紹介します。
最終処理・・・地味な内容に聞こえるかもしれませんが、忘れると大変。非常に重要です!
最終処理としてクエリテーブルを削除する
QueryTables.Addメソッドを使用するとWorksheet上にはクエリテーブルが作成されます。
以前に以下の記事で解説した内容です。
QueryTableオブジェクトを使用したCSVの取り込みは以下の流れで実現しています。
- 新しいクエリテーブルを作成
- クエリテーブルにCSVを取り込む
- クエリテーブル上のCSVをWorksheetに出力する
Worksheet上にCSVを出力した後も、クエリテーブルは残ってしまっている状態です。
なぜクエリテーブルの削除が必要か?
クエリテーブルは外部ファイルとリンクされているテーブルです。
リンクされていますので、設定によっては取り込み元のCSVを更新したら、エクセルに取り込んだCSVまで更新されてしまう場合があります。
リンクは、エクセルを開く際に自動的に取り込み元のCSVの内容に合わせてWorksheet上のデータを更新したり、一定時間ごとに自動更新する設定がエクセルの機能としてあります。
以下の画面です。
今回QueryTableオブジェクトで実現したいのは、リンクすることではなく、CSVをエクセルに高速に取り込むことです。
クエリテーブルの削除を忘れてしまうとリンクが残ったままになるだけでなく、複数のCSVを連続して取り込んだ場合に、クエリテーブルがWorksheet上に大量に生成されて様々な不具合の原因となってしまいます。
不具合を招くので、CSVを取り込むだけであれば、基本的にクエリテーブルは不要です。削除してしまいましょう。
クエリテーブルを削除することで、リンクは解除され、取り込んだCSVはただのデータとなります。
ちなみに、クエリテーブルの削除を忘れて、Worksheet上のデータを削除しようとすると、以下のような確認画面がでます。これが出たらクエリテーブルが残っている状態です。
クエリテーブルを削除する方法
今回のサンプルコードは以下の通りです。
Private Sub csvImport()
Dim strPath As String
Dim qtCsv As QueryTable
strPath = "C:\Users\hirom\Desktop\test.csv"
Set qtCsv = Sheet1.QueryTables.Add(Connection:="TEXT;" & strPath, _
Destination:=Sheet1.Range("A1")) '取り込むCSVファイルパスと、取り込み先のシート、セルを指定
With qtCsv
.TextFileCommaDelimiter = True 'カンマ区切りの指定
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) '項目(列)の型指定
.Refresh 'QueryTableオブジェクトを更新し、シート上に出力
.Delete 'QueryTableオブジェクトを削除
End With
End Sub
以下のメソッドを使用します。
QueryTables.Addメソッドで追加したクエリテーブルを削除します。
CSV取り込みのQueryTableプロパティを設定し、Worksheet上に出力した後に実行する最終処理です。
実行を忘れても、一見うまくいったように見えますが、上述したとおり不具合の原因となりますので必ず忘れずに記述してください。
まとめ
以上、作成したクエリテーブルを削除する最終処理であるQueryTable.Deleteメソッドについて説明しました。
ここまでの連載で一通り、QueryTableオブジェクトを使用して高速にCSVを取り込む方法の解説は終了です。
連載を、CSV取り込みの業務でどうぞご活用ください!
次回は、QueryTableオブジェクトで発生する可能性のある不具合とその対処法について説明します。
不具合を事前に想定しておくことで、想定外の処理結果やミスを防ぐことができます。
お楽しみに!
連載目次:エクセル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オブジェクト使用時の注意点