薬剤師とAccessと個人データ管理
これで表示、追加、修正の3つのフォームができあがりました。
では表示画面を思い出してみましょう。
このボタンを押したら追加画面が開いてくれるといいわけですね。
これを実現するのが「マクロ」だったり「VBA」になります。
先にも書きましたが、結果として求めることが実行できるならどちらでもいいです。
でもまずま「マクロ」からだとおもいます。なんでかっていうと、「日本語」で選べるから。
Accessはアクションクエリとマクロさえあれば、だいたいなんとかなります。もし何とかならなくなったら初めてVBAでいいと思います。
では今作ったフォームを開くマクロを作ってみましょう。
マクロの新規作成から
マクロ名を表示してみます。
表示しなくてもいいのですが、通常ソフトが出来上がるにつれ、処理も増えます。つまりマクロも増えます。すると管理が大変になるわけです。
そういった場合、似たような処理をする、例えば「フォームを開く」というマクロをまとめておくと、後から分かりやすく、管理しやすい場合があります。
まあ、こういったものもあるよ程度で。
ではマクロ名に「KDT」と入力して、アクションに「フォームを開く」を選択します。
すると、画面下に引数(ひきすう)が選択できるので、開きたいフォームを選択します。
バージョンによって微妙に配置が違うみたいですが。
これで出来上がりです。名前を付けて保存しましょう。
これだけ?って感じですよね。
これだけです。このマクロをボタンを押したときに指定してあげればプログラムが動いているように見えてきます。
個人データ画面をデザインで開いて追加ボタンを選択。
プロパティ内のイベントタグの中からクリック時に指定します 。
フォームビューに切り替えてちゃんと動くかボタンを押してみましょう。
ここで、フォームビューに切り替えたとき、プロパティは表示してほしくありません。
フォームのデザイン変更の許可プロパティをデザインビューのみに変更しておきましょう。
では今のマクロをVBAで書いてみましょう。
クリック時に先ほど作成したマクロが指定してありますが、ここでイベントプロシージャを選択します。
![](https://www.google.com/images/icons/product/drive-32.png)
このボタンを押します。
こんな画面が出てきます。ここに色々書くのですが、その前にツールの参照設定から
Microsoft DAO XXにチェックが入っているか確認しておきましょう。
チェックが入っているのが確認できたら「OK」押して先に進みます。
今、図のようになっていると思います。この2行の間に実行してほしいことを書けばいいだけです。
何を書くかといいますと
DoCmd.OpenForm "KDT"
これだけです。
これでマクロとVBAどちらでもプログラムが動きました。(動いたはずです。)
では続きを作っていきましょう。
マクロにしろVBAにしろ、ボタンを押したときの動作をひとつずつ考える必要があります。逆に、いくら複雑そうなプログラムに見えても、一つずつ見ていくと別にたいしたことをしているわけではありません。
まずどうして、次にどうして・・・と自分のしたいことを分割して考えてあげることができれば思ったより簡単に作れます 。
では登録画面の追加ボタンを押したときにどうしたいのか考えて見ましょう。
1、 まずボタンを押すと、本当にに登録していいかどうか確認メッセージを表示させる。
2、 登録OKならまず、フォーム「KD」を登録可能な状態にする。
3、 フォーム「KD」を選択する。
4、 フォーム「KD」の新規レコードに移動する。
5、 新規登録フォーム「KDT」に入力した値を代入する。
6、 新規登録用フォームを閉じる。
7、 代入したデータを保存する。
8、 再度フォーム「KD」をデータの入力できないようにする。
とりあえずこれでいいでしょうか?
では順番に
もし○○なら・・・というときに使うのがIF文ですね。
ホントは日本語で選べるマクロで作りたいところなんですが、このifに関しては正直VBAの方が分かりやすいのでこちらでいきたいと思います。マクロで作る場合は表示から条件を表示させ、そこに条件式を書いてあげればできます。
IF ○○ then
Else
Endif
今回は質問に対する答えがOKの場合という形にしたいので、Msgbox関数というのを使います。
また、答えた結果をプログラムの分岐に利用したいので(「はい」と「いいえ」で処理を変えたい)、括弧「()」で囲む必要があります。
If MsgBox("登録してよろしいですか?", vbOKCancel, "登録確認") = vbOK Then
こうなります。
私が初めて作った時はどちらもしらなかったので、Msgbox関数ではなく、フォームを作成し、そこに「はい」「いいえ」2つのボタンを配置して、「はい」のボタンにマクロを埋め込むということをしていました。
今はそんなことしませんが、正直それで困りませんでした。つまり同じ処理をするとしても何通りも方法があるってことです。
では2番目、「フォームを登録可能な状態にする」というのは
Forms!KD.AllowAdditions = True
これでフォーム「KD」の登録プロパティを「はい」にできます。
マクロと違って、VBは「日本語の選択肢」からやりたいことを選んでくるというわけにはいかないので、「関数とコマンドをある程度覚える必要」が出てきます。さらに初めのうちはいちいちコマンドを調べなくてはいけないので敷居が高く感じてしまうんですよね。
プロパティの追加の許可を選択しておいてファンクションキーのF1を押すとその部分を変更するためのHelpが表示されますので、たまには見てみましょう
3番目、フォーム「KD」を選択するというのは
DoCmd.SelectObject acForm, "KD", False
最後の「False」っていうのはすでに開いているフォームを選択するときは「False」ってつけるそうです。
4番目、新規レコードに移動して
DoCmd.GoToRecord , , acNewRec
5番目、代入は代入先が左にしないといけないので
Forms!KD!KNO = Me.KNO
この「Me.」っていうのとってもよく使います。まあ今開いているフォームと思っておけばいいです。
これでカルテ番号が代入されるはずです。
これを作成したフォームのコントロールの数だけ繰り返すと
最終行
Forms!KD!IPT = Now()
はテーブル既定値に指定してあるのでなくてもかまいません。
代入が終わったら入力用フォームを閉じたいので
DoCmd.Close acForm, "KDT"
代入したデータを保存したいので
DoCmd.RunCommand acCmdRefresh
最後に閲覧用フォームで追加できないように戻さなくてはいけないので
Forms!KD.AllowAdditions = False
を加えると
頑張って入力してください。
最後から2番目の
DoCmd.RunCommand acCmdRefresh
なんですが、これはAccessがデータを保存するタイミングというのがありまして、代入しただけでは表示はしてますがまだ保存はされていません。ですから代入と同時にデータを保存したい場合はこの行を入れておきましょう。