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は、フォームフッターに 縦計 も表示させているものに差し替えました。必要な場合はダウンロードしてご参考にしてください。

2 Comments

アシベ says..."DLさせていただきました。"

出席簿の代わりに利用してみようと思います。
ネットで検索してもやはりクロス集計で利用するものをチラホラみかけるので!ただ・・・日付を人数ごとに入力する手間が大変なんだろうなとふと思いました。
(Excelでインポートすればいいかな)

2016.12.27 20:07 | URL | #- [edit]
nis says..."助かりました!"

In句の使い方、参考になりました!ありがとうございました!
200個の固定項目をデザインプロパティから設定出来ず困っていたのです。
もちろんデザインビューでは開けなくなりましたが…(^^;

2017.03.02 14:08 | URL | #- [edit]

Leave a reply






Trackbacks

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