理由は、プログラミング初心者でも、コードを分かりやすくするためです。
しかし、実際にシステムを使う時には、いろんなエラーが発生する可能性があります。
そのため、エラー処理をちゃんと行なうことが欠かせません。
実はメールの送受信に関しては、BASP21がエラーメッセージを返してくれるので、問題ありません。
でもその他のプログラム部分に関しては、プログラマー自身が、エラー処理を記述する必要があります。
エラー処理が無いと、どんな不都合があるのでしょうか?
例えば、Excelのワークシートの値を参照するプログラムがあったとします。
でもユーザーがExcelのワークシートを、誤って削除してしまった場合、値を参照することができないので、エラーが発生します。
もしエラー処理をしていないと、Excelのシステムが、以下のようなエラーメッセージを表示します。
これはワークシートが無い時に起こるエラーですが、表示が分かり難いですよね。
このような実行時エラーが発生すると、そのエラーは致命的エラーになります。致命的エラーが発生すると、メッセージを表示した後に、プログラムの実行が停止します。
プログラマーなら、ここでデバッグすることもできますが、一般ユーザーの場合は、「終了」ボタンをクリックするしかありません。
*デバッグ(debug) プログラムの修正
終了すると、プログラムが強制的にストップされ、フォームが消えます。
一見、問題無いように思いますが、この流れには、重大な欠点があります。
プログラムの実行が途中で停止すると、エラーが発生する前の処理が反映されなかったり、重要なデータが消えてしまう可能性があるからです。
そこで、エラーを監視し、もしエラーが発生した場合には、プログラマーが意図した処理を行なってから、終了するようにします。
これが「エラー処理」の目的です。
それでは、エラー処理のプログラムを追加しましょう。
【1】Excelのファイル「メール送受信.xls」を開きます。
*マクロを有効にする
【2】VBEを起動します。
*「Altキー」+「F11キー」
【3】フォーム「frm送信」のコードを表示します。
【4】オブジェクトは「cmd送信」、イベントは「Click」を選択します。
【5】プログラムを以下のように修正してください。
・メール送信プログラム
Private Sub cmd送信_Click()
'エラーが発生したら処理を行なう
On Error GoTo Err_Shori
Dim bobj As Object
Dim svname As String
Dim id As String
Dim pass As String
Dim msg As Variant '送信チェック用
'SMTPサーバ名:ポート番号:タイムアウト秒
svname = "ここにSMTPサーバ名:587:60"
'ログインID
id = "ここにログインID"
'パスワード
pass = "ここにパスワード"
'オブジェクトを作成
Set bobj = CreateObject("basp21")
'宛先
mailto = "ここに宛先メルアド"
'送信者
mailfrom = "株式会社○○<" & id & ">" & vbTab & id & ":" & pass
'件名
subj = "送信テスト"
'本文 改行はvbCrLf
body = "おはようございます。" & vbCrLf & "今日は良い天気ですね。"
'メール送信
msg = bobj.SendMail(svname, mailto, mailfrom, subj, body, "")
' 送信チェック
If msg <> "" Then
MsgBox "送信できませんでした。" & vbCrLf & msg, vbOKOnly + vbCritical, "送信時エラー"
Else
MsgBox "送信に成功しました。", vbOKOnly + vbInformation, "完了"
End If
Err_Shori_Exit:
Exit Sub
'ここからエラー処理
Err_Shori:
MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"
Resume Err_Shori_Exit
'ここまで
End Sub
【6】VBEを保存します。
【7】これまで通り、メールが送信できるか、テストしてください。
動作確認の手順は、「Step9」と同じです。
多分大丈夫なはずです。メールが宛先(送信先)に届いていたら成功です。
【解説】
(1)エラーの監視を開始している部分です。On Error ステートメントといいます。
On Error GoTo Err_Shori
これ以降のプログラムで、エラーが発生した場合は、「Err_Shori」という行ラベルに制御が移ります。
このことを「エラー処理ルーチンを有効にする」ということもあります。
*「Err_Shori」は、任意の行ラベルです。
(2)エラー処理を行なっている部分です。
Err_Shori:
MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"
Resume Err_Shori_Exit
この部分は、「エラー処理ルーチン」と言うこともあります。
*「Err_Shori:」は行ラベルと言います。
ラベル名は自由に付けることができます。「ErrorHandler:」というような名前でもかまいません。日本語も使えます。
ただし「:」(コロン)は、必ず半角で入力します。
また、行ラベルは、インデント(字下げ)無しで、一番左側から書く決まりになっています。
もしエラーが発生した場合は、ラベル以降の処理が行なわれます。
ここでは、メッセージボックスにエラーの内容を表示して、「Err_Shori_Exit」という別の行ラベルから、処理を再開しています。
*Resume 再開すること
(3)再開後の処理を記述している部分です。
Err_Shori_Exit:
Exit Sub
ただプロシージャを抜け出すだけの簡単な処理です。
*Exit 出口
重要な点は、ここに書いた処理は、エラーが発生しても、発生しなくても必ず実行されることです。
もしこの部分の記述がなければ、エラーが発生しない場合でも、エラー処理が行なわれることになってしまいます。
プログラムが正常に動作している場合は、ここでプロシージャを抜け出して、終了です。
(4)メール送信時のエラーメッセージのタイトルを変更しました。
MsgBox "送信できませんでした。" & vbCrLf & msg, vbOKOnly + vbCritical, "送信時エラー"
エラーを表示するメッセージボックスが2つあるので、区別するためです。
以上で、エラー処理のプログラム追加は、完了です。
でも普通にシステムを使っている分には、エラーが出ないので、エラー処理プログラムの動作確認ができません。
そこで、次のステップでは、わざとエラーを出して、動作確認してみます。
【補足】
今回は、ExcelのVBAでエラー処理を記述しましたが、Accessの場合でも、書き方はまったく同じです。