この人頭いいなと思ったエピソード

Access2003を使っています。

Accessはデータの紐付け程度のレベルしかありません。
今回、このようなことが実行したいのですが出来るかどうかわかりませんでしたので質問させていただきます。


添付画像のように、テキストが合体できるようなクエリ、関数はありませんでしょうか?

画像に示したのは例で、実際には数万レコードの、メモ型のデータを扱うことになります。ですのでメモ型でも合体できるような方法があれば教えてください。お願いいたします。

Accessで出来なければ、Excel2003でもかまいません。(出来ればAccessが良いですが)。また、それでも出来ないようであれば、このようなことが出来るフリーソフトなどを教えていただけると大変助かります。お手数ですが、回答をお待ちしています。よろしくお願いいたします。

「Accessでテキストが合体できる関数な」の質問画像

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

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

お礼日時:2011/07/07 13:41

No6です。


コードの中の、

Dim preFld As String
Dim posFld As String

の二つは使用していないのでコメントアウト
するか、削除してください。
    • good
    • 0

データモデルがよろしくありません。


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

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

お礼日時:2011/07/07 13:37

ANo3 です。



肝心なところでミスが。--;

YU-TANG さんに感謝です。 ウルウル。。。
    • good
    • 0

Access をやる方の間では、かなり一般的になっている関数です。


U-TANG さんに感謝。

DJoin 関数 - リスト文字列を取得する方法
http://www.f3.dion.ne.jp/~element/msaccess/AcTip …
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/07 13:36

<テーブル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'があります。」となりました。


どういう事になっているか分かりますでしょうか?

補足日時:2011/07/05 10:30
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/07 13:34

例で言えば、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

となるのが理想です。出来ますでしょうか?

補足日時:2011/07/05 10:21
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/07/07 13:31

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

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


おすすめ情報