MS Access Tips/Sample and VBA and Blog customize etc...

列名が変化するクロス集計クエリと連結するフォーム

クロス集計クエリの場合、フィールド名(列名)が固定でない場合があります。そのようなクエリと連結したフォームの場合、コントロールソースとフィールドが合致しなくて #Name? エラーが出てしまいますね。このようなクロス集計クエリをフォームのレコードソースに設定して問題なく表示させる方法の紹介です。

FrmCrossQuerySource.png

難易度:

仕様

下記のような予約テーブルから、上図のようなフォームで、ヘッダーで指定した開始日から1週間分のデータを表示します。

T_予約
ID 名前 予約日 予約時刻
1 A 2009/06/01 13:00:00
2 C 2009/06/01 13:45:00
3 B 2009/06/02 13:00:00
4 A 2009/06/02 13:15:00
5 C 2009/06/03 13:15:00
6 B 2009/06/03 13:30:00
7 C 2009/06/04 13:45:00
8 A 2009/06/06 13:30:00

コントロールソースをVBAで動的に書きかえる方法

フォーム名 F_予約、ヘッダーにテキストボックスを配置して名前を 開始日 とする。レコードソースは空白にしておきます。また、ヘッダーの日付表示ラベルの名前は、lbl0, lbl1, ・・・lbl6、詳細セクションの値表示用のテキストボックスの名前は、 txt0, txt1, ・・・txt6 とします。

下記のクエリ「Q_予約」を作成

フォームモジュール

クロス集計クエリの列名を固定する方法

フォーム名 F_予約_固定

クエリ名 Q_予約_固定

開始日と予約日の差を列名にして、In句で列名を0 ~ 6 に固定します。このクエリを、フォームのレコードソースに設定します。

ヘッダに表示する列名のラベルはテキストボックスに変換して、コントロールソースでDateAdd関数で日付に変換します。左から順に、
=DateAdd("d",0,[開始日])
=DateAdd("d",1,[開始日])
=DateAdd("d",2,[開始日])
・・・・

読み込み時 と 開始日 の更新後に 再クエリします。

フォームモジュール

前者の方法は列名固定でないためウィザードが使えませんが、後者のクエリで列名固定の方法は、ウィザードで簡単にフォームが作成できます。レポートの場合でも同様に使えます。

レポートでVBAでコントロールソースを動的に書きかえる方法は、RURIさんのサイトの下記にサンプルがあります。

クロス集計クエリーからのレポート作成

サンプルファイルが下記からダウンロードできます。
FrmCrossQuerySource_07.zip (Access 2007-2010 形式 - 26kb)
FrmCrossQuerySource.zip (Access 2002-2003 形式 - 26kb)
FrmCrossQuerySource_2k.zip (Access 2000 形式 - 25kb)

追記(2009/7/20):記事では縦計は表示してませんが、サンプルMDBは、フォームフッターに 縦計 も表示させているものに差し替えました。必要な場合はダウンロードしてご参考にしてください。


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/117-6fcbafdc
該当の記事は見つかりませんでした。