色の知識で人生の可能性が広がる!みんなに役立つ色彩検定 >>

お世話になります。現在大量にデータを前に悩んでいます。

テーブルに以下のようなデータがあります。

| 薬剤名 | 効果 |
-----------------------
| A剤  | 頭痛 |
| A剤  |生理痛 |
| A剤  | 発熱 |
| B剤  | 歯痛 |
| B剤  |生理痛 |
| C剤  | 頭痛 |

これを、薬剤名ごとにまとめ効果を横へ並べる。

| 薬剤名 |効果1|効果2|効果3|効果4|
-------------------------------------------
| A剤  | 頭痛 |生理痛| 発熱 | |
| B剤  | 歯痛 |生理痛|   | |
| C剤  | 頭痛 |   |   | |

ことって出来るのでしょうか?
効果の数はいくつになるか分かりません。現在は最大7つですが、今後それ以上の物が出る可能性もあります。

ACCESSでは無理なことでしょうか?

また、ACCESSのバージョンは2002です。なお、ACCESSについては、使用法を含め初心者に毛が生えたくらいの知識しかありません。申し訳ありませんが「サル」にもわかるくらいの優しさでご指導願えれば幸いです。

よろしくお願いします。

教えて!goo グレード

A 回答 (4件)

こういう場合は、<薬剤別効果一覧>などのテーブルを作成したらどうですか?



・<薬剤別効果一覧>テーブルをクリアする。
・<薬剤別効果情報>を取得する。
・<薬剤別効果一覧>テーブルに追加する。

一種の一時テーブルを作成するということです。
これですと、作成後は、いとも簡単に閲覧したりレポートに出力できます。

*少し、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
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
>いずれ、この領域に踏み込む必要ありと感じましたので・・・。
そうなのです。もう少しハイレベル?な事を要求されています。今回は私に対応できる物かどうかを判断する第一歩としての意味合いもありました。

ADO?ですか?異国語を聞いてるようですが、勉強すれば解るようになるものでしょうか?
早速、参考書を買いに行こうと決心しました。

でも、何とかなると言うことだけでも分かったので頑張ってみます。まだ、何かと意味不明なことを質問するかも知れませんがよろしくお願いします。

お礼日時:2006/10/06 09:53

No.3ですが、補足を少しだけ。


クロス集計クエリを作る際には、ACCESSでは各薬剤のどの行が効果1、効果2、効果3に相当するのかわかりません(人間なら上から順番に判断できますが、コンピュータはそんなには賢くありません)。従って明示的に各薬剤の効果NOがわかるように、下記のようにNOの項目をつけてやる必要があります。

| 薬剤名 | NO | 効果 |
-----------------------
| A剤  | 1  | 頭痛 |
| A剤  | 2  |生理痛 |
| A剤  | 3  | 発熱 |
| B剤  | 1  | 歯痛 |
| B剤  | 2  | 生理痛 |
| C剤  | 1  | 頭痛 |

EXCELのデータなら薬剤ごとにソートしたり、NOの列を挿入して同じ薬剤に番号を振ることはそんなに難しくはないと思います。(オートフィルなどでできると思います)
後は集計クエリの列としてNOを選び、集計方法を最大値とすればご希望のような表になるはずです。
    • good
    • 1
この回答へのお礼

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

お礼日時:2006/10/12 14:18

No.1の方の回答で間違いなくご希望のことができると思います。

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

回答ありがとうございます。

クロス集計で出来るのですか。
とやってみました・・・・。

なるほど、かなり希望に近づきました。
でも、No.2の方が言うように今後レポート等で処理して行く予定ですので、効果が左詰めになって頂けると幸いです。

よく考えると、アクセスで扱うには一寸、異質のデータなのかなという気がしてきました。

もう少し、考えてみます。

お礼日時:2006/10/06 09:59

クエリの新規作成ウィザードで「クロス集計クエリ」を選択


薬剤名を行タイトル、効果を列タイトルとデータ個数にすると
| 薬剤名 |効果の個数|頭痛|生理痛|発熱|歯痛|
-------------------------------------------
| A剤  |  3  | 1 | 1 | 1 |  |
| B剤  |  2  |  | 1 |  | 1 |
| C剤  |  1  | 1 |   |  |  |
のようにはできますが...
    • good
    • 0
この回答へのお礼

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

でも、この一覧表も「使える!」って思いました。ありがとうございました。

お礼日時:2006/10/05 11:56

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

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

教えて!goo グレード

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

人気Q&Aランキング