- ベストアンサー
複数行を一列に表示する場合について(EXCEL VBA +ACCESS)
お世話になります。 現在EXCEL VBAとACCESSでデータを表示する調査をしております。 以下のように、複数行を一列に表示する場合の実現方法が分からず悩んでおります。(SQLはあまり詳しくありません。) 悩みどころは2点あります。 (1)SQLでどのようにデータを取得すればよいか? (複数回SQLを発行しなければいけないのか?など) (2)取得したデータの表示方法 (2次元配列で持たせるのが良いのか?など) どなたかご教示いただけませんでしょうか? よろしくお願い致します。 -------------------------------------- 【環境】 Windows XP EXCEL2003 Access2000 社員テーブル構成 1.id(key1) :社員コード 2.code(key2) :言語 3.stutus :状態(1:習得,2:未修得) EXCELで以下の表示を実現したいと考えてます。 (1)社員テーブルを読み込み、セルにヘッダー行と明細行を出力する。 (2)ヘッダー行には[code]を重複排除して横一列に表示する。 (3)明細行には[id]毎に出力する。 (4)[status]が"1"なら"○"に"2"なら"×"、それ以外は"-"にする。 ([code]は各idに必ずしも存在しない) ■テーブルイメージ id code status 00001 VBA 1 00001 CBL 1 00002 VBA 2 00002 JAV 2 00002 RPG 1 00003 PHP 1 00003 CBL 2 ■出力イメージ VBA CBL JAV RPG PHP 00001 ○ ○ - - - 00002 × - × ○ - 00003 - × - - ○ --------------------------------------
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
[code]は各idに必ず存在するように加工してから、クロス集計クエリを使用すればいかがでしょうか?かなり回りくどいやり方になりますけれども。 表示するマークを保存したtbl2を作ります。 クエリ: queIDとクエリ: queCDで、IDとcodeを抽出します。 クエリ: queIDCDで、IDとcodeの組み合わせを作成します。 クエリ: queTbl1で、IDとcodeの組み合わせに対するstatusを取得します。 クエリ: queDispで、おまじないをしておきます(汗) (NZ関数を通すと必ず文字になるのかな?これがないとqueALLで「型が一致しません」というエラーになる・・・。) クエリ: queALLで、[status]をエンコードします。 クエリ: queAllのクロス集計で、クロス集計を行ないます。 tbl2 ----------- status disp 0 - 1 ○ 2 X ------------ クエリ: queID ------------ SELECT DISTINCT [tbl].[id] FROM tbl; ------------ クエリ: queCD ------------ SELECT DISTINCT [tbl].[code] FROM tbl; ------------ クエリ: queIDCD ------------ SELECT [queID].[id], [queCD].[code] FROM queCD, queID; ------------ クエリ: queTbl1 ------------ SELECT [queIDCD].[id], [queIDCD].[code], nz([status],0) AS sts FROM queIDCD LEFT JOIN tbl ON ([queIDCD].[code]=[tbl].[code]) AND ([queIDCD].[id]=[tbl].[id]); ------------ クエリ: queDisp ------------ SELECT nz([status],0) AS sts, tbl2.disp FROM tbl2; ------------ クエリ: queAll ------------ SELECT queTbl1.*, queDisp.disp FROM queDisp INNER JOIN queTbl1 ON queDisp.sts = queTbl1.sts; ------------ クエリ: queAllのクロス集計 ------------ TRANSFORM First([disp]) SELECT [id] FROM queAll GROUP BY [id] PIVOT [code];
その他の回答 (1)
- temtecomai2
- ベストアンサー率61% (656/1071)
クロス集計クエリでどうでしょうか?
お礼
回答ありがとうございます。 「クロス集計クエリ」が分からなかったので、 調べて試してみたところ、思った表になりました。 TRANSFORM First([tbl].[status]) SELECT [tbl].[id] FROM tbl GROUP BY [tbl].[id] PIVOT [tbl].[code]; あとは[status]をエンコードすれば良いのですが、 どのようにすれば良いのか調査中です。
お礼
お返事遅くなりましてすみませんでした。 想定していた表を作ることができました。 ありがとうございます。 ご教示いただいた各クエリを理解してから 応用させていただきます。 ...SQL文をガリガリ書こうとすると 大変なことになりそうですね。