プロが教えるわが家の防犯対策術!

いつもお世話になりますm(__)m

Access2003で、以下のテーブルがあるとします。

例)tableA

項目1|項目2
---------
部署1|あいうえお
部署2|かきくけこ
部署1|さしすせそ
部署1|たちつてと
部署2|なにぬねの

上記のテーブルの項目1が同じものを、別テーブルの1つのフィールドにスペースでまとめたいと思っています。

例)結果テーブル

項目1|項目3
---------
部署1|あいうえお さしすせそ たちつてと
部署2|かきくけこ なにぬねの


可能であればクエリで処理したいのですが、無理でしたらVBA他でも結構です。

お詳しい方、ご教授のほど宜しくお願い致しますm(__)m

A 回答 (4件)

見るだけなら、


TRANSFORM First(項目2) AS 値
SELECT 項目1 FROM
(SELECT tableA.項目1, tableA.項目2, Count(*) AS Temp番号
FROM tableA INNER JOIN tableA AS TT ON (tableA.項目2 >= TT.項目2) AND (tableA.項目1 = TT.項目1)
GROUP BY tableA.項目1, tableA.項目2) AS WW
GROUP BY 項目1 PIVOT "項目2" & "-" Temp番号;


このクエリからデータを抜き取ってもいいのですが、
方法はそれこそいろいろですが。ベタにレコードセットから。
NoMatchプロパティを利用してもいいのですが、
思いっきりループの入れ子で。

(1)
以下を標準モジュールに貼り付けます。
DAOを使っているので、コード表のツールから
参照設定を選択して、
Microsoft DAO xx Object Library
にチェックを入れて、OKとします。xxは3.6のような数字です。
このとき、
Microsoft ActiveX Data Objects xx Library
にチェックが入っていたらはずしてください。

Sub test()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
Dim strSQL As String
Dim myStr1 As String
Dim myStr2 As String

strSQL = "SELECT tableA.項目1 FROM tableA GROUP BY tableA.項目1;"
Set db = CurrentDb
Set rs1 = db.OpenRecordset("tableA")
Set rs2 = db.OpenRecordset("結果テーブル", dbOpenDynaset)
Set rs3 = db.OpenRecordset(strSQL)

If rs3.RecordCount > 0 Then
rs3.MoveFirst
Do Until rs3.EOF
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
If rs3!項目1 = rs1!項目1 Then
myStr1 = rs1!項目1
myStr2 = myStr2 & " " & rs1!項目2
End If
rs1.MoveNext
Loop
rs3.MoveNext
End If
rs2.AddNew
rs2!項目1 = myStr1
rs2!項目2 = myStr2
rs2.Update
myStr1 = ""
myStr2 = ""
Loop

End If
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
rs3.Close: Set rs3 = Nothing
db.Close: Set db = Nothing
End Sub

(2)
フォームにコマンドボタンを設定し、そのクリックイベントで

Private Sub コマンド0_Click()
Call test
End Sub

以上です。
    • good
    • 4
この回答へのお礼

お礼が遅くなり申し訳ありません。
非常に分かりやすい説明、ありがとうございました(^^)

お礼日時:2012/03/08 11:55

YU-TANG さんの、DJoin関数を試されては?


DJoin 関数 - リスト文字列を取得する方法
http://www.f3.dion.ne.jp/~element/msaccess/AcTip …

Optional delimiter As String = ","
Optional delimiter As String = " "
にしてみたら半角スペースで区切られるかな・・未検証
    • good
    • 0

クロス集計クエリで出来そうな気がする(未確認)

    • good
    • 0

クエリやSQLはレコード間(テーブルで別行の間の)の処理が苦手だと思うので、VBAでのレコード処理しか方法で無いのでは。


ADOででも読んでSortする。
http://www.accessclub.jp/ado/22.html
ーー
今度は順読みで、同じ部署名の間は、項目フィールドを文字列に結合。
直前レコードの部署と比較して、部署の(コントロール、続き)が切れたら、前の部署と連結文字列を書き出し。文字列を空白にする。(コントロールブレークの処理)
そして新部署としての結合処理を繰り返す。
以上をヒントにコードは自分で作ってください。(上記のWEB記事のコードで少し変えるだけ)
この方法は同じ部署のレコードを探すやり方より、やさしいやり方でしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A