<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 Access97 VBAの森>クラスモジュール



(1)

VBAってどんな感じか、雰囲気つかんでいただけましたでしょうか。

ときどき、Excelとかでも、関数って使いますよね。
=Date()とか、=Lookupとか。ああいうのを作ってるような感覚なんですよ。

Public Function HeboHebo( )

 あんなことや

 こんなことや

 いろんなことをやって

 ようし、わかった。どうやら答えはだ!

End Function

で、コマンドボタンのクリック時のイベントとか、テキストボックスのコントロールソース欄に=HeboHebo( )って入力しておくと、コマンドボタンをクリックしたとき、あるいはそのフォームが開いてテキストボックスが表示されたときに上の関数が動いて、2って答えが出る、っていうわけですね。

真ん中の「あんなこと」とか「こんなこと」とかの部分を、VBAという言語(かな?)で記述して処理を作り、これひとつをプロシージャと呼び、プロシージャをいくつか格納するオブジェクトのことをモジュールと呼びます。

まあ、なーんとなく、って感じでいいと思います。実際の処理の内容は、これからいろんなサンプルなどを見ながら少しずつ詰めていけばいいと思いますけど、じゃ、それがいったい、何ナノ???ってなっちゃうと、お先真っ暗ですもんね。プロシージャとは、みなさんがデータベースの中で求めたい値や得たい結果を出すためのオリジナル関数だと思ってください。で、そのプロシージャをVBAという特殊なプログラム言語で書いて、モジュールというオブジェクトの中にしまっておくわけです。

上のばかばかしい絵でいくと、青や緑のすずり箱みたいなのがモジュール。中の黄色いのがプロシージャたちで、この黄色いのはみんな、VBAという言語で書かれているのです。

で、例えばテキストボックスのコントロールソース欄とか、フォームやらレポートやらのイベントプロパティ欄に=HeboHebo()とか書いておくと、プロシージャHeboHeboの中身が実行されて、具体的な動きが起こるとか、なんか答えがテキストボックスの中に返ってくるとかなるわけです。

で、結論としては、決して高度なものでも便利なものでも、知っているから上級者というわけでもないということです。

VBAならなんでもできるとか、妙な妄想をいだいてはいけませんよ。処理をマクロで作ろうがクエリーで考えようがプロシージャを作ろうが、手持ちのカードでできりゃいいんです。目的と手段を取り違えてしまわないように、ほんとうに作り込みたい処理をしっかり見つめるようにしましょう。

Accessの上級者とは、ほんとうにシステム化したい処理を見極めることができる人だと、わたしはそう思いますヨ。


数年前にシゴトさせていただいたお客さんで、商品の注文を業者にするときの注文依頼書をAccessで作って、というご依頼がありました。必要な物品を入力して、指定した業者さん宛ての注文書を印刷して、上司のはんこもらってファックスか郵送か手渡しかするっていうものだったんですけどね。


要件をまとめる担当のシステム部の人は、VBAで作ってくれの一点買い、じゃなくて一点張り。
他の要件はいっさいなし。そ、それはどういう意味なんだ・・・??

精密機械の研究開発をする会社だったので、テスト用の細かい部品とかをよく発注するらしいんですけど、部品がとにかく細かくて種類が多くて名前もややこしいんです。
「A」というテスト用をするのに必要な物品をひとそろい揃えるとなると、200から300アイテムくらいの部品を発注しないとならなくて、ふつうの注文書にいちいち書いてるとそれだけで1日シゴト。いつも発注する数や種類はおなじなのに・・・。

なので、「Aテスト用の物品を発注」ってやったら、関連する物品が200種類くらいだだーっと自動的に入力されて、で、印刷すればいいだけにしたい、ってのが、このシステム化の趣旨だったんですけどね。「テストA用の物品の一覧」っていうのが、明確になっていなくて、注文書を書く人がいつもいちいち調べたり前に書いた注文伝票のファイルを見てたりしてて・・・。

ここんとこを楽にするためのシステム化なんです。
下のようなテーブルが既にあって、10000アイテムくらい部品名が登録されてるんです。整備されているのはここまで。で、ここから、より手間をかけずに注文書を出したい・・・。
部品名 型式番号 価格 取扱メーカー 分類
プラグA 66A-4041 1,600 N社 電気系統
プラグB 66B-4061 1,800 N社 電気系統
ツインナックスケーブル 78G79041 2,500 B社 ケーブル
 ・  ・  ・  ・  ・
 ・  ・  ・  ・  ・

みなさんなら、あとどんな情報があれば作れる、と、お考えになりますか?どうすれば、「パターン注文」みたいな処理、作れるでしょう。すこーし、頭の中でシュミレーションしてみてください。
VBAで作るとか、そういうことを考える前に、なんかやんなきゃなんないこと、あるんじゃないかと思うんですけども・・・。

で、2週間くらいかかって、600パターンほどの注文パターンを洗い出してテーブルを作り、、それぞれ発注対象となる部品とのひもづけをしました。でも、システム部の人は、「なんでテーブルなんか必要なの。VBAでやればいいのに」と、失笑する始末。???それってどういう意味?????

ようやくシステムを完成させ、検収書をいただいてその会社を去るときに、その人の机の引き出しに消しゴムのかすをいっぱい入れて帰ってきました。

タマゴ焼き作るとき、どうやって作ります?

フライパンですか?なべ?ホットプレート?電子レンジ??箸でかき回します?おたまか、泡立て器か???
ひとつの処理をVBAで作るとかクエリーでやるとかマクロを使うとかって、この程度のことです。
自分で使いやすいなと思う道具だけ使って、結果的にできりゃあいいんですよ。でも、タマゴなかったら作れないでしょう?

すごい料理人が、からっぽのボールをうんちくたれながらなんぼかき回したところで、タマゴ焼きにはならんですよね。

どんなにすっごいVBAの技術身につけてたって、テーブルにデータがなかったらにっちもさっちもいかないです。
VBAの記述方法を習得していくと同時に、それを活かせるテーブル設計のテクニックも、みなさんなりの方法で見出していってみてください。


モジュールには大きく大まかにざっくり分けて2つの種類があると考えてみてください。

★標準モジュール

モジュールオブジェクト。ふつうのやつですね。
この中にプロシージャを作っておけば、フォームのコマンドボタンとかテキストボックスのコントロールソースとか、単独でも実行できるというわけです。

★クラスモジュール

フォームとかレポートにくっついてるモジュール。これがね、なかなか便利なんすよ。

今回は、フォームやレポートにくっついて活躍するクラスモジュールを使ってみようかなと思います。


と、いっても、特別なもんではありません。
標準モジュールの中に作られたプロシージャというのは、作って保存しておけば、どこからでも自由に実行できる、みんなで共通して使うことができるんですね。

でも、クラスモジュールというのは、フォームとかレポート個々に作られる、とってもローカルなプロシージャになります。他のフォームからとかレポートから実行することができないんですけど、その反面メリットもあるというわけです。


じゃ、ちょっとなんか作ってみましょうか。まずはフォームのクラスモジュールでいろんなことやってみましょう。

こんな感じの適当なフォームがあったとします。
テキストボックスがふたつと作りました。で、えー・・・。
このテキストボックス片方になんか値を入力した後、もう片方のテキストボックスになんか値が入るようにしようと思います。

えーと、わたしのは、テキスト1、テキスト3って名前だったんで、そのまんま使いますね。

テキストボックス一つにしても、実にいろんなイベントがあるんです。
どのイベントにどんな処理をつけたらどうなるか、そんなことも少しずつ極めていかれるとよいでしょう。
でも、テキストボックスのイベントの中でもっともよく使うのは、更新後処理(AfterUpdate)じゃないかな、と思います。
なんか入力して、Enterキーを押すとか、カーソルを他のところに移すとかした瞬間、ですね。



じゃ、テキスト1の更新後処理を・・・。
そこんとこよろしく。ではっ。

一番右端にあるビルドボタンをクリックして、コードビルダを使います。



と、どどーんとなんか白いウィンドウが出てきますね。
でもでも、これっていわゆる標準もジュール作るときにも使ってた、コード書く画面なんですよ。ちがうとこは、

Private Sub プロシージャ名( )

ってなってるとこです。その名の通り、プライベートなサブプロシージャっていう意味。サブプロシージャっていうのは、そのー、なんていうか、この中で計算したり考えたりして出した答えを外に吐き出すところでおわりで、また値がここに返ってくることのない、一方通行のプロシージャ・・・なんですけど、なんかよくわかんないですよね。
ここのところはあんまり気にしなくてよいのではないかな、と思います。先でまた勉強しましょう。

今までいじってたあやのこうじシステムとかの標準モジュール内のプロシージャは、

Public Function プロシージャ名( ) 

こんな風に作ってましたよね。こっちはファンクションプロシージャといって、まあ、あんまし細かいことは気にしなくていいと思うんですけど、ここから更に別のプロシージャに値を渡して、そこでゲットした答えをまたもらって返ってくることができるタイプのプロシージャなんです。

この辺もおいおい・・・。


では、なんか処理を書いて見ましょう。そうだな・・・じゃ、手っ取り早く・・・。

Private Sub テキスト1_AfterUpdate()

Me![テキスト3] = Me![テキスト1] * 20

End Sub

テキスト1に入力した数字に、20かけてテキスト3に出します。

どうでしょ。フォームビューに切り替えて、なんか適当に数字入れてみてください。

いろんな数字入力して、様子を見てみてください。かわります?
なんかあんまりにもあっけなくて、プロシージャってカンジしないですよね。これじゃ。

でも、これって、マクロの「値の代入」と同じことなんです。
ただ、クラスモジュールなんで、

forms![フォーム名]とか、絶対的な書き方をしなくてもよくて、Me!これでおっけー。

それがちょっぴり楽かな・・・。