Accessでテキストが合体できる関数ないですか?

このQ&Aのポイント
  • Access2003を使っている場合、テキストが合体できる関数は存在しません。
  • Accessはデータの紐付け程度のレベルしかありませんので、メモ型のデータを合体させるための方法もありません。
  • もしAccessやExcelでの解決策が見つからない場合、フリーソフトウェアを探すことをおすすめします。
回答を見る
  • ベストアンサー

Accessでテキストが合体できる関数ないですか?

Access2003を使っています。 Accessはデータの紐付け程度のレベルしかありません。 今回、このようなことが実行したいのですが出来るかどうかわかりませんでしたので質問させていただきます。 添付画像のように、テキストが合体できるようなクエリ、関数はありませんでしょうか? 画像に示したのは例で、実際には数万レコードの、メモ型のデータを扱うことになります。ですのでメモ型でも合体できるような方法があれば教えてください。お願いいたします。 Accessで出来なければ、Excel2003でもかまいません。(出来ればAccessが良いですが)。また、それでも出来ないようであれば、このようなことが出来るフリーソフトなどを教えていただけると大変助かります。お手数ですが、回答をお待ちしています。よろしくお願いいたします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

速度を上げる方法もありますが、分かりやすく ループの入れ子で処理します。 テーブルには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

qwerqwer15
質問者

お礼

ご回答ありがとうございました。最終的にpiroin654さんのやり方でデータを作ることができました。ありがとうございました。 実は、回答いただいた内容が全く分からず、「モジュール」「作成」とかでググってようやくVBAの実行ということが分かり、その後コピペして完成した次第です。自分の勉強不足を痛感しました。もっと勉強しないとダメですね・・・。でも本当に助かりました。ありがとうございました。

その他の回答 (6)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

No6です。 コードの中の、 Dim preFld As String Dim posFld As String の二つは使用していないのでコメントアウト するか、削除してください。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.5

データモデルがよろしくありません。 「その1」が同じものを集めるクエリは簡単に できますが、どの順位で組合せるかの情報が 不足しています。コンピュータは日本語を知り ませんから、都合の良いように順番を決めて くれません。 「その1.5」として結合順位を決める項目を 設ける必要があります。あるいは読点で 終わるものが先頭、「です。」で終わるのが 2番目、それ以外が3番目とかルールがある? そうであば条件を提示してください。

qwerqwer15
質問者

お礼

ご回答ありがとうございます。確かに順番のカラムが抜けていたと指摘されて気づきました。今後は条件についてはきちんとしてから質問するように心がけたいと思います。ありがとうございました。

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.4

ANo3 です。 肝心なところでミスが。--; YU-TANG さんに感謝です。 ウルウル。。。

  • m3_maki
  • ベストアンサー率64% (295/459)
回答No.3

Access をやる方の間では、かなり一般的になっている関数です。 U-TANG さんに感謝。 DJoin 関数 - リスト文字列を取得する方法 http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDJoin.html

qwerqwer15
質問者

お礼

ご回答ありがとうございました。DJoin関数のページもいろいろ見させてもらいました。まずはコードをコピペで実行できるくらいはスムーズに出来るようになりたいと思います。ありがとうございました。

noname#140971
noname#140971
回答No.2

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

qwerqwer15
質問者

お礼

この度はありがとうございました。初心者なので、モジュールということさえも分かりませんでしたので、補足の文章が意味不明ですよね、すみませんでした。 今後はモジュールくらいまでは理解できるように頑張りたいと思います。ありがとうございました。

qwerqwer15
質問者

補足

ご回答ありがとうございます。コードも書いていただきありがとうございます。ただ、当方にはまったく分かりません・・・申し訳ありません。 クエリの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)
回答No.1

例で言えば、3つの文章を結合しているようだがその結合の順番はどうやって制御するのか? 結合順まで考えないと、結合しても意味不明の文章になりかねない。

qwerqwer15
質問者

お礼

この度はありがとうございました。勉強不足を痛感しました。もっと頑張りたいと思います。

qwerqwer15
質問者

補足

ご回答ありがとうございます。結合の順番がない、確かにその通りですね。それでは順番のカラムがあったとすると、どうでしょうか? 結合番号____順番____本文 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 となるのが理想です。出来ますでしょうか?

