【Excel VBA】If Elseとは違う条件式(Select Case)について
エンジニアのIMMRです。Excel VBAの条件式には、以前に説明したExcel VBA 条件式(If Else)とこれから説明するSelect Caseの二つあります。1.従来のIf Else条件式If Elseは条件に合った時は処理Aを、条件に合わなかったら処理Bを実行します。では、下記のようなデータがあり、複数の条件があるとします。If Elseを使用して作成すると2種類の方法が浮かぶと思
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
皆さんこんにちは、エンジニアのIMMRです。
プログラムを作成して、実行すると下記のようにエラーが発生してしまうことがあります。
まあ、エラー内容はさまざまですが・・・
図1 エラー
これは、エラーでプログラムが止まっています。
このようにエラーで止まってしまうのはあまりよろしくないのでのエラー対策が必要です。
以前に、対策とした記事を作成しています。
1つは、エラーが発生したら、別の処理を行う。
1つはエラーが発生しても無視をする。
といった感じです。
どちらもエラーが発生したら・・・
ですがどんなエラーが発生したのかがわかりません。
今回は、エラーが発生した時にエラーの番号や内容を表示させる方法を説明します。
エラーの内容を確認するには「Err」オブジェクトを使います。
プログラム実行時に自動で作成されるので、事前に宣言する必要もありません。
エラー番号の場合は、
Err.Number
エラー内容の場合は、
Err.Description
と記載するだけです。
上記で示した通り、「Err.Number」「Err.Description」を記載するだけです。
ですが、正常動作(エラーもしてない)ですと下記のように表示されます。
※コーディングミスにはならないです。
図2 エラー(なし)
0といわれても何なのかわからないですよね。
そのため、このような表示はエラーが起きただけするようにします。
方法は、「エラーが発生した時だけ、別の処理を行う方法」を参照して下さい。※上記にリンクがあります。
そして、ただメッセージに「Err.Number」「Err.Description」の記載するだけでは、
図3 エラー(直接記載)
になってしまいます。
実際は、エラーナンバーが「11」で、内容が「0で除算しました」なのにわかりにくいですよね。
「110で除算しました。」→エラー と勘違いをしてしまいます。 何がいけないの? と思ってしまいます。
そのため、メッセージ標記を下記になるように工夫が必要です。
図4 エラー(工夫)
これですとエラーナンバーや内容が見やすくなると思います。
先ほどのように見間違いはなくなります。
前章でも説明しましたが、「Err.Number」「Err.Description」を記載するだけです。
そこで今回はわざとエラーが起きるプログラムを作成して、本当に表示されるかを確認したいと思います。
① サンプルプログラム(0 で除算)
Sub test1()
On Error GoTo Err_m
Dim a As Long, b As Long
a = 1
b = 0
MsgBox a / b
Exit Sub
Err_m:
MsgBox "エラーナンバー:" & Err.Number & vbCrLf & _
"エラー内容" & Err.Description
End Sub
これは0で除算をするプログラムです。
変数aに1 bに0をセットして a/bを行います。(1/0)になるので0で除算になります。
② サンプルプログラム(オーバーフロー)
Sub test2()
On Error GoTo Err_m
Dim a As Long, b As Long
a = 10000000000
b = 2
MsgBox a / b
Exit Sub
Err_m:
MsgBox "エラーナンバー:" & Err.Number & vbCrLf & _
"エラー内容 :" & Err.Description
End Sub
これはオーバーフローをするプログラムです。
longで宣言した変数aに格納できるのは、1000000000(10桁)までです。
プログラムでは、11桁を格納しようとしているので、オーバーフローになります。
③ サンプルプログラム(型の不一致)
Sub test3()
On Error GoTo Err_m
Dim a As Long, b As Long
a = 1
b = "あああ"
MsgBox a / b
Exit Sub
Err_m:
MsgBox "エラーナンバー:" & Err.Number & vbCrLf & _
"エラー内容 :" & Err.Description
End Sub
これは型の不一致となるプログラムです。
longで宣言した変数bは数値タイプの型です。そのため、文字である”あああ”を
格納すると型の不一致となりエラーになります。
④ サンプルプログラム(データなし)
Sub test4()
On Error GoTo Err_m
Workbooks.Open "C:\VBA2.xlsx"
Exit Sub
Err_m:
MsgBox "エラーナンバー:" & Err.Number & vbCrLf & _
"エラー内容 :" & Err.Description
End Sub
これはデータなしとなるプログラムです。
ブック"C:\VBA2.xlsx"をオープンするプログラムなのですが、
実際、"C:\VBA2.xlsx"はないのでエラーになります。
上記のサンプルプログラムを実行した結果です。
どれも想定のエラーで、番号と名前が表示出来ています。
図5 エラー(0 で除算)
0で除算したプログラムです。
図6 エラー(オーバーフロー)
オーバーフローをするプログラムです。
図7 エラー(型の不一致)
型の不一致となるプログラムです。
図8 エラー(データなし)
データなしとなるプログラムです。
どれも想定内のエラー内容が正しく表示されています。
エラーした時、エラー番号と内容を表示することが出来ました。
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート