2017
5
29

AccessVBAで非連結コントロールのイベント処理を一括制御する

Accessは連結フォームっていうお手軽かんたんにテーブルにデータを入力するフォームが作れちゃうんですが、ダイレクトすぎてちょっとな、ということも…、、敢えて非連結のフォームでレコード操作したいというときに、イベント処理がほしいなと思って調べたメモです。


コントロールの準備

こういう形を想定します。コントロールの名前は、それぞれ「名称+数値」で統一させておきます。数値が特定できればMe("○○" & i)で同じレコード部分を操作できますからね。

この形を作ること自体がまずめんどくさいので、ここをVBAでやっちゃう方法もあるのですが…、Accessは自身のフォームにはコードでコントロール追加できないみたいで、別フォームから書けばできるのですが(試した)、うーん、まぁ10個くらいなら手でやっちゃってもいいかな、という所感でした。

デザインビューで見るとこんな感じの非連結。ただし、商品IDにはコンボボックスの集合値ソースとして商品マスタのフィールドが指定されているので、選ぶことはできます。

で、これらのコントロールが変更されたときに動かしたいわけですが、イベントを一個一個書いていたらキリがないので、一括で書きたいと思います。

前、ExcelVBAで同じような目的のことをしたかったとき、クラスモジュールを使ってこんな感じで書きました。

Accessでも同じようにするのかなーと思ってごねごねしたら、クラス使わなくてもできるんですって! へー!!

コード

該当のフォームモジュールにて。

イベントを拾いたいコントロールについて、イベントプロパティに関数を設定して、コントロールの数値部分を引数として持たせます。

使えるイベントはOn~の指定で、各コントロールでいろいろなのですが、

テキストボックスだけでもOn~プロパティ、たくさんありますね。個人的にはテキストボックスはOnChangeにしちゃうと1文字入力するたびに走っちゃうので、OnExitにしています。コンボボックスはOnChangeでいいかなと。

そしたら、これを走らせる側のコードをこのように。

試しに、「商品ID」コンボボックス変更時の中身に、何か書いてみましょう。

こう書いておいて、任意のコンボボックスを変更すると、

このように、変更されたコントロールの情報が取得できました。

実用

上記の仕組みを利用して書いたものがこちら。

実行してみます。

コンボボックスを変更すると、

同じレコードに、商品名と単価が入ります。

数量と単価が両方入れば、

このように。

チェックが外れると、そのレコードの情報がクリアされるとか。応用すればいろいろできそうですねー。

参考

ありがとうございました!

書籍を執筆しています。

  • このエントリーをはてなブックマークに追加
  • follow us in feedly 635
  • RSSを登録

公開日:2017/05/29


コメントを残す




*印は必須項目です。コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にですがスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)


back to top