Excel のクエリ テーブルで動的レポートを作成する

Microsoft Office 2000/Visual Basic プログラマーズ ガイド   

CopyFromRecordset および TransferSpreadsheet メソッドは、頻繁には変更されない外部データのインポートまたはエクスポートの場合は問題ありません。ただし、Excel でレポートを作成し、そのデータを頻繁に更新して表示する必要がある場合は、クエリ テーブルを作成した方が便利です。クエリ テーブルは、Excel ワークシートにあり、SQL サーバー データベース、Microsoft Access データベース、Web ページ、テキスト ファイルなど、外部データソースにリンクされたテーブルです。ユーザーは、クエリ テーブルを更新して最新のデータを取得できます。

データベース クエリでクエリ テーブルを作成する

Excel では、新しいデータベース クエリを作成し、データをそのワークシートに返した際、ワークシート内にクエリ テーブルが作成されます。Excel ユーザー インターフェイスからデータベース クエリを作成するには、[ツール] メニューから [外部データの取り込み]、次に [新しいデータベース クエリ] をクリックし、[データ ソースの選択] ダイアログ ボックスから、既存のデータ ソースを選択、または新しいデータ ソースを作成します。そして、クエリ ウィザードまたは Microsoft Query グリッドを使用して、データベース クエリを作成し、データをワークシートに返します。データの取得後、[ツール] メニューの [更新] をクリックして、クエリ テーブルを更新します。

VBA で新しいクエリ テーブルを作成するには、QueryTables コレクションにある Add メソッドを使用します。QueryTables コレクションは、Worksheet オブジェクトに属し、ワークシートで使用する QueryTable オブジェクトのすべてが含まれています。新しいクエリ テーブルの作成後は、QueryTable オブジェクトの Refresh メソッドを使用して、クエリ テーブルでデータを表示します。Refresh メソッドを使用しない場合、クエリ テーブルにはデータが一切表示されません。次の例では、新しいワークシートにクエリ テーブルを作成します。

  Function CreateQueryTable(strConnect As String, _
                 strSQL As String) As Boolean
   ' 外部データ ソースからクエリ テーブルを作成します。
   ' 有効な ADO 接続文字列および
   ' 有効な SQL SELECT ステートメントを取得します。

   Dim cnnConnect    As ADODB.Connection
   Dim rstData       As ADODB.Recordset
   Dim qtbData       As Excel.QueryTable
   Dim wksNew        As Excel.Worksheet

   On Error GoTo CreateQueryTable_Err

   ' データ ソース上で接続を開きます。
   Set cnnConnect = New ADODB.Connection
   cnnConnect.Open strConnect

   ' 接続上で Recordset オブジェクトを開きます。
   Set rstData = New ADODB.Recordset
   rstData.Open strSQL, cnnConnect, adOpenForwardOnly

   ' 新しいワークシートを追加します。
   Set wksNew = ThisWorkbook.Worksheets.Add

   ' 新しいワークシート内にクエリ テーブルを作成します。
   Set qtbData = _
      wksNew.QueryTables.Add(rstData, wksNew.Range("A1"))

   ' クエリ テーブルを更新してデータを表示します。
   qtbData.Refresh

   CreateQueryTable = True

CreateQueryTable_End:
   On Error Resume Next
   rstData.Close
   Set rstData = Nothing
   Exit Function

CreateQueryTable_Err:
   CreateQueryTable = False
   MsgBox "エラー : " & Err.Number & vbCrLf & Err.Description
   Resume End_CreateQueryTable
End Function

CreateQueryTable プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH15 サブフォルダに含まれる Northwind.xls サンプル ファイルの modQueryTables モジュールにあります。

Access に基づいたソリューションで、Excel を使用して動的なレポートを作成する場合は、オートメーションにより、Access で実行中のコードからクエリ テーブルまたはピボットテーブル レポートを作成できます。オートメーションを使用すると、データベースから Excel へのデータ転送プロセスの管理が容易になります。また、レポートの書式設定、データのフィルタ、グラフの作成などが可能で、ユーザーは Access のボタンをクリックするだけで、Excel で書式設定されたレポートを呼び出すことができます。

Web クエリでクエリ テーブルを作成する

クエリ テーブルを Web ページ上のデータから作成することもできます。この場合、QueryTables コレクションにある Add メソッドの Connection 引数用に、Web ページ アドレス、または保存した Web クエリ (.iqy) のパス名とファイル名を指定します。次のコードでは、Microsoft Investor Web サイト から株式相場を取り出す保存したクエリを使用して、クエリ テーブルを作成します。

  ' 新規ワークシートを追加します。
Set wksNew = ThisWorkbook.Worksheets.Add
' 保存した Web クエリからクエリ テーブルを作成します。
Set qtbQuote = wksNew.QueryTables.Add(Connection:= _
      "FINDER;C:\Program Files\Microsoft " _
   & "Office\Office\Queries\Microsoft " _
   & "Investor Stock Quotes.iqy", Destination:=Range("A1"))
' クエリ テーブルのプロパティを設定し、データを取得します。
   .Name = "Microsoft Investor Stock Quotes_1"
   .FieldNames = True
   .PreserveFormatting = False
   .RefreshStyle = xlInsertDeleteCells
   .SaveData = True
   .AdjustColumnWidth = True
   .RefreshPeriod = 0
   .WebSelectionType = xlEntirePage
   .WebFormatting = xlWebFormattingAll
   .WebPreFormattedTextToColumns = True
   .WebConsecutiveDelimitersAsOne = True
   .WebSingleBlockTextImport = False
   .Refresh BackgroundQuery:=False
End With

このコードは、Microsoft ‘Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH15 サブフォルダ中の StockQuotes.xls サンプル ファイル内、modStockQuotes モジュールにある RetrieveStockQuotes プロシージャから一部引用したものです。