dポイントプレゼントキャンペーン実施中!

Accessのテーブルで以下のようなデータがあります。
【年月】   【内容】
2013年11月 A
2013年11月 BC
2013年11月 D
2013年11月 EFGH
2013年12月 I
2013年12月 J
2013年12月 KL
2013年12月 MNO
2013年12月 PQRST

上記を、クエリで
【年月】   【内容】
2013年11月 A BC D EFGH
2013年12月 I J KL MNO PQRS
と、年月ごとに、内容をひとつのフィールドにまとめて表示させたいです。

集計でもカウントでもないのに、
クエリでこのようなことは可能でしょうか?

最終的にこのクエリを、エクセルにエクスポートしようと考えているので
最悪、エクセルで数式を組んでこのような形に仕上がるんでもいいです。

ただ、何度も行う作業になりますので
なるべく簡単な操作でこのような表が完成できるようにしたいです。

よろしくお願いいたします!

A 回答 (3件)

1、クエリにOrder BY 句の追加必要。


2、DBSelect関数のSQL文のOrder BY 句の見直し必要。

先の回答はあくまでもテストのそれ。
2つの見直しは必須かと思います。

【DBSelect関数】

(1)標準モジュールに追加してください。
(2)参照設定を追加してください。

*標準モジュールも配布に含まれるので配布可能ですよ。

Public Function DBSelect(ByVal strQuerySQL As String) As String
On Error GoTo Err_DBSelect
  Dim I As Integer
  Dim J As Integer
  Dim R As Integer
  Dim C As Integer
  Dim M As Integer
  Dim N As Integer
  Dim rst As ADODB.Recordset
  Dim fld As ADODB.Field
  Dim strList As String

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
      CurrentProject.Connection, _
      adOpenStatic, _
      adLockReadOnly
    If Not .BOF Then
      ' --------------
      ' 配列を再宣言
      ' --------------
      M = .RecordCount - 1
      N = .Fields.Count - 1
      If M > 99 Then
        MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", _
          vbInformation, _
          " お知らせ"
        M = 99
      End If
      ReDim DataValues(M, N)
      ' ------------------------------------
      ' 列情報を For-Next で配列に代入する
      ' ------------------------------------
      .MoveFirst
      For R = 0 To M
        C = -1
        For Each fld In .Fields
          With fld
            C = C + 1
            ' --------------------------
            ' 列データを表示形式に変換
            ' --------------------------
            Select Case .Type
              Case adBoolean ' ブール型
                DataValues(R, C) = IIf(.Value = -1, "Yes", "No")
              Case adChar, adVarChar ' 文字列型
                DataValues(R, C) = Nz(.Value, "")
              Case adDBDate, adDBTimeStamp ' 日付型、日付/時刻型
                DataValues(R, C) = .Value
              Case adSmallInt, adInteger ' 整数
                DataValues(R, C) = FormatNumber(.Value, 0)
              Case adSingle, adDouble ' 浮動小数点型
                DataValues(R, C) = FormatNumber(.Value, 2)
              Case adCurrency ' 通貨型
                DataValues(R, C) = FormatCurrency(.Value, 2)
              Case Else
                DataValues(R, C) = .Value
            End Select
          End With
        Next fld
        .MoveNext
      Next R
    Else
      ReDim DataValues(0, 0)
      DataValues(0, 0) = ""
      strList = ""
    End If
  End With
  ' -------------------------------
  ' セミコロン(;)で連結して1文に
  ' -------------------------------
  For I = 0 To M
    For J = 0 To N
      strList = strList & DataValues(I, J) & ";"
    Next J
  Next I
Exit_DBSelect:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBSelect = strList
  Exit Function
Err_DBSelect:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _
     "・Err.Description=" & Err.Description & Chr$(13) & _
     "・SQL Text=" & strQuerySQL, _
     vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBSelect
End Function
「ACCESSでひとつのフィールドに内容を」の回答画像2
    • good
    • 0
この回答へのお礼

丁寧に教えていただいてありがとうございます!
おかげさまで標準モジュールの設定や参照設定はできました!

クエリのSQL文を以下のように書いてみたのですが

SELECT DISTINCT 年月, DBSelect("SELECT 内容 FROM TEST WHERE 年月="& [年月] &""ORDER BY ID") AS 内容
FROM TEST;

「DBSelect("SELECT 内容 FROM TEST WHERE 年月="& [年月] &""ORDER BY ID") AS 内容
FROM TEST;の構文エラー:演算子がありません」
と出てしまいます。

ほかにもいくつかやってみたのですが、
エラーメッセージが延々と出てきてokを押しても押しても消えず、毎回Access自体を閉じています・・・。

どこが間違っているか教えていただけますか?
よろしくお願いいたします!

お礼日時:2013/09/05 11:35

まず、イミディエイトウインドウでSQL文をテストしたがいいですよ。


テスト要領は添付画像を参照して下さい。
その際、テーブル名、列名は質問者のそれに合わせて下さい。
なお、私は、列[年月]は文字列と仮定してテストしています。
「ACCESSでひとつのフィールドに内容を」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございました!無事にクエリを完成させることができました!
データ量が多いととても時間がかかるので制限をかけてあるのですね。
大変勉強になりました!
ありがとうございます!

お礼日時:2013/09/05 16:41

一番安直に実現するには、関数を自作することです。



例えば、図ではDBSelect()を自作してヒットしたフィールドを";"で連結して戻しています。
";"をReplace関数で" "に置換すれば目的は達成されます。

まあ、邪道と言えば邪道ですが、DBSelect()の類の関数はアプリケーションではかなり重宝します。

仮に、試されるつもりならコードを提示します。
「ACCESSでひとつのフィールドに内容を」の回答画像1
    • good
    • 1
この回答へのお礼

ありがとうございます!
関数の自作・・やったことないですがやってみたいです!
ちなみに当方Access2010を使用していて、
私が作ったものを他の人たちに配布し、
他の人たちはAccessRuntimeを使ってそれを使用しています。
このような環境でも可能でしょうか?
よろしければコード教えてください!
お願いします!!

お礼日時:2013/09/04 16:35

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

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


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