こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2009-02-14 10:31:09

QNo.4716041

困ってます

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

[code]は各idに必ず存在するように加工してから、クロス集計クエリを使用すればいかがでしょうか?かなり回りくどいやり方になりますけれども。
表示するマークを保存したtbl2を作ります。
クエリ: queIDとクエリ: queCDで、IDとcodeを抽出します。
クエリ: queIDCDで、IDとcodeの組み合わせを作成します。
クエリ: queTbl1で、IDとcodeの組み合わせに対するstatusを取得します。
クエリ: queDispで、おまじないをしておきます(汗)
(NZ関数を通すと必ず文字になるのかな?これがないとqueALLで「型が一致しません」というエラーになる・・・。)
クエリ: queALLで、[status]をエンコードします。
クエリ: queAllのクロス集計で、クロス集計を行ないます。


tbl2
-----------
statusdisp
0-
1○
2X
------------

クエリ: 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];

投稿日時 - 2009-02-16 10:46:14

お礼

お返事遅くなりましてすみませんでした。
想定していた表を作ることができました。
ありがとうございます。

ご教示いただいた各クエリを理解してから
応用させていただきます。

...SQL文をガリガリ書こうとすると
大変なことになりそうですね。

投稿日時 - 2009-02-22 22:12:16

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2009-02-14 11:09:51

お礼

回答ありがとうございます。
「クロス集計クエリ」が分からなかったので、
調べて試してみたところ、思った表になりました。

TRANSFORM First([tbl].[status])
SELECT [tbl].[id]
FROM tbl
GROUP BY [tbl].[id]
PIVOT [tbl].[code];

あとは[status]をエンコードすれば良いのですが、
どのようにすれば良いのか調査中です。

投稿日時 - 2009-02-15 09:10:58

あなたにオススメの質問