プロが教えるわが家の防犯対策術!

ご存知の方がいたら教えてください。
今下記のようなデータがあります

ABC 30
ABC 40
ABC 344
ABD 100
ABD 200
ABE 100

これを
ABC 30 40 344
ABD 100 200
ABE 100
のように横展開した結果を出すにはクエリはどのように組んだらよいのでしょうか?

半日かけて悩んでますが、、結果が出ません。
童かよろしくお願いします。

A 回答 (5件)

以前の回答からの引用が多くなりますが



Mid 部分について

> >    sTmp = sTmp & "、" & rs("分類2")
> 抽出された分類2を1つの文字列として作っていきます。
> 作られた文字列は、分類1="B" であった場合
> sTmp = "、1-1、1-2" となります。

> 関数の戻り値を設定する時、
> 1つでも分類2が抽出されていれば文字数は0以上となっていますが
> 作った文字列先頭の "、" は不要なため、2文字以降ということで Mid(sTmp, 2) とします


>   ClassString = IIf(Len(sTmp) > 0, Mid(sTmp, 2), "")
は分かりづらいですね。

以下の書き方と一緒です。
(こちらの方が処理は速いようです:確かではありませんが)

  If (Len(sTmp) > 0) Then
    ClassString = Mid(sTmp, 2)
  Else
    ClassString = ""
  End If


> ※「ClassString」という名前は適宜変更してください。

> ネットでclassstringを調べたのですが、・・・

「ClassString」という名前は、かってに命名した名前です。
標準モジュールに「ClassString」名で関数を作成したので、
クエリからその関数名で結果を得ようとしています。

標準モジュールに作成した関数名が「HogeHogeXX」なら、
クエリにも HogeHogeXX を記述することで関数の戻り値を利用できます。

回答番号3に記述した URL 内の回答4 にもう少し記述しています。


読んで、また分からなかったら 補足/お礼の欄に書いてください。
    • good
    • 0
この回答へのお礼

なるほどです。
(回答が遅くなってすみません!!)

まだまだ勉強が足りないですが、
わかってくるととても楽しいです。^^

どうもありがとうございました。

お礼日時:2009/02/12 11:59

以下の環境で再度試してみました。



Windows2000Pro + Access2000
Windows XP Pro + Access2003
Windows Vista + Access2007

正常動作を確認できました。
ただ、1つのファイル(mdb/accdb)で完結していた環境となります。
(パススルークエリでは使えない方法です)


確認した手順:Access2003での)

・テーブルサンプルのCSV化
テーブルサンプルをメモ帳にコピー
全角スペースを半角 , に置換
半角 ,, を , に置換( , が1つになるまで)
行先頭 , 削除
ファイルへセーブ

・Access を起動し、新規mdb作成

・CSVファイルを指定テーブル名でインポート

・VBE起動
(メニューの「ツール」->「マクロ」->「Visual Basic Editor」)

・VBE画面で
 参照設定の追加(メニューの「ツール」->「参照設定」)
  Microsoft ActiveX Data Objects 2.1 Library

 標準モジュールの挿入(メニューの「挿入」->「標準モジュール」)

 Public Function ~ End Function 部分を貼り付け

・クエリの作成
 「デザインビューでクエリを作成する」より、テーブル選ばず閉じるボタン
 SQLビューへ表示変更
 表示されているものを消去し、提示SQLビュー内容を貼り付け


 表示を「データシートビュー」にすると、結果が表示されるはずです。


※「ClassString」という名前は適宜変更してください。

※ なぜエラーとなったか、わかりませんでした。
    • good
    • 0
この回答へのお礼

本当にご丁寧にありがとうございます。
書いてある通りの手順で実行したところ、うまくいきました!
が、どうしてもどうしても理解が追いつきません。。

つまりこれは、標準モジュールのほうでは、1件づつデータを読んでいて、"&sclass&"部分で、クエリのほうの実行結果を流用しているということなのでしょうか? また、STMPは、結果のテーブルを作っていて、
最後のmidはなにをしているのでしょうか?ここでもclassstring???

かなり混乱していてすみません。ネットでclassstringを調べたのですが、いまいち理解しきれず、再度質問してしまいました。

どうぞよろしくお願いしますm(_ _ )m

お礼日時:2009/01/29 14:49

ちょっと考えてみます。


(ただ、私に考えれるかどうか疑問もありますが、あまり期待しないでください)
追加回答できなかったらごめんなさい。

その間、ここでも読んでみてください。
http://www.kotaete-net.net/Default.aspx?pgid=14& …
    • good
    • 0

他で回答したものと同じなのですが参考になれば。



テーブル「T_分類」が以下のようになっている時(どちらもテキスト型)
  分類1  分類2
  A     1
  B     1-1
  B     1-2
  C     1-A
  C     1-B
  C     1-C
クエリ操作で
  分類1  分類
  A     1
  B     1-1、1-2
  C     1-A、1-B、1-C
とする方法になります。

クエリのSQLビュー内容)
SELECT [分類1], ClassString([分類1]) AS 分類
FROM T_分類
GROUP BY [分類1]
ORDER BY [分類1];

標準モジュールに記述する関数)
Public Function ClassString(sClass As String) As String
  Dim rs As New ADODB.Recordset
  Dim sTmp As String

  sTmp = ""
  rs.Source = "SELECT [分類2] FROM T_分類 WHERE [分類1]='" & sClass & "' ORDER BY [分類2] ;"
  rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
  While (Not rs.EOF)
    sTmp = sTmp & "、" & rs("分類2")
    rs.MoveNext
  Wend
  rs.Close

  ClassString = IIf(Len(sTmp) > 0, Mid(sTmp, 2), "")
End Function


>    sTmp = sTmp & "、" & rs("分類2")
抽出された分類2を1つの文字列として作っていきます。
作られた文字列は、分類1="B" であった場合
sTmp = "、1-1、1-2" となります。

関数の戻り値を設定する時、
1つでも分類2が抽出されていれば文字数は0以上となっていますが
作った文字列先頭の "、" は不要なため、2文字以降ということで Mid(sTmp, 2) とします。

この回答への補足

丁寧に教えてくださってありがとうございます。

すごく初歩的なところで、わかっていないので、教えてください。。
上記にあるようなテーブルを作ってクエリを書いてモジュールも作成してみましたが、、そうしてクエリを実行すればうまくいく、というものでもないんでしょうか?
エラーMSGとしては、クエリ式ClassString([分類1]のあいまいな名前です。と出ています。

クエリとモジュールの関係性がまだあまりわかっていないため、
質問がおかしかったらすみません。

どうぞよろしくお願いします。

補足日時:2009/01/22 14:26
    • good
    • 1

一列づつ3行出力するのがよいのではないでしょうか?


SELECT データ FROM テーブル WHERE 名前='ABC'
    • good
    • 1
この回答へのお礼

ありがとうございます。
ですが、やはり、横展開のデータが必要なのです。。

ABC を "名前" 30 を"データ"とすると、
select 名前,データ from テーブル
group by 名前
でやると、 ABCは1件だけが出力され、他のデータは消えてしまいますので、やはりgroup byは使えず・・。
というところで悩んでいるのです。

名前には何がはいってくるか未定なので、where句で直接聞くわけにもいかずです。


どうぞよろしくお願いします。

お礼日時:2009/01/15 16:26

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

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


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