MS Access Tips/Sample and VBA and Blog customize etc...

グループ内のデータを横連結する

レポート上で、グループに属するデータをまとめて、文字列として横に連結したい。

言葉ではわかりにくいので、具体例を出しますと、下記のようなデータから、

社員
社員コード氏名在籍支社部署名
105森上 偉久馬東京本社第一営業
107葛城 孝史東京本社第二営業
110加藤 泰江東京本社第一営業
204川村 匡大阪支社営業開発
207松沢 誠一大阪支社営業開発
210成宮 真紀大阪支社営業一
304山本 雅治北九州支社営業一
305青木 俊之北九州支社営業一
307小川 さよ子北九州支社営業二

下図のようなレポートを出します。

RptListJoin.gif

グループ(支社)内のデータ(氏名)をカンマ区切りで連結してひとつのテキストボックスに出力します。

難易度:

概要

このような場合は 「DJoin関数をWeb検索しましょう。」というのが、業界標準(どんな業界?)の回答です。YU-TANGさんの作成した DJoin関数 は非常によくできたものなのですが、レコード数が増えると重くなる傾向があります。フォームやクエリで表示する場合はDJoinなどのユーザー定義関数を利用することになりますが、レポートの場合は、グループ化の機能を使って、シンプルにできる方法があります。

サンプル作成

上記の「社員」テーブルより、レポートを作成します。メニューより[表示]-[並び替え/グループ化の設定]の設定で、「在籍支社」でグループ化して、グループヘッダー、グループフッターを表示させます。

詳細セクションには、氏名 をテキストボックスとして配置します。グループヘッダーと詳細セクションの可視は いいえ とします。

グループフッターには、在籍支社 をテキストボックスとして配置して、さらに非連結のテキストボックスを配置します。名前は、txt社員リスト とします。

グループヘッダー、詳細セクション、グループフッターのフォーマット時のイベントプロシージャを下記のように記述します。

2011/08/21 修正: 複数ページになるとき、先頭の文字がかけるバグを修正

以上、3行のコードを記述するだけです。

このロジックを使えば、部署名 グループを追加して数行のコードで、下図のようなレポートも簡単に実現できます。

RptListJoin2.gif

こちらのコードはサンプルで参照してください。

サンプルファイルが下記からダウンロードできます。
RptListJoin_07.zip (Access 2007-2010 形式 - 35kb)
RptListJoin.zip (Access 2002-2003 形式 - 27kb)
RptListJoin_2k.zip (Access 2000 形式 - 24kb)

拍手する

7 Comments

Rei says..."重複データがある場合"

いつも参考にさせていただいております。
一つ質問させてください。
この度、このコードを使用して連結表示させました。
問題なく表示されたのですが、重複するデータがある場合、同じデータが連結して表示されてしまいます。
重複データは一つだけ表示したいのですが、どうすればよろしいでしょうか?
色々やってみたのですがもうお手上げでご質問させていただきました。
どうかよろしくお願い致します。

2016.10.20 01:09 | URL | #- [edit]
hatena says..."re:重複データがある場合"

レコードソースのクエリの「固有の値」プロパティを「はい」にすれば、重複は排除されます。

レコードソースでテーブルなら、テーブルからクエリを作成して同様の設定をします。

2016.10.20 01:20 | URL | #5uE6dEgY [edit]
Rei says...""

ご返答ありがとうございます。
言葉足らずでごめんなさい。
1行全て同じデータではなく、hatenaさんのサンプルでいうと
氏名だけ同じ場合に同じ名前が連結して表示されてしまうということです。
対象レコードを連結する際に同じデータであれば、一つだけ表示するというようなことはできないでしょうか?

ご無理言って申し訳ありません!
どうか宜しくお願い致します。

2016.10.20 09:21 | URL | #- [edit]
hatena says..."re:"

> 言葉足らずでごめんなさい。
> 1行全て同じデータではなく、hatenaさんのサンプルでいうと
> 氏名だけ同じ場合に同じ名前が連結して表示されてしまうということです。
> 対象レコードを連結する際に同じデータであれば、一つだけ表示するというようなことはできないでしょうか?

試してみましたか?
それで、うまくいかない場合、
レコードソースのデータ例、
希望と違うレポート出力例
希望の出力例を
提示して具体的に説明してください。

例えば
支社 氏名
AA  あああ
AA  いいい
BB  いいい
BB  ううう

だとして、上記の方法では、

支社 氏名
AA  あああ, いいい
BB  いいい, ううう

と表示されますが、これでは希望と違う、
というように説明してもらえますか。

2016.10.20 11:20 | URL | #5uE6dEgY [edit]
Rei says...""

再度のご回答ありがとうございます。
説明が分かりづらくて申し訳ありません。
実は2つのレコードで使いたいと思っております。通貨や数値であれば合計でいいのですが、文字列になるのでこちらのコードを使用したいと思っています。

例えば
レコード1 レコード2  レコード3  レコード4…(他にも続きます)
AA    あああ   1000   aaa
AA    いいい    500 abc
BB    いいい    300 aaa
BB    ううう    800
AA    あああ   500 bbb

だとして、下記のようになります。

レコード1 レコード2       レコード3  レコード4…
AA    あああ,あああ,いいい  2000   aaa,abc,bbb
BB    いいい ,ううう     1100 aaa

レコード2の「あああ,あああ」と続くところを

レコード1 レコード2       レコード3  レコード4…
AA    あああ,いいい  2000   aaa,abc,bbb

となってくれたらいいなと思っております。
お手数をおかけしますが、よろしくお願い致します。

2016.10.20 14:58 | URL | #- [edit]
hatena says..."re:"

なるほど、連結したいのフィールド(列)が複数あるということですね。

ちなみに、レコード1、レコード2・・・・という表現は誤解を招きますね。
データベースでは、行がレコード、列がフィールドという表現になりますので。

連結するときに、その値が存在するかチェックすればいいでしょう。

'在籍支社 ヘッダーのフォーマット時イベント
Private Sub グループヘッダー1_Format(Cancel As Integer, FormatCount As Integer)
Me.txt社員リスト = ""
End Sub

'詳細セクションのフォーマット時イベント
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  If InStr(Me.txt社員リスト & ",", ", " & Me.氏名 & ",") = 0 Then
    Me.txt社員リスト = Me.txt社員リスト & ", " & Me.氏名
  End If
End Sub

2016.10.21 08:28 | URL | #5uE6dEgY [edit]
Rei says...""

ありがとうございました!
先ほど試してみたところ思った通りの表示になりました!

レコードの件もそうでしたね。
勉強になりました!

お忙しいところお答えくださって本当に感謝しています。
またお世話になることもあるかもしれませんが、その際はよろしくお願い致します。

2016.10.22 02:33 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/12-736e8691
該当の記事は見つかりませんでした。