関連するQ&A

  • ACCESSでの関数について

    EXCELではROW()関数で行数を付けることが出来ますが、ACCESSで同様の方法はあるのでしょうか。クエリでROW関数を入れると未定義と出ますし、テーブルにオートナンバーの行を付けて、データを一度クエリで削除した後追加クエリを実行しても1からの連番にならないので困っています。 クエリでROW()関数と同じ方法、またはテーブルでオートナンバーを1からふり直す方法があれば教えてください。

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

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

  • ACCESSのクエリの関数について

    ACCESSのクエリの関数について 列の標準偏差はテーブルの集計で出来ますが、レコードの標準偏差を求めたいと思います。 クエリの関数で、StDev(expr)のexprにレコードの[テーブルの名前]![フィールド名前]を 入れる時には","で続けるのか? この方法では式が作成出来ません。

  • Accessのクエリーで、mymax関数を使ったら

    1)Accessのクエリーで、1レコード内の複数フィールドの数値の最大値を表示させるため、「mymax」関数を使用しました。 その結果が数値型でなくテキスト型で表示されてしまうため、分析に不都合で 2)テーブル作成クエリーにしてテーブルにしてから、テーブルデザインで数値型に変更し、 3)それを抽出クエリーで並べ替えなどデータ分析に使用しています。 以上のように、3段階の手順をふまず、 1)の時点で、最大値を、数値型で吐き出させることはできますでしょうか。 バージョンはACCESS97です。 どうぞ、よろしくお願いします。

  • ACCESS 関数

    フォームのテキストボックス「text2」のコントロールソースに =roundup([text1]/1.05,0) と書いて実行したら「#NAME?」エラーになりました。試しにクエリに field2:roundup([field1]/1.05,0) と書いて実行したら、実行時に「式に未定義関数'roundup'が」あります」とエラーになりました。 ヘルプを見ると「この関数からエラー値 #NAME? が返された場合、msowcf.dll をセットアップしなければならないことがあります。」と書かれています。 検索したら、このファイルは「C:\Program Files\Microsoft Office\Office」内にありました。 モジュールの参照設定で上記ファイルを登録したところ「Microsoft Web Components Function Library」にチェックが付きました。 改めてフォームとクエリを実行しましたが結果は同じでした。 どうすればROUNDUP関数を使えるようになるでしょうか。 ACCESS2000です。よろしくお願いします。

  • ACCESS2000の帳票フォームでテキストボックスの入力値を取得したい

    こんにちは。ACCESS2000でツールを作成しています。 テーブルはExcelにリンクさせ、クエリを介して帳票フォームで データを表示しています。 帳票フォームのレコード毎にテキストボックスを追加して それぞれ入力できるようにし、その値をVBAで取得したいのですが どうすればよいでしょうか。 テキストボックスを追加して実行すると、一つのテキストボックスに 入力した値が全てのレコードに反映されているようです。 帳票フォームのしくみがよく分かりません。 どなたか教えていただけないでしょうか。 宜しくお願いします。

  • アクセスのレポートからテキストファイルにしたときに・・

    仕事でしなければならず、誰もわかる人がいないので、この場を借りて質問させていただきます。 アクセスのレポートからテキストファイル(メモ帳)にしたとき(メール送信するとき、自動で変換してくれますよね)、全レコードがテキストファイルの中に入ってしまいます。それを1つのレコードだけテキストファイル化したいのですが、どうしたらいいのでしょうか? それと一件のデーター入力したとき、メールを自動的に特定の人に送信したいのですが、これはVBの領域なのでしょうか?

  • ACCESSでのひとつ前レコードの求め方について

    ACCESS2000にてDLOOKUP関数とDMAX関数を用いて一つ前のレコード内容フィールドを クエリにて作成しようとしております。下記の式を設定しクエリを実行すると一つ前の レコード情報(前レコードの ”終了時間”内容)は出力されるのですが、暫くすると "クエリ式 '連番' の構文エラー:演算子がありません" と表示されます。 上記エラーの対処方法を教えて頂けたら思います。 尚、該当の数式ですが 前終了時間: DLookUp("終了時間","訪問業務テーブル(更新後)","連番=" & DMax("連番","訪問業務テーブル(更新後)","連番<" & [連番])) となっております。 ”連番”は オートナンバー形式のもので 1から順番に振られており、この連番を元にひとつ前レコードを参照する様にしております。 上記式に使用されている フィールドのデータ型ですが (1)連番: オートナンバー型 (2)終了時間: テキスト型 となっております。 お手数ですがよろしくお願いします。

  • Accessでテキストデータのインポート

    1レコード7000のパラメーターがテキストに1パラメーターずつ改行された形のものがあります。(3レコード分のデータだと21000行のテキストデータ) これをAccessで取り込みたいのですが、よい方法はないでしょうか? Access初心者で分からず悩んでます。 どうかご助言をいただけないでしょうか? よろしくお願いいたします。

  • Access97のクエリ内でのStrConv関数について

    Access97でクエリ内で文字の長さを判定しようとして いたのですが、Strconv関数の妙な挙動に戸惑っています。 barというテキスト型のフィールドをもつfooという テーブルを定義して、"1","22","333","4444"という 4つのレコードを作成します。 そして下記のようなクエリを作成し実行します。 SELECT foo.bar, LenB(StrConv([foo].[bar],128)) AS 式1, StrConv(StrConv([foo].[bar],128),64) AS 式2 FROM foo; すると、結果は下記のようになってしまいます。 bar |式1|式2 ------------ 1 | 0| 22 | 2|22 333 | 2|? 4444| 4|? 式1は奇数Byteの結果が、式2は"22"以外の結果が 正しくありません。 このようになってしまう理由と、対処方法を教えて ください。 環境は Windows2000ProSP4, Access97SR2 です。 ちなみにAccess2000で実行すると、正しい結果が 表示されます。

専門家に質問してみよう