Microsoft Access Club >VBA物語 >このページ >次頁 < 前項  サイト内検索


変数の定義_その2:VBA物語11



今回も引き続き、プロシージャの欠点についてお話します。

プロシージャの欠点

このプロシージャには大きな欠点があります。見慣れている方なら直ぐにでも指摘できるんですが・・・。では、2つ程挙げてみましょう。

  1. 100000を入力します。
  2. 空白のまま、[OK]ボタンをクリックします。
Bの場合

この場合もエラーとなり、下記メッセージが表示されます。

Integer型は数値型です。全ての数値型に当てはまりますが、0はあっても空白はありません。長さ0の文字列("") も Null も ありません。

プログラミングを正しく記述するためには、ユーザーが行なうであろう行動を全て予測しなければいけません。「数値を入力して下さい」といくらメッセージを事前に 表示させても全く無意味だと考えて下さい。開発者がその対応策をプロシージャ内に記述しなければいけません。何と面倒なことでしょう!!!

動作確認
  1. 下図のInputBoxダイアログの[キャンセル]ボタンを空白のままクリックして下さい。

  1. InputBoxステートメントは、[キャンセル]ボタンをクリックされると長さ0の文字列("")を返 します。これはAccessの仕様の問題ですからどうしょうもありません。

エラーを回避するエラー処理

では、このエラーを回避するエラー処理をプロシージャに組み込みましょう。下記プロシージャをご覧下さい。

解説
  1. IFステートメントを用いて、条件分岐(If intput = "" Or intput = Null Then)を行っています。
  2. 空白で[OK]ボタン、「キャンセル」ボタンをクリックした時は、警告のメッセージボックスを表示します。
  3. そして、End ステートメントを用いてプロシージャを終了させます。

再度のエラー処理の記述

しかし、このプロシージャでもエラーが発生します。プロシージャの構文的には問題ないですが、変数定義に問題があります。

Dim intput As Integer

変数intputは Integer型です。入力値を受けるのに制約がありますから、

intput = InputBox("お好きな数字を入力して下さい", "Akira") 

の段階でエラーが発生する可能性があります。エラーが発生すると、「エラーの時はここへ:」にプロシージャの進行が移動しますから、いくら IFステートメント で条件分岐させても、分岐する前にエラー処理ルーチンへと移動してしまいます。

よって、この種のエラーを防ぐには、 以下の対応を行います。

  1. 変数のデータ定義を Variant型 にする。
  2. ErrorNumberを元にしたエラー処理を組み込む。
Variant型

変数のデータ型をバリアント型にすることで、上記のエラー処理は正常に作動します。

エラー番号による分岐処理

上記エラー処理ルーチンをエラー番号による分岐処理に修正します。

  1. まずは、エラー番号を取得します。以下のような記述を行ってください。なお、Err.Number は、エラー発生時にエラー番号を返します。

  1. 次に、プロシージャを実行します。
  2. 空白のまま[OK]ボタンをクリックするか、[キャンセル]ボタンをクリックします。
  3. 以下のメッセージが表示されます。

  1. 13はエラーナンバーです。
  2. 次に、プロシージャを下記のように書き換えます。

軽い気持で、変数を定義すると後で大変なことになりますから注意しましょう。

2001/10/19

ページの先頭へ 前ページへ戻る


変数の定義_その2:VBA物語11


-Microsoft Access Club-