• ベストアンサー

複数行を一列に表示する場合について(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]をエンコードすれば良いのですが、 どのようにすれば良いのか調査中です。

関連するQ&A

  • Excel→Access VBAによるインポート

    1つのExcelファイルの複数のデータシートをAccess2000にインポートしたい。 【説明】 data.xlsという名前のExcel2000で作成したファイルがあり、その中に同じ書式(列)を 持ったSheetが20枚ほどあります。 それらのデータをAccess2000にインポートしたいのですが、 1.作業は毎月発生する。 2.ほかのユーザも出来るようにする。 などの理由から、マクロかVBAを使って自動化できればと考えています。 ぽちっとボタンを押すと、data.xlsのすべてのシートからデータをインポートし、 それぞれのSheet名がついたテーブルに格納されるというのが理想です。 フィールド名は固定ですので、あらかじめテーブルを作っておくことは出来ます。 Excelの各シートの上部数行は見出しやら説明文が書いてありますので、 インポートの際にその部分の行(5行分)を削除することが必要です。 当方VBAの知識はほぼ皆無ですので、やんわりご教示頂ければ幸いです。 よろしくお願いいたします。 (次回ネットに入るのは15日以降です)

  • ACCESS・VBAが全く分かりません。

    次のようなことをやるにはどういうコードを書けばいいですか? (患者情報テーブル) ID 氏名 1  阿部 2  伊藤 3  宇治 (表示フォーム) ID  1    氏名 阿部  表示フォームのIDを1から2へ変更したら、 自動的に氏名も阿部から伊藤へ変わってほしいのです。 これを実現する方法を教えて下さい。 それと、ユーザーが任意で指定できるのはIDだけにしたいので、 氏名はテキストボックスでなくてラベルで充分なのですが、 アクセスではラベルの表示をVBAで変えることはできるのでしょうか。 エクセルならそれができましたよね。

  • 複数行の上位3位を1行に表示

    複数行の上位3位を1行に表示する。 分かる方がいれば教えて下さい。 OS:Windows7 DB:PostgresSQL 8.3 <参照デーブル> 品番  ID   金額    日付 1;    3;   1000000; "2012-08-31" 1;    2;   970000;  "2012-08-18" 1;    1;   970000;  "2012-08-10" 1;    4;   940000;  "2012-08-20" 2;    16;  300000;  "2012-08-25" 2;    13;  300000;  "2012-08-13" 2;    12;  250000;  "2012-08-10" 2;    15;  250000;  "2012-08-18" 2;    14;  200000;  "2012-08-15" 2;    11;  200000;  "2012-08-08" 上記の様なテーブルを、金額が高くかつ時間の速いもの順で、上位3位を1行に表示したいのですが、上手くいかずに困っています。 <抽出したい結果> 品番  ID1   金額1    ID2  金額2   ID3   金額3 1;    3;    1000000;  1;   970000;   2;   970000 2;    13;    300000;  16;  300000;   12;   250000 このように抽出しいたいのですが上手くいきません。 どなたか教えていただけいないでしょうか。 よろしくお願いします。

  • 【Excel VBA】重複行の削除

    はじめまして。 IDの重複を削除し、日付データを横1列にまとめるVBAについてご教示いただけますと幸いです。 ------------------------------------------------------- ▼シート1(データ入力がされているシート)    A   B   C   D   E   F    1   ID 日付 2  1234  1/1  1/6  1/10  1/20   3  1234  2/3  2/20 4  1234  3/2 5  7777  1/10  1/15  1/20 6  7777  2/2   2/12  2/22 7  9876  2/3 ⇓ マクロ起動後 ▼シート2(重複行を削除しまとめたシート)    A   B   C   D   E   F   G   H 1   ID 日付 2  1234  1/1  1/6  1/10  1/20  2/3  2/20  3/2 3  7777  1/10  1/15  1/20  2/2  2/12  2/22 4  9876  2/3 【補足】 列情報  ・A列…ID  ・B-F列…日付(左詰め) ※日付はIDごと月毎に行が変わるため、IDによって複数行存在する場合があります。 ※A列のIDは重複しない場合もあれば、4行以上ある場合があります。 ※シート1のデータはおおよそ1000-5000行です。 ※IDに対して、日付は5つあれば問題ありません。そのためG列以降の日付を削除しても支障はございません。 ------------------------------------------------------ VBAの知識があまりなく、調べて出てきたものをコピペ使用も試みたのですが、 上手く動かす事ができませんでした…。 お力添え頂けますと幸いです…。 Windows10でエクセル2016を使用しております。 何卒宜しくお願いいたします。

  • 条件が複数行にわたる検索

    下のようなテーブル構成の場合に、[tbl1_tbl2テーブル]の検索で 「tbl2_idカラムが1と2両方を保持する行のtbl1_id」を取得(この場合だと1と3を取得)したい のですが、どのようにSQLを記述すれば良いのでしょうか? [tbl1テーブル] id 1 2 3 [tbl2テーブル] id 1 2 3 [tbl1_tbl2テーブル] tbl1_id tbl2_id 1     1 1     2 3     1 3     2 2     1

    • ベストアンサー
    • MySQL
  • EXCELのVBAでの他EXCELデータ取得&表示

    EXCELのVBAを使い、実行したEXCELのシートに他のEXCELから読み込んだデータを取得&表示させたいと思っています。 取り込むEXCELファイルは、フォルダに格納された複数の同フォーマットのデータになります。 指定したフォルダの中の全てのEXCELファイルのデータを読み込んで、 実行したEXCELファイルのシートに複数行書き込んでいくような形になります。 機能として必要なのは以下の通りです。 ・取り込みファイルの保存されたフォルダの選択 ・選択したフォルダ内のファイルを開き、VBA側で設定した箇所のデータを読み込み、それを実行側のシートに出力する。(1ファイルにつき1行表示させる形。読込元と出力先のデータの位置関係は違います。色々入力されているファイルの必要部分だけを抜き出し、一行に出力する感じです) ・フォルダ内の全ファイルに対して同じ処理を繰り返す。(出力先の行は1行ずつ下にずれる) このようなVBAはどのように作ればよろしいでしょうか?

  • VLOOKUPでの複数行表示について

    VLOOKUP関数でボランティア活動表(テーブル)から行のデータを取り出す際に、例えば、複数ある日本太郎のデータ(行)を検索する場合、  VLOOKUP(A1,B2:G50,3,FALSE) とだけ記述した場合は日本太郎の最初の1行分のデータしか検索表示されませんが、テーブル及び関数に追加記述することで、日本太郎の複数行(全て)のデータを検索表示できる方法を教えて下さい。

  • JTABLEでの行ヘッダの表示について

     スクロールペインにテーブルを乗せて表示しているのですが、 行ヘッダのタイトルが「1,2,3,4、、、」となっている所を 自分の好きなように文字を設定する方法はないのでしょうか? また、行の高さを設定する方法はありませんでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • Excel2010テーブルの範囲をVBAで取得

    テーブル機能を使ったことがないので、使いたいと思っています。 ただマクロ(VBA)を使ったシンプルな記述例が見付からなかったので、 簡単なもので結構ですので、サンプルを教えて頂けると助かります。 マクロでテーブルの範囲内のデータを行単位で追加・削除出来るようにしたいのですが、 その前段として、末端・先頭の行と列を取得する必要がありますよね? その取得方法を教えて下さい。 テーブル内のデータはギッシリ詰まっているのではなく、 歯抜け(セルが空白)になっているのが条件です。 宜しくお願いします。

  • エクセルで昨日までの日付データ行を非表示するVBAについて!

    初めて質問します。 エクセルでA列に入力されている、昨日までの日付データ行を非表示にする、VBAはどのように作成すればいいのか教えていただけないでしょうか? 他のホームページにあったVBAを使ってみましたがこのVBAですと空白部分も非表示になってしまいます。 お手数ですがよろしくお願いします。

専門家に質問してみよう