• ベストアンサー

アクセス 同じフィールド(テキスト型)のレコードを連結させたい

お世話になります。アクセスの超初心者です。 数値型であれば同じ列の合計できますが、テキスト型で以下のように 連結できる方法がございませんでしょうか? <元テーブル> レコード番号  列:キーワード(テキスト型)  列:抽出条件   1      "山,川"                AAA   2      "海外,国内"             AAA   3      "熊,馬"                BBB   ↓このテーブルを元にクエリをかける <クエリ出力結果> 列:抽出条件にAAAを指定   列:キーワードの合計(連結)   "山,川、海外,国内"       ^^      ↑連結の境目には"、"などの区切りを入れたい。 宜しくお願い致します。

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

  • ベストアンサー
noname#140971
noname#140971
回答No.7

クエリに DBSelect関数を組み込む場合は、次のように書きます。 ・SELECT文で使う。 ・TOP 1 を使う。 がミソです。 SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'","、") AS 式1 FROM テーブル2; <クエリ3> 山,川、海外,国内、 という実行結果を得ます。 さて、この場合、区切り子が最後にも付いています。 これが、邪魔であれば DBSelect 関数を修正します。 修正後の実行結果です。 [イミディエイト] ? DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'", "、") 山,川、海外,国内 ? DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'") 山,川;海外,国内 念のために DBSelect 関数を再度示して置きます。 Public Function DBSelect(ByVal strQuerySQL As String, _              Optional ByVal strSeparator 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 Datas As String      Set rst = New ADODB.Recordset   ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       M = .RecordCount - 1       N = .Fields.Count - 1       .MoveFirst       For R = 0 To M         For C = 0 To N           Datas = Datas & .Fields(C) & strSeparator         Next C         .MoveNext       Next R      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect: On Error Resume Next   DBSelect = Left(Datas, Len(Datas) - 1) & ""   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

tochou4848
質問者

お礼

すごい!! できましたーーー! ありがとうございます!! 欲張りついでにもう一点、お伺いしたいのですが。 こちらはお時間ある時に可能であればご教示ください。 抽出条件を、特定のフォームのテキストボックスに入力した文字を参照させるように変更可能でしょうか? だめもとで以下のように指定してみましたが、やっぱりできませんでした。。。根本的にSQLを勉強しないとだめですね・・・ SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='[Forms]![抽出条件]![テキストボックス]'","、") AS 式1 FROM テーブル2;

すると、全ての回答が全文表示されます。

その他の回答 (7)

noname#140971
noname#140971
回答No.8

SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='" & Forms!抽出条件!条件文 & "'","、") AS 式1 FROM テーブル2; ビルドを利用してフォームを参照するようにした場合に生成されたSQL文です。 結果は、同じです。 <バグのお知らせ> Exit_DBSelect: DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0)) Exit Function Exit_DBSelect:ブロックで Left関数のエラー対策にバグがありました。 上述の訂正で、 Forms!抽出条件!条件文="AAC" でもエラーが出なくなります。

tochou4848
質問者

お礼

VBAができるとできることが広がりますね。 最後までお付き合いいただきありがとうございました。 ほんとうに助かりました!!

すると、全ての回答が全文表示されます。
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.6

最大でも4まで用意しておけばいいというぐらいなら クロス集計クエリの列見出しプロパティーに1~4をセットしておけばいいですね レコードの有無にかかわらず何時も4までのフィールドができます 連結式は [1] & IIf(IsNull([2]),"","、" & [2]) & IIf(IsNull([3]),"","、" & [3]) & IIf(IsNull([4]),"","、" & [4])

tochou4848
質問者

お礼

とても参考になりました! 迅速なご回答で助かりました! ありがとうございました!!

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.5

失礼、後段が欠落していたようです。 Exit_DBSelect:   DBSelect = Datas & ""   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

tochou4848
質問者

お礼

丁寧なご回答ありがとうございます。 教えていただきました構文をモジュールに貼り付け クエリで関数から指定してみました。 式1: DBSelect("SELECT キーワード FROM テーブル1 WHERE 抽出条件='AAA'","、") 実行結果は、エラーはでないのですが、全て空欄でした。 根本的に使い方を間違えているのでしょうか? もう少しご教示いただけると幸いです。 宜しくお願い致します。

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.4

<テーブル2> ID___キーワード___抽出条件 1____山,川___________AAA 2____海外,国内_____AAA 3____熊,馬___________BBB [イミディエイト] ? DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='AAA'", "、") 山,川、海外,国内、 このような結果を得たいということでしょうか? No2さんのアドバイスに従って関数を作成してみました。 これを提示することが妥当かどうかは疑問の残るところです。 が、知らなければ、なかなかでしょう。 これを機会にさらに自分で勉強されるという前提で上述の DBSelect関数を紹介しておきます。 Public Function DBSelect(ByVal strQuerySQL As String, _              ByVal strSeparator 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 Datas As String      Set rst = New ADODB.Recordset   ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       ' --------------       ' 配列を再宣言       ' --------------       M = .RecordCount - 1       N = .Fields.Count - 1       ' ------------------------------------       ' 列情報を For-Next で配列に代入する       ' ------------------------------------       .MoveFirst       For R = 0 To M         For C = 0 To N           Datas = Datas & .Fields(C) & strSeparator         Next C         .MoveNext       Next R      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect: On Error Resume Next

すると、全ての回答が全文表示されます。
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

レコード番号というフィールドがあるのですね 抽出条件(変なフィールド名ですね)ごとにレコード番号の順に連番を振るクエリを作ります 連番:DCount("*","元テーブル","レコード番号<=" & [レコード番号] & " and 抽出条件='" & [抽出条件] & "'") このクエリをクロス集計クエリに変え、 抽出条件:行見出し 連番:列見出し キーワード:値:先頭 これで 抽出条件 1   2 -------------------------- AAA  "山,川" "海外,国内"  BBB  "熊,馬"   のような結果が得られます ひとつのフィールドにしたければこれからもう一段クエリを組んでください               

tochou4848
質問者

お礼

ご親切にありがとうございます。 やってみてできました!クロス集計は苦手で今まであまり手を出さなかったので、こうやって使うのかぁーと感嘆してます。。 大変恐縮ですがもう少しご教示いただけますでしょうか。 >ひとつのフィールドにしたければこれからもう一段クエリを組んでください 同じデータを読み込む際はクエリに以下の式を入れてできました。 結合: [1] & "、" & [2] & "、" & [3] 処理を自動化したいと思います。 毎回、読み込むデータ量が異なる場合に"もう一段"のクエリで 指定する式に困りました。 クロス集計クエリの結果で、抽出条件の横軸が増えたり減ったりしますよね? 抽出条件 1   2 -------------------------- AAA  "山,川" "海外,国内"  BBB  "熊,馬"    ↓ 抽出条件 1   2      3    4 ←増えた ---------------------------------------------------- AAA  "山,川" "海外,国内" "町,都市" "鳥,魚" BBB  "熊,馬"  このような場合はどうやってクエリに結合する式を書けばいいのか困りました。 宜しくお願い致します。

すると、全ての回答が全文表示されます。
noname#60992
noname#60992
回答No.2

adoなどでレコードを開き、 対象データのレコードセットを作り、 ループを作ってデータを読み、 結果のストリングを作る。 VBA中級位の知識が必要です。

すると、全ての回答が全文表示されます。
  • x0000x
  • ベストアンサー率52% (67/127)
回答No.1

こんにちは。 文字列の連結は"&"や"+"で可能です。

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう