• ベストアンサー

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

お世話になります。アクセスの超初心者です。 数値型であれば同じ列の合計できますが、テキスト型で以下のように 連結できる方法がございませんでしょうか? <元テーブル> レコード番号  列:キーワード(テキスト型)  列:抽出条件   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

  • 2つフィールドを連結して検索するには

    MySQLの初心者です。よろしくお願いします。 1つのテーブルにある2つのフィールドのうち、どちらかにキーワードが入っている場合(両方に入っている場合も含む)を抽出したいのですが、検索するキーワードが1個の場合は、下記のようにすれば、うまく動くのですが、 ●1個のキーワードで検索する場合 (例として、2つのフィールドのうちどちらかに「山」のキーワードが入っている場合を抽出) select * from table WHERE (item_name LIKE "%山%" or outline LIKE "%山%" ) ●テーブルの内容(テーブル名:table) item_name | outline ==========+========= 山がある + 山と川 ----------+---------- 山がある + 川と森 ----------+--------- 山がある + 谷と林 --------------------- 質問したいことは、上記のテーブルから、item_nameとoutlineのフィールドのうち、2つのキーワード「山」と「川」が両方含まれるレコードを抽出したいです。上記のテーブルでいうと、抽出の結果、1行目と2行目が抽出したいのです。 ちなみに、下記のように記述したら、上記のテーブルで1行目だけ抽出されます。 select * from table WHERE (item_name LIKE "%山%" and item_name LIKE "%川%" or outline LIKE "%山%" and outline LIKE "%川%" ) 他にも、下記のように試してみたのですが、うまく抽出できませんでした。 SELECT * FROM table WHERE (concat(item_name,outline) LIKE '%山%' and concat(item_name,outline) LIKE '%川%') item_nameとoutlineのフィールドを結合して、結合した文字列で、「山」と「川」の両方が入っているレコードを抽出する方法はありますか? 2つのフィールドの文字列をあわせたなかから、「山」と「川」のキーワードが両方含まれるレコードを抽出したいのですが、何かよい方法はありますでしょうか。ご回答よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • アクセスのテキスト型フィールドの初期値

    アクセスのテーブルにテキスト型フィールド「●●日付」を作成しました。さらに、定型入力の方法として、日付(____/__/__)を指定しています。 このテーブルから、クエリでデータを取得する際、●●日付にデータを入力していないレコードのみを取得したいと思い、クエリの抽出条件として=""(ダブルクォーテーション)や=''(シングルクォーテーション)と記載したのですが、レコードが1件も抽出されません(もちろん●●日付にデータを入れていないレコードは複数あります)。一方で、<>""や<>''で、●●日付にデータが入力されているレコードを抽出しようとした場合は、●●日付にデータが入力されているレコードが抽出されます。 テキスト型フィールドにデータが入力されていないレコードを抽出するクエリはどのようにしたら作成できるのでしょうか?

  • フィールドにテキストしか入ってないレコードの抽出

    ハイパーリンク型のフィールドにテキストしか入ってないレコードを取り出したいです。 1レコード目が 表示文字列:http://jp.msn.com アドレス:http://jp.msn.com (クリックしたらURLが開く) 2レコード目が 表示文字列:http://jp.msn.com アドレス:null (クリックしても何も起きない) の二つのレコードがあります。 クエリで2レコード目のように ハイパーリンク型のフィールドなのに、表示文字列しか入ってないレコードを抜き出したいのですが やり方がわかりません。 クエリの抽出条件に Not Like "*#*" を入れてもどちらも該当してしまいます。 ハイパーリンク型のフィールドのアドレスがNullのレコードの抜き出し方を教えてください。 よろしくお願いいたします。 (当方access2003です)

  • Access クエリとテーブルの合計値を一緒に表示

    クエリの合計値と親テーブルの合計値をフォーム上にて表示したいのですが、 うまく行かずに困っています。 クエリにて抽出した値の合計 Sum([Q抽出クエリ],[利用金額]) と、 抽出前の合計 Sum([T検索履歴],[利用金額]) を両方表示させたいです。 現状は下記の通りです。 ■使用テーブル・使用クエリ テーブル  [T検索履歴] ------- フィールド [検索履歴ID] [キーワード] [利用金額] クエリ   [Q抽出クエリ] …T検索履歴から特定のキーワードを含むレコードを抽出 フィールド [検索履歴ID] [キーワード] [利用金額] ■フォーム フォームのレコードソース … [Q抽出クエリ] ■現状と問題点 (1)[Q抽出クエリ]にて、キーワード『保護』を含むレコードを抽出します。 (2)抽出されたレコードの[利用金額]を、非連結テキストボックス tBox1 に表示します。 式:tBox1のコントロールソース =Sum([利用金額数]) (3)全体の利用金額合計を知るために、 [T検索履歴]の[利用金額]の合計値を非連結テキストボックス tBox2 に表示させます。 (ここが望む結果になりません。) 式:tBox2のコントロールソース =Sum([T検索履歴],[利用金額数]) 実行した結果 tBox1 … 抽出されたレコードの[利用金額]合計を表示 tBox2 … 上に同じ 望んだ結果 tBox1 … 抽出されたレコードの[利用金額]合計を表示 tBox2 … [T検索履歴] の[利用金額]合計を表示 以上、どうしたら良いのか分からず困っています。 宜しくお願い申し上げます。

  • ACCESSクエリーで特定の項目を更新したい

    ACCESSでテーブルから抽出したクエリーの特定の列だけに 1という数字をふりたいのですが、 update 抽出元のテーブル set 任意のセル = 1 where クエリー名 更新クエリーで上記SQLを設定しても、クエリー実行時に、 バラメータを要求され、 全てのテーブル列に1がふられます。 式が違うのでしょうか。 デザインビューにしてSQLビューに切るかえる。 select 列 from 抽出元のテーブル where 抽出の条件 ; みたいなデータです。 where の前を書き換えます。 select 列 from 抽出元のテーブル の部分を update 抽出元のテーブル set 任意のセル = 1 としてください。 最終的には以下のイメージ update 抽出元のテーブル set 任意のセル = 1 where 抽出の条件 ;

  • ACCESS更新クエリー活用方法について

    ACCESSでテーブルから抽出したクエリーで表示された特定の列だけに 1という数字をふりたいのですが、 update 抽出元のテーブル set 任意のセル = 1 where クエリー名 上記方法、更新クエリーで上記SQLを設定しても、クエリー実行時に、 バラメータを要求され、結果 全てのテーブル列に1がふられます。 式が違うのでしょうか。あくまでもクエリーで抽出されたものだけに 1をふりたいのですが。 デザインビューにしてSQLビューに切るかえる。 select 列 from 抽出元のテーブル where 抽出の条件 ; みたいなデータです。 where の前を書き換えます。 select 列 from 抽出元のテーブル の部分を update 抽出元のテーブル set 任意のセル = 1 としてください。 最終的には以下のイメージ update 抽出元のテーブル set 任意のセル = 1 where 抽出の条件 ;

  • Access「レコードが削除されました」のエラー

    お世話になります。 あるデータベースを作成し、クエリで条件抽出しています。 そのクエリを実行しても、「レコードが削除されています」という エラーが出てしまうようになりました。 どうしてなのか、どうしたらいいのか教えていただけませんでしょうか。 テーブル3つをリレーションしています。 テーブルAは、テーブルBとCにつながっています。 クエリA:テーブルAのチェックボックスAでYesの人だけを選択し、 それに連動するテーブルAのデータを選択したいと思っています。 カテゴリーごとに抽出できるようパラメータをいれ、 抽出条件に「yes」を入れてあるのですが、 実行するとエラーになります。 同じ条件で作成しているクエリBは、同様にテーブルBの チェックボックスBのYesの人だけを選択するようにしているのですが、 実行しても問題がありません。 同じ設定をしている2つのクエリなので、 あとは元のテーブルデータがおかしいのかと思っているのですが 情報はちゃんと入力されています。 情報の閲覧が出来ないので非常に困っています。 復活するときもあるのですが、不安定です。 どうかチェックする部分を教えてください。 なぜこういうことが起きるのかも教えていただければと思います。 私は素人なので、VB等は組めません。 クエリ上で行ないたいのですが、 どうしたら宜しいでしょうか。 Access2000、複数人で入力しています。 宜しくお願い致します。

  • ACCESSの時間帯の抽出について

    between関数を使って、 クエリーで、テーブル上のとある任意の時間帯が記載された列について、 5:00から19:00を抽出したい、 5:00から25:00を抽出したい、 また上記がテキストだった場合も、 500から1900を抽出したい といった条件は簡単にできますか? アクセスマスターには優しい内容とおもいますが。

  • アクセス 同じフィールド文字列を結合させたい

    お世話になります。実は、ほぼ同じ内容の問合せと回答があります。 http://okwave.jp/qa/q3023548.html これに、近いと思うのですが…。 この回答ならいける!と思い、やってみたのですが、これを利用しても自力では、うまく動かせませんでした。 (テーブル) 品目番号    集計列(テキスト型)    他の列   …   A1      "カレー,ハヤシ"       あ1    …   A1      "チキン,ビーフ"       あ1    …   B1      "バジル,タイム"       び1    …   …   ↓↓↓クエリ実行 (クエリ実行結果) 品目番号で列を集計するイメージで、しかし数値の合計でなく、キーワードの文字列を連結した結果にしたいのです。なお、他の列は『品目番号』と同様に出力したいです。 品目番号  集計列(テキスト型)          他の列   …   A1    "カレー,ハヤシ;チキン,ビーフ"     あ1   …   B1    "バジル,タイム"             び1    …   …   集計したい列の集計(文字列の結合)   "カレー,ハヤシ;チキン,ビーフ"         ↑↑↑結合の間は";"や","などで区切り文字を入れて アクセスは、初心者ですので、上記『q3023548』の中で丁寧に記載されている内容のコピーや簡単な手直しは、がんばれば出来ると思いますが、意味がよく分かっていないので修正必要な箇所については細かく教えて頂きたいです。上記の回答内容でも、まだ分からないの?!と言うレベルかと思います(苦笑)…。 上記の回答内容のSQLクエリ内『TOP 1』という部分などが、私の場合、列をすべて抽出するため、変わるのだと思いますが、やはり細かい部分が分かりません。出来ないことなのでしょうか…。 さらに可能であれば、複数の指定した列で同様なことが出来ると非常に助かります。『集計』の結果、区切り文字が連続しても構いません。(『;;;;;;;;;;;;;;』とか『,,,,,,,,,,,,,,,』という具合で…) 最終的には、帳票形式のフォームで結果を表示させます(複数の列でフィルタリング後)。 なので、多分、テーブル作成クエリになると思います…。 現在は、同じ品目番号のレコードがレコード分だけ、キーワード部分だけ変わりながら、何度も繰り返し表示される状態になっています。(各品目の画像を表示させるので帳票形式にしています。)これを1つの品目の表示を、1度にしたいです。 宜しくお願い致します。

  • Access2003 テキストボックスの値によるクエリの抽出条件

    コマンドボタンによるクエリの実行と、直接クエリを実行する(マウスでクリック) するのとで、動作が変わってしまいます。 F_メインメニュー(フォーム)内の非連結のテキストボックスtext1に文字列を入力し、 その隣に配置した検索ボタンを押すことで、テキストボックスの値を含む住所を 抽出するよう、Q_顧客を作成したのですが、F_メインメニュー内にある テキストボックスに文字列を入れ、F_メインメニューを開いたまま 直接、Q_顧客をマウスクリックにより実行すると、 確かに該当する値を含む住所をもつレコードのみがヒットします。 しかし、テキストボックスの横に配置した、コマンドボタンによる クエリの実行をすると、条件抽出されず、全件ヒットしてしまいます。 直接、Q_顧客をマウスによってクリック実行するとできるのに、 なぜコマンドボタンにコマンドボタンがクリックされたらQ_顧客を実行するよう ウィザードで作ると同じ動作にならないんでしょうか? コマンドボタンにはクリックされたらQ_顧客を実行するようにウィザードで 作成しています。 ご教授よろしくお願いします。 **以下作成状況** 「フォーム名」: F_メインメニュー ※このF_メインメニュー内に非連結のテキストボックスtext1を作成。 テキストボックスの横に検索ボタン(コマンドボタン)を作成し、 検索ボタンをクリックしたら、以下のQ_顧客を実行するよう、 コマンドボタンをウィザードで作成。 「テーブル名」: T_顧客 ※フィールドに「住所」あり。 「クエリ名」: Q_顧客 ※ ウィザードでT_顧客からクエリを作成(この時点では抽出条件設定なし) クエリの抽出条件で フィールド:住所 の抽出条件に以下を設定 Like "*" & [Forms]![F_メインメニュー]![text1].[Text] & "*"

専門家に質問してみよう