<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000--VBAの小屋>例外と戦う
   1 2 3 4 5 6



ぷはー。

いかがでしょう。いろいろ見ていただきましたけど、エディタ使うのとコード書くのとヘルプ引くの、慣れてきましたです?
この3つは、VBA扱うための必須項目なんで、とにかく慣れて感覚つかんじゃってくださいね。

VBA自体は今やかなりメジャーなプログラム言語になってきてるんで、具体的な処理のサンプルコードとかは、あっちこっちで手に入るんじゃないかと思います。そういう利用の仕方もあると思うんですよ。それはそれでアリです。

でも、ココでは、開発工房では、小さくても、ちょっとでも、自分で1から処理を作っていく方法を取得してもらいたいな、って思ってます。
すげえ難しい処理を作るんじゃなくて・・・難しいプログラミングは叶わなくても、多少の心得があれば、サンプルコードとか見て、どこを書き換えていけばいいのか、エラーが出たらどうすればいいのか、そういうこと、わかりますもんね。
VBAというのはAccessの機能ではありません。「プログラミング」です。用意されている機能を使ってデータベースを作るのではなくて、データベースを作っていくための処理を作るのです。正しく作っていかなければ動かないし、ソフトウェア開発の段取りとかノウハウみたいなのもいろいろ必要です。その辺を心得ていくことが、しいてはVBA取得の早道になりますよ。

ココまで出てきたこと、ちょっとまとめてみますと・・・。

まず、VBAとは、MicrosoftOfficeというソフトウェア群の中で使えるよう改良されたVisualBasicです。
MS-Accessの中でもろもろ使えるようになってるBasicというプログラム言語ってことになります。

もちろん、単なるBasicではありませんで、Accessのテーブルやクエリ、フォーム、レポートなど各種オブジェクトを扱うように考えられているBasicということになります。Visual Basic for Applicationの略ですね。

Accessの中では、VBAで書いたコードひとまとめを「プロシージャ」と呼んでいます。ひとまとめ、というか、要するに処理ひとつぶん、ってことですね。プロシージャは、「モジュール」と呼ばれるオブジェクトの中に保存されます。プロシージャの入れ物、みたいなもんです。

モジュールには2種類あります。

 ・テーブルやクエリ、フォームやマクロなど、他のオブジェクトと同じような感じで肩を並べる「標準モジュール」
 ・フォームまたはレポートの中にくっつくようにして存在する「クラスモジュール」

前者は、データベースウィンドウの「モジュール」っていうところに作られるもので、このデータベースの中で共通していろんなとこで自由に使えるような、汎用的なプロシージャを入れておくのに適してます。いわゆるPublicなプロシージャですね。

後者は、とあるフォームの中だけの、専用プロシージャをちょこちょこっと手軽に気軽に書いて保存するのに適してます。いわゆるPrivateプロシージャってやつですね。適している、というだけで、分けなければいけない、という意味じゃないんですけれど、まあ、二種類ある、ってことです。

最近は、「そのコマンドボタンをクリックしたとき、これこれこういう動作をする」とか、そんなシチュエーションでVBAを使うことが多くなってきてますから、もしかしたらフォームやレポートに密着した「クラスモジュール」を作ることがほとんどで、あんまり「コードを書いている」っていうことを感じさせないかもしれないですね。


じゃあー・・・PublicとPrivateの違い、というか、どう違うの?というところ(おなじか)、やってみましょうか。

なにか、ありがちな処理を作りながらお話したいなと思うんですけど。。。えーと、どんなプロシージャにしようかな。。。
「年齢」とか「経過年数」とかを計算させる方法を例にとってやってみましょうか。
年齢計算とかの考え方は別途他のとこでも活用できると思うんで、一石二鳥ってことで(いろいろ苦労しながら進めますから七石二鳥くらいの労力かもしれませんが2羽しとめることはできるかも)チャレンジしてみてください。

まずは、フォームに入力された日付から、今日までの経過年数を計算させてみます。


下ごしらえを・・・。

単なる無地フォームを作って、ただのテキストボックスをふたつ、作ってください。で、フォームに適当な名前を付けて、保存しておいてください。

テキストボックスの名前はなんでもいいです。なんでもいいですけど、なんだかわからないってのはナシですよ。
わたしのは、テキスト0とテキスト3って名前になってるんで、このまま行こうと思います。0と3は、半角の数字かな。
で、テキスト0の方になんか日付を入力すると、今日までにどれくらい経過しているのか、ということをテキスト3の方に返すようにしようと思います。

まず、すべての基本となる考え方です。
ふたつの日付の「間隔」を計算するための関数があります。DateDiff関数といいます。
まずはこいつをヘルプで探してみてください。

日付って、いろんな単位で表わしますよね。どれも、10進数ではなくて、天文を基に人間が考えた「コンピュータからすると非常に中途半端で例外だらけの単位」ばかりです。
だって

1年は12ヶ月
1年は365日
(じゃないときもあるんだぜチクショー)
1ヶ月は30日くらい
1日は24時間
1時間は60分

・・・・。
なんじゃこりゃー。統一してくれっちゅーのーーーー


残念ながら、これじゃ、コンピュータには、「1994年4月1日に入社した人は、今月で勤続何年何ヶ月?」という結果を出すのが大変なんですね。「1994年4月1日に入社した人は、今日で何日目?」だったら、
DateDiff関数でなんとかなります。「1994年4月1日に入社した人は、今月で何ヶ月目?」もなんとかなります。「1994年4月1日に入社した人は、今年で何年目?」も・・・。でも、「何年何ヶ月」となると、なんか、単位が2種類になりますよね。ここまで出してくれる関数は、ないんです。

とりあえず、DateDiff関数でどこまでできるもんか、やってみましょう。

あ、「今日が何日か」を出す関数は、皆さんご存知ですよね。Date関数です。
つまり、「テキスト0に入力された値」と「Date関数でとってきた今日の日付」を比較して、DateDiff関数で答えを出そう、というわけです。

DateDiff関数のヘルプ、確認しました???

どうしても見つからないときは、VisualBasic言語リファレンスっていうところを探してみてください。「関数」という分類の中に、アルファベット順に分かれて、いろんな関数のヘルプが並んでます。関数によっては、キーワード検索では引っかかってこないものもあるかもしれないので・・・。
この関数、いろいろ指定しなくちゃならないことがあるみたいですね。

必ず必要なのは

 DateDiff(どういう単位で,いつから,いつまで)

の3つみたいです。いつからといつまではオッケーですよね。これがなんだかわかんないとお話にならないですよ。しっかりしてください!ファイトファイト!

問題は「どういう単位で」というところ・・・ここで複合的に「何年何ヶ月」と表現できればありがたいんですけど、残念ながら単一です。

で、その、単位はというと、ヘルプには

yyyy年

q四半期

m月

y年間通算日

d日

w週日

ww週

h時

n分

s秒

となってますね。ちょっとやってみましょう。
まず、下のように、テキスト3の方の「コントロールソース」欄に、DateDiff関数を書き込みます。

=DateDiff("d",[テキスト0],Date())


これだと、dだから経過日数を計算することになります。
じゃ、フォームビューに切り替えて、なんか適当な日付をテキスト0に入力してみましょう。
なんか、日数らしきものが出ますでしょう?

じゃ、sってやったら、秒数が出るのかな。
ぎゃははは。出る出る。すげー。↓

“m”ってやれば経過月数を出してくれるし、”yyyy”ってやれば経過年数が出てきます。