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


マクロで複数の条件分岐を行う一例:AccessTips064



前回では、Msgbox関数を用いてユーザーに選択させた項目に従い、次のマクロアクションを決める方法をご紹介しました。マクロでも条件分岐ができる格好のサンプルでした 。
しかし、これは単独のものでした。つまり、関数が返す値が二者択一の「OK」または「キャンセル」の2通りです。この範囲であればマクロの活躍分野に入りますが、三者択一以上の場合では困難を極めます。

InputBox関数

サンプルとしてInputBox関数を見てみましょう。 この関数は下記のようにユーザーに入力を求めるダイアログを表示します。そして、入力された値を返す働きがあります。

この入力値に基づいて条件分岐を行うマクロの記述は、下記のようになります。

解説

返り値が gt2000 であればA処理を、それ以外は B処理 を行うマクロを記述しています。このように見ると前回のMsgbox関数と基本は同じですよ。ちなみに返り値は全て文字列が返ります。123であっても"123"と記述して下さい。

長さ0の文字列 ("")

しかし、このマクロの記述には大きな誤りがあるんです。InputBox関数をAccessヘルプで調べると、下記のような記述が見えます。以下引用すると、

キャンセルボタンがクリックされるとInputBox関数は長さ0の文字列 ("") を返す

この記述を補足すると、[キャンセル]ボタンだけでなくダイアログの右上にある「×」をクリックしても同様です。

3通りの戻り値

Msgbox関数は[OK]と[キャンセル]の二者択一で、[キャンセル]がクリックされたときのアクションも設定していたので問題が発生しなかったのですが、InputBox関数は決めた返り値と長さ0の文字列とでたらめな文字列(ユーザーが入力した値)の3通りが発生します。

よって、複数条件を記述するために Or を用いて、下記のようにマクロの記述を変更してみます。

実は、これも誤りなんです。敢えて皆さん方に紹介しています。どこが間違いか分かりますか?

Or演算子

このマクロを実行すると、InputBoxが立ち上がらずに「メッセージボックス」アクションが直ちに実行されます。理由は Or にあります。日本語では、gt2000または文字列が0の場合 の意味ですが、条件式内ではいささか異なります。Orは演算子です。ヘルプには下記のように記述されています。

Orは、2つの式の論理和を求めます

具体的には下記の表になります。これを上記マクロにあてはめますと、A Or B の結果は常にになるため、条件式はその時点で終了してしま います。

項目A 項目B 結果
Null値

何故、常に真になるのか?それはgt2000も長さ0の文字列("")も正しい式であるからです。つまりマクロの条件式内で、開発者の意図に反して返り値としてではなく、それ自体の値が評価されてしまっているからです。

正しい記述方法

よって、今回の意図する条件式は、下記のようにして下さい。これが正解です。

ややっこしお話でしたが、如何でしたか?

 2002/01/23

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

 


マクロで複数の条件分岐を行う一例:AccessTips064


 

-Microsoft Access Club-