• ベストアンサー

ACCESSで縦に並んだテーブルデータを横に並べることは出来ますか?

お世話になります。現在大量にデータを前に悩んでいます。 テーブルに以下のようなデータがあります。 | 薬剤名 | 効果 | ----------------------- | A剤  | 頭痛 | | A剤  |生理痛 | | A剤  | 発熱 | | B剤  | 歯痛 | | B剤  |生理痛 | | C剤  | 頭痛 | これを、薬剤名ごとにまとめ効果を横へ並べる。 | 薬剤名 |効果1|効果2|効果3|効果4| ------------------------------------------- | A剤  | 頭痛 |生理痛| 発熱 | | | B剤  | 歯痛 |生理痛|   | | | C剤  | 頭痛 |   |   | | ことって出来るのでしょうか? 効果の数はいくつになるか分かりません。現在は最大7つですが、今後それ以上の物が出る可能性もあります。 ACCESSでは無理なことでしょうか? また、ACCESSのバージョンは2002です。なお、ACCESSについては、使用法を含め初心者に毛が生えたくらいの知識しかありません。申し訳ありませんが「サル」にもわかるくらいの優しさでご指導願えれば幸いです。 よろしくお願いします。

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

  • ベストアンサー
noname#22222
noname#22222
回答No.2

こういう場合は、<薬剤別効果一覧>などのテーブルを作成したらどうですか? ・<薬剤別効果一覧>テーブルをクリアする。 ・<薬剤別効果情報>を取得する。 ・<薬剤別効果一覧>テーブルに追加する。 一種の一時テーブルを作成するということです。 これですと、作成後は、いとも簡単に閲覧したりレポートに出力できます。 *少し、ADO を利用することになります。コードはサワリだけ。 薬剤名 効果総数 効果名_1 効果名_2 効果名_3 A剤   3    頭痛   生理痛  発熱 このように、<薬剤別効果一覧>テーブルにデータを登録するコードは以外と簡単です。 Private Sub コマンド_薬剤別効果一覧追加_Click()   Dim isOK  As Boolean   Dim strSQL As String      isOK = CnnExecute("DELETE FROM 薬剤別効果一覧")   If isOK Then     strSQL = "INSERT INTO 薬剤別効果一覧 " & _          "(薬剤名, 効果総数, 効果名_1, 効果名_2, 効果名_3)" & _          " Values " & _          "('A剤', 3, '頭痛', '生理痛', '発熱')"     isOK = CnnExecute(strSQL)     If isOK Then       MsgBox "[薬剤別効果一覧] にデータを追加しました。"     End If   End If End Sub 僅かに、CnnExecute()を自作ライブラリに追加するだけで、このように読めば判るコードが書けます。 これならば、質問者にとっても別に難しいことではないと思います。 SQL文は、Accessプロジェクトのそれですので Jetとは違うかも知れませんが基本は同じです。 課題は、strSQL の生成にあります。 ここが一つにハードルです。 まあ、それも含めて書くと、一つのプロシージャ全体を請け負うことになりますのでチョットです。 質問レベルからして、いずれ、この領域に踏み込む必要ありと感じましたので・・・。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute    Dim isOK As Boolean    Dim cnn As ADODB.Connection       isOK = True    Set cnn = CurrentProject.Connection    With cnn      .Errors.Clear      .BeginTrans      .Execute strSQL      .CommitTrans    End With Exit_CnnExecute: On Error Resume Next    cnn.Close    Set cnn = Nothing    CnnExecute = isOK    Exit Function Err_CnnExecute:    isOK = False    If cnn.Errors.Count > 0 Then      ErrMessage cnn.Errors(0), strSQL      cnn.RollbackTrans    Else      MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"    End If    Resume Exit_CnnExecute End Function

kazh
質問者

お礼

回答ありがとうございました。 >いずれ、この領域に踏み込む必要ありと感じましたので・・・。 そうなのです。もう少しハイレベル?な事を要求されています。今回は私に対応できる物かどうかを判断する第一歩としての意味合いもありました。 ADO?ですか?異国語を聞いてるようですが、勉強すれば解るようになるものでしょうか? 早速、参考書を買いに行こうと決心しました。 でも、何とかなると言うことだけでも分かったので頑張ってみます。まだ、何かと意味不明なことを質問するかも知れませんがよろしくお願いします。

その他の回答 (3)

  • gatt_mk
  • ベストアンサー率29% (356/1220)
回答No.4

No.3ですが、補足を少しだけ。 クロス集計クエリを作る際には、ACCESSでは各薬剤のどの行が効果1、効果2、効果3に相当するのかわかりません(人間なら上から順番に判断できますが、コンピュータはそんなには賢くありません)。従って明示的に各薬剤の効果NOがわかるように、下記のようにNOの項目をつけてやる必要があります。 | 薬剤名 | NO | 効果 | ----------------------- | A剤  | 1  | 頭痛 | | A剤  | 2  |生理痛 | | A剤  | 3  | 発熱 | | B剤  | 1  | 歯痛 | | B剤  | 2  | 生理痛 | | C剤  | 1  | 頭痛 | EXCELのデータなら薬剤ごとにソートしたり、NOの列を挿入して同じ薬剤に番号を振ることはそんなに難しくはないと思います。(オートフィルなどでできると思います) 後は集計クエリの列としてNOを選び、集計方法を最大値とすればご希望のような表になるはずです。

kazh
質問者

お礼

補足ありがとうございます。 なるほど!って感じです。確かに希望どおりになりますね。 EXCELと連携させてデータを加工すれば出来るのか~。 う~ん、依頼者(上司)に相談してみます。たぶん、却下?かな。 でも、少し光が見えてきました。ありがとうございました。

  • gatt_mk
  • ベストアンサー率29% (356/1220)
回答No.3

No.1の方の回答で間違いなくご希望のことができると思います。一つ訂正するところは、集計方法として「データの個数」でなく「データの最大値」を選ぶという点です。 「A剤」の「効果1」に該当する項目が一つしかなければ、その値のみが表示されます。(「データの最小値」でも同じですが)

kazh
質問者

お礼

回答ありがとうございます。 クロス集計で出来るのですか。 とやってみました・・・・。 なるほど、かなり希望に近づきました。 でも、No.2の方が言うように今後レポート等で処理して行く予定ですので、効果が左詰めになって頂けると幸いです。 よく考えると、アクセスで扱うには一寸、異質のデータなのかなという気がしてきました。 もう少し、考えてみます。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

クエリの新規作成ウィザードで「クロス集計クエリ」を選択 薬剤名を行タイトル、効果を列タイトルとデータ個数にすると | 薬剤名 |効果の個数|頭痛|生理痛|発熱|歯痛| ------------------------------------------- | A剤  |  3  | 1 | 1 | 1 |  | | B剤  |  2  |  | 1 |  | 1 | | C剤  |  1  | 1 |   |  |  | のようにはできますが...

kazh
質問者

お礼

早速の回答ありがとうございます。 クロス集計クエリですね。 でも、今後薬剤ごとにカードを作る事を考えています。(できるのかな?)できれば、薬剤ごとに効果が並ぶとうれしいです。 でも、この一覧表も「使える!」って思いました。ありがとうございました。

関連するQ&A