inputboxはユーザーに入力を促す関数です。ユーザーが入力したデータを戻り値として処理を分けます。
しかし何も入力せず「OK」をクリックした場合や「キャンセル」時に「型が一致しません」エラーが表示されてしまう、といったトラブル・ご質問をいただきます。
ここでは「型が一致しません」エラーが表示される場合の回避法を記載します。
|
「型が一致しません」エラーが表示される原因
|
変数に格納されるデータにはそれぞれ「型」というものがあります。簡単に言うと数字はInteger型、文字列はString型、日付はDate型…というような種類があります。型と入力された値が一致しないとエラーが表示されることがあります。
例えばInputBoxを表示するスクリプトで「20以上ならA、20未満ならB」という条件を記述したのに、ユーザーが日付を入力してしまったとします。このような場合に、スクリプトで記述されている型とユーザーが入力したデータの型が違う為エラーが表示されてしまいます。
このエラーの回避法はいくつかありますので状況に応じて使い分けましょう。
|
回避法(1) 「キャンセル」や「未入力でOK」をクリックした場合の条件を先に記述する
|
型の不一致エラーはユーザーが入力した値の型と条件式の型が合わない箇所(行)で起こります。その為入力された型に合う条件を先に記述すればそれ以降は進まない為、エラーを回避することができます。条件は以下のように記述します。
ユーザーの操作 |
条件式 |
「キャンセル」をクリック |
IsEmpty(変数) |
何も入力せず「OK」をクリック |
変数 = "" |
例:年齢が20以上なら「利用可」、20未満なら「利用不可」、キャンセルなら「キャンセルします」、未入力なら「未入力です」と表示
x = InputBox
("年齢を入力してください")
If IsEmpty(x) then
MsgBox "キャンセルします"
ElseIf x = "" then
MsgBox "未入力です"
Elseif x < 20 then
MsgBox "利用不可"
ElseIf x >= 20 then
MsgBox "利用可"
End if |
★年齢入力を促すInputBox表示
★キャンセルがクリックされたら
★「キャンセルします」と表示
★何も入力せず「OK」をクリックされたら
(=空白が入力されたら)
★「未入力です」と表示
★入力された値が20未満なら
★「利用不可」と表示
★入力された値が20以上なら
★「利用可」と表示 |
|
重要:キャンセル時の条件式(IsEmpty(変数))は、未入力でOK時の条件式(変数
= "")より先に記述します。未入力でOK時の条件式を先に記述してしまうとキャンセルした場合もこちらの条件に合致したものとして処理されてしまいます。
|
回避法(2) On Error Resume
Nextを記述しエラーをスキップして続行する
|
回避法(1)では、未入力で「OK」をクリックした場合や「キャンセル」時の条件/処理を記述して「型が一致しません」エラーを回避しました。しかし「型」が一致しないデータを入力された場合には回避できません。例えば「日本語文字列」や「日付」を入力した場合、
20以上(未満)なら…という条件の型とは合わない為「型が一致しません」エラーが発生します。
このような場合にOn
Error Resume Nextステートメントを記述すると、エラーの原因になったステートメントをスキップし次のステートメントを実行します。(エラー発生の原因になった箇所の次の行を実行)
その為、エラー原因となるステートメントの次に”エラー時に実行されてもいい処理”を記述しておきます。
例:日付や日本語を入力された場合にエラー原因ステートメントをスキップするよう記述する(例文は(1)と同じ)
On
Error Resume Next
x = InputBox ("年齢を入力してください")
If IsEmpty(x) then
MsgBox "キャンセルします"
ElseIf x = "" then
MsgBox "未入力です"
Elseif x < 20 then
←本来ここでエラー発生
MsgBox "利用不可"
←スキップしこの行を実行
ElseIf x >= 20 then
MsgBox "利用可"
End if |
★これ以降のエラーは無視し次の行へ
★年齢入力を促すInputBox表示
★キャンセルがクリックされたら
★「キャンセルします」と表示
★何も入力せず「OK」をクリックされたら
★「未入力です」と表示
★入力された値が20未満なら
(日付等では比較できない)
★「利用不可」と表示
★入力された値が20以上なら
★「利用可」と表示 |
|
★ポイントはエラー発生時に実行されてもおかしくない処理を記述するということです。例えば「x
>=20 then」(20以上なら)という条件が「x
< 20 then」(20未満なら)より先に記述されてあった場合、次に実行するステートメントは「利用可」となってしまいます。エラーが発生する場合(=ユーザーが型の合わないデータ(日付や文字列)を入力)に「
利用可」というメッセージではスクリプトの内容的におかしくなってしまいます。エラー発生の原因となるステートメントがいくつかある場合には、次にくる処理がエラー時に実行されてもおかしくないステートメントを先に記述しましょう。
|