- ベストアンサー
Accessでテキストが合体できる関数ないですか?
- Access2003を使っている場合、テキストが合体できる関数は存在しません。
- Accessはデータの紐付け程度のレベルしかありませんので、メモ型のデータを合体させるための方法もありません。
- もしAccessやExcelでの解決策が見つからない場合、フリーソフトウェアを探すことをおすすめします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
速度を上げる方法もありますが、分かりやすく ループの入れ子で処理します。 テーブルにはNo1さんへの補足にあるように順番の フィールドがあるものとします。テーブル名は テーブル1とします。 準備: (1) テーブル1をもとに二つのクエリを作成 クエリ2はその1と順番のフィールドを昇順 に並べます。 クエリ1 SELECT テーブル1.その1 FROM テーブル1 GROUP BY テーブル1.その1; クエリ2 SELECT テーブル1.その1, テーブル1.順番, テーブル1.その2 FROM テーブル1 ORDER BY テーブル1.その1, テーブル1.順番; (2) データを取り込むテーブルの作成 テーブル2 その1 (メモ型) その2 (メモ型) (3) モジュールの作成 以下のコードを実行します。 DAOを使っているので、コード表のツールから 参照設定を選択して、 Microsoft DAO xx Object Library (xxは3.6のような数字です。) にチェックを入れて、上げられるところまで 上げておきます。 もし、Microsoft ActiveX Data Objects xx Library にチェックが入っていればそれよりも上にしておいて ください。 OKとします。 Sub test() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim rst As Recordset Dim preFld As String Dim posFld As String Dim str As String Set db = CurrentDb Set rs1 = db.OpenRecordset("クエリ1") Set rs2 = db.OpenRecordset("クエリ2") Set rst = db.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF rs2.MoveFirst Do Until rs2.EOF If rs1![その1] = rs2![その1] Then str = str & rs2![その2] End If rs2.MoveNext Loop rst.AddNew rst![その1] = rs1![その1] rst![その2] = str rst.Update str = "" rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing rst.Close: Set rst = Nothing db.Close: Set db = Nothing End Sub
その他の回答 (6)
- piroin654
- ベストアンサー率75% (692/917)
No6です。 コードの中の、 Dim preFld As String Dim posFld As String の二つは使用していないのでコメントアウト するか、削除してください。
- nda23
- ベストアンサー率54% (777/1415)
データモデルがよろしくありません。 「その1」が同じものを集めるクエリは簡単に できますが、どの順位で組合せるかの情報が 不足しています。コンピュータは日本語を知り ませんから、都合の良いように順番を決めて くれません。 「その1.5」として結合順位を決める項目を 設ける必要があります。あるいは読点で 終わるものが先頭、「です。」で終わるのが 2番目、それ以外が3番目とかルールがある? そうであば条件を提示してください。
お礼
ご回答ありがとうございます。確かに順番のカラムが抜けていたと指摘されて気づきました。今後は条件についてはきちんとしてから質問するように心がけたいと思います。ありがとうございました。
- m3_maki
- ベストアンサー率64% (296/460)
ANo3 です。 肝心なところでミスが。--; YU-TANG さんに感謝です。 ウルウル。。。
- m3_maki
- ベストアンサー率64% (296/460)
Access をやる方の間では、かなり一般的になっている関数です。 U-TANG さんに感謝。 DJoin 関数 - リスト文字列を取得する方法 http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDJoin.html
お礼
ご回答ありがとうございました。DJoin関数のページもいろいろ見させてもらいました。まずはコードをコピペで実行できるくらいはスムーズに出来るようになりたいと思います。ありがとうございました。
<テーブル1> その1_その2 01-1____AAA 01-1____BBB 01-1____CCC 01-2____DDD 01-2____EEE <クエリ1> その1_その2 01-1___AAA;BBB;CCC; 01-2___DDD;EEE; <クエリ1のSQLビュー> SELECT DISTINCT テーブル1.その1, DBSelect("SELECT その2 FROM テーブル1 WHERE その1='" & [その1] & "'") AS その2 FROM テーブル1; このDBSelect関数が利用出来ると言えば言えます。 列データをセミコロンで連結していますが、これは簡単に外せます。 Replace(DBSelect("・・・"), ";", "") 次は、DBSelect関数のコードです。 一旦、配列に格納していますが、これは無用です。 strListで連結するといいです。 ※配列でも返す関数を質問文に合うよう急遽改造。しかも、その途中! ※大した修正ではありませんので宜しく。 Public Function DBSelect(ByVal strSQL 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 strSQL, 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 ' ================= ' Begin With: fld ' ----------------- 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 ' --------------- ' End With: fld ' =============== Next fld .MoveNext Next R Else ReDim DataValues(0, 0) DataValues(0, 0) = "" strList = "" End If End With ' --------------- ' End With: rst ' =============== ' ------------------------------- ' セミコロン(;)で連結して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=" & strSQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBSelect End Function
お礼
この度はありがとうございました。初心者なので、モジュールということさえも分かりませんでしたので、補足の文章が意味不明ですよね、すみませんでした。 今後はモジュールくらいまでは理解できるように頑張りたいと思います。ありがとうございました。
補足
ご回答ありがとうございます。コードも書いていただきありがとうございます。ただ、当方にはまったく分かりません・・・申し訳ありません。 クエリのSQL画面で、 SELECT DISTINCT テーブル1.その1, DBSelect("SELECT その2 FROM テーブル1 WHERE その1='" & [その1] & "'") AS その2 FROM テーブル1; としてみたのですが、ダメでした。(「1」などは全角半角修正しましたが) エラー文としては、 「SELECTステートメントが間違っている予約語や引数を含んでいるか、区切り記号が正しくありません。」 とでました。 2行目と3行目の頭の半角スペースを消してみたところ、 エラー文「式に未定義関数'DBSelect'があります。」となりました。 どういう事になっているか分かりますでしょうか?
- trajaa
- ベストアンサー率22% (2662/11921)
例で言えば、3つの文章を結合しているようだがその結合の順番はどうやって制御するのか? 結合順まで考えないと、結合しても意味不明の文章になりかねない。
お礼
この度はありがとうございました。勉強不足を痛感しました。もっと頑張りたいと思います。
補足
ご回答ありがとうございます。結合の順番がない、確かにその通りですね。それでは順番のカラムがあったとすると、どうでしょうか? 結合番号____順番____本文 01-1____01____本文AAA 01-1____02____本文BBB 01-1____03____本文CCC 01-2____01____本文DDD 01-2____02____本文EEE 01-2____03____本文FFF ↓ 結合番号____本文 01-1____本文AAA本文BBB本文CCC 01-2____本文DDD本文EEE本文FFF となるのが理想です。出来ますでしょうか?
お礼
ご回答ありがとうございました。最終的にpiroin654さんのやり方でデータを作ることができました。ありがとうございました。 実は、回答いただいた内容が全く分からず、「モジュール」「作成」とかでググってようやくVBAの実行ということが分かり、その後コピペして完成した次第です。自分の勉強不足を痛感しました。もっと勉強しないとダメですね・・・。でも本当に助かりました。ありがとうございました。