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



プロシージャは、「記述が短い方」がレスポンスはよいものだ、と考えてください。
厳密に処理時間にどう影響してくるか、というのは、パソコンという環境でははっきりとはわからないので、なんともいえないですが、やっぱし行数が少ないプロシージャが理想的です。今こいつは、5〜6行のレコード数のクエリで動かしてますからぱっと答え出てくるし、そんなに負荷かかってないように思えるんでオッケーかなって思いますが、これが5万レコードあるテーブル相手にやったら、やっぱ多少レスポンスが落ちるとか、いろいろあると思うんです。
書き方は自由ですし、まあ、今のパソコンってパワーありますから、1行2行で目くじら立てるのも時代遅れかもしれませんけど、できるだけすっきりと書いた方が何かとよいのだ、ということ、ちょっとだけ頭に入れておいてください。
必要な処理を削っちゃいけませんけど、あんまり複雑な条件分岐とか、変数をたくさん使っちゃってるような場合は、もっと少ない記述で何とかならないものか、ということにも目を向けてみてください。

あともうひとつ、「データ型」も、少しずつ気を配るようにしてみてください。

これも、そのプロシージャのレスポンスに影響を及ぼす一因になることがあります。
ヘルプで「変数」についていろいろ見ていくと、「データ型の概要」ということで、以下のような表が載っていました。

データ型 記憶領域のサイズ 範囲
バイト型 (Byte) 1 バイト 0 〜 255
ブール型 (Boolean) 2 バイト 真 (True) または偽(False)
整数型 (Integer) 2 バイト -32,768 〜 32,767
長整数型 (Long) 4 バイト -2,147,483,648 〜2,147,483,647
単精度浮動小数点数型 (Single) 4 バイト -3.402823E38 〜 -1.401298E-45 (負の値)。 1.401298E-45 〜 3.402823E38 (正の値)。
倍精度浮動小数点数型 (Double) 8 バイト -1.79769313486231E308 〜 -4.94065645841247E-324 (負の値)。 4.94065645841247E-324 〜 1.79769313486232E308 (正の値)。
通貨型 (Currency) 8 バイト -922,337,203,685,477.5808 〜 922,337,203,685,477.5807
10 進型 (Decimal) 14 バイト 小数部分を持たない数値の場合、-79,228,162,514,264,337,593,543,950,335 〜 79,228,162,514,264,337,593,543,950,335 の範囲の値をとります。小数点以下 28 桁の数値の場合、-7.9228162514264337593543950335 〜 7.9228162514264337593543950335 の範囲の値をとります。絶対値の最小値は 0 を除いた場合、0.0000000000000000000000000001 です。
日付型 (Date) 8 バイト 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日
オブジェクト型 (Object) 4 バイト オブジェクトを参照するデータ型
文字列型 (String) (可変長) 10 バイト + 文字列の長さ 0〜 2GB<
文字列型 (固定長) 文字列の長さ 1 〜 2GB
バリアント型 (Variant) (数値) 16 バイト 倍精度浮動小数点数型の範囲と同じ。
バリアント型 (Variant) (文字列) 22 バイト + 文字列の長さ 可変長の文字列型の範囲と同じ。
ユーザー定義型 要素に依存 それぞれの要素の範囲はそのデータ型の範囲と同じ。

変数を宣言するとき、Dimっていう構文を書きますよね。

Dim AAAA  As Integer

こう書くと、AAAAという名前は、整数型の値を入れる変数として使います。という意味になります。

Integerって、上の表にも載ってますね。32,767まで扱うことのできる数値型の変数、ということになります。だから、AAAAには、40,000っていう数値を代入することはできない、ってことになります。

その代わり、使うメモリは2バイトですみます。あんまり大きい数字を扱うことができない代わりに、メモリは少なくてすむんです。
あらかじめ、その変数にどういった値が入ってくるかわかっているならば、妥当なデータ型を指定しておくのがベストです。
わからなければ、

Dim AAAA

だけでも、とりあえず変数としては成り立ちます。この場合、バリアント型というデータ型になります。なんでもオッケーのオールマイティなデータ型です。その代わり、どういうデータが代入されてきてもオッケーなように、16バイト以上、メモリを使います。

処理を流してみないと、どういう値が入ってくるか見当がつかない場合はやむをえないですが、たとえば、年齢を代入する場合なんか、32,767以上になることって、考えられます???さらに、255超えることもないと思うし0を下回ることもないだろうから、Byte型で十分ですよね。でも、売上金額とか出荷台数とかだと、もしかしたら40兆円くらい売り上げるかもしれないし、7億個くらい売れるかもしれないから、勝手に判断できない気がします。

これも、バリアント型で変数を使ったからといって、どれだけ影響が出るか・・・というと、あんまり変わらないかもしれません。こういうことばかり目が行ってしまい、全体の処理の流れを見失ってしまっては何にもなりませんから気にしすぎてもいけませんが・・・でも、データ型というとこにも、ちょっとずつ気をつけていってください。


さて、で、クエリではなくて、フォーム上で、このNenGプロシージャを使う際のお話ですが・・・。
たとえば、ふたつテキストボックスを作って、片方に「入社年月日」を入力するとして、片方のコントロールソース欄に、しかるべくNenGを書き込んでおけばよいはず、なんですが・・・。

多分、最初、フォーム開くとエラーが出ると思います。

NenG()の、カッコの中に該当する「テキスト5」が、からっぽだから、このエラーが出るんですよ。

エラーは「終了」ボタンで終了させて、

テキスト5に何か入力してみれば、NenGはちゃんと答えを返してくるはずです。

NenGが計算をするためには、どうしても()の中に「入社年月日」に該当する値が必要なんです。

他のコーナーでも同じようなこと書かせてもらったりもしてますが、コンピュータの世界では、「からっぽ」というのもれっきとした「状態」なのです。したがって、「からっぽのときは処理しなくてもいいのに」という考え方は通りません。

上のクエリの場合でも、入社年月日の入力がないレコードだと、勤続年数もエラーになってしまうんじゃないでしょうか。
「値がないときは?」「からっぽのときは?」「ゼロのときは?」・・・VBAを使うということは、こういうことを常に常に考えていく、っていうことにつながっていきます。この発想が持てないと、プログラミングってけっこうキツイかもしれないですね。
プログラミングは「例外」との戦いです。がんばりましょう!