「ブロック機能」のリニューアルについて

お世話になります。アクセスの超初心者です。

数値型であれば同じ列の合計できますが、テキスト型で以下のように
連結できる方法がございませんでしょうか?

<元テーブル>
レコード番号  列:キーワード(テキスト型)  列:抽出条件
  1      "山,川"                AAA
  2      "海外,国内"             AAA
  3      "熊,馬"                BBB

  ↓このテーブルを元にクエリをかける

<クエリ出力結果> 列:抽出条件にAAAを指定

  列:キーワードの合計(連結)
  "山,川、海外,国内"
      ^^
     ↑連結の境目には"、"などの区切りを入れたい。

宜しくお願い致します。

教えて!goo グレード

A 回答 (8件)

クエリに 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
    • good
    • 0
この回答へのお礼

すごい!!
できましたーーー!
ありがとうございます!!

欲張りついでにもう一点、お伺いしたいのですが。
こちらはお時間ある時に可能であればご教示ください。

抽出条件を、特定のフォームのテキストボックスに入力した文字を参照させるように変更可能でしょうか?

だめもとで以下のように指定してみましたが、やっぱりできませんでした。。。根本的にSQLを勉強しないとだめですね・・・

SELECT TOP 1 DBSelect("SELECT キーワード FROM テーブル2 WHERE 抽出条件='[Forms]![抽出条件]![テキストボックス]'","、") AS 式1
FROM テーブル2;

お礼日時:2007/05/24 10:10

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" でもエラーが出なくなります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/24 13:34

最大でも4まで用意しておけばいいというぐらいなら


クロス集計クエリの列見出しプロパティーに1~4をセットしておけばいいですね
レコードの有無にかかわらず何時も4までのフィールドができます

連結式は

[1] & IIf(IsNull([2]),"","、" & [2]) & IIf(IsNull([3]),"","、" & [3]) & IIf(IsNull([4]),"","、" & [4])
    • good
    • 1
この回答へのお礼

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

ありがとうございました!!

お礼日時:2007/05/24 13:37

失礼、後段が欠落していたようです。



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
    • good
    • 0
この回答へのお礼

丁寧なご回答ありがとうございます。

教えていただきました構文をモジュールに貼り付け
クエリで関数から指定してみました。

式1: DBSelect("SELECT キーワード FROM テーブル1 WHERE 抽出条件='AAA'","、")

実行結果は、エラーはでないのですが、全て空欄でした。

根本的に使い方を間違えているのでしょうか?
もう少しご教示いただけると幸いです。
宜しくお願い致します。

お礼日時:2007/05/23 16:31

<テーブル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
    • good
    • 0

レコード番号というフィールドがあるのですね


抽出条件(変なフィールド名ですね)ごとにレコード番号の順に連番を振るクエリを作ります

連番:DCount("*","元テーブル","レコード番号<=" & [レコード番号] & " and 抽出条件='" & [抽出条件] & "'")

このクエリをクロス集計クエリに変え、
抽出条件:行見出し
連番:列見出し
キーワード:値:先頭

これで
抽出条件 1   2
--------------------------
AAA  "山,川" "海外,国内" 
BBB  "熊,馬"  
のような結果が得られます
ひとつのフィールドにしたければこれからもう一段クエリを組んでください
              
    • good
    • 0
この回答へのお礼

ご親切にありがとうございます。
やってみてできました!クロス集計は苦手で今まであまり手を出さなかったので、こうやって使うのかぁーと感嘆してます。。

大変恐縮ですがもう少しご教示いただけますでしょうか。

>ひとつのフィールドにしたければこれからもう一段クエリを組んでください

同じデータを読み込む際はクエリに以下の式を入れてできました。
結合: [1] & "、" & [2] & "、" & [3]

処理を自動化したいと思います。
毎回、読み込むデータ量が異なる場合に"もう一段"のクエリで
指定する式に困りました。
クロス集計クエリの結果で、抽出条件の横軸が増えたり減ったりしますよね?
抽出条件 1   2
--------------------------
AAA  "山,川" "海外,国内" 
BBB  "熊,馬" 

  ↓

抽出条件 1   2      3    4 ←増えた
----------------------------------------------------
AAA  "山,川" "海外,国内" "町,都市" "鳥,魚"
BBB  "熊,馬" 

このような場合はどうやってクエリに結合する式を書けばいいのか困りました。

宜しくお願い致します。

お礼日時:2007/05/23 17:18

adoなどでレコードを開き、


対象データのレコードセットを作り、
ループを作ってデータを読み、
結果のストリングを作る。

VBA中級位の知識が必要です。
    • good
    • 0

こんにちは。



文字列の連結は"&"や"+"で可能です。
    • good
    • 0

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

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

教えて!goo グレード

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

人気Q&Aランキング