• ベストアンサー

複数行を一列に表示する場合について(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  -  ×   -   -   ○ --------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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];

sipe12
質問者

お礼

お返事遅くなりましてすみませんでした。 想定していた表を作ることができました。 ありがとうございます。 ご教示いただいた各クエリを理解してから 応用させていただきます。 ...SQL文をガリガリ書こうとすると 大変なことになりそうですね。

その他の回答 (1)

回答No.1

クロス集計クエリでどうでしょうか?

sipe12
質問者

お礼

回答ありがとうございます。 「クロス集計クエリ」が分からなかったので、 調べて試してみたところ、思った表になりました。 TRANSFORM First([tbl].[status]) SELECT [tbl].[id] FROM tbl GROUP BY [tbl].[id] PIVOT [tbl].[code]; あとは[status]をエンコードすれば良いのですが、 どのようにすれば良いのか調査中です。