スポンサードリンク

VBAでエラー処理のプログラムを加える。

これまでのメール送信プログラムでは、エラー処理を記述していませんでした。

理由は、プログラミング初心者でも、コードを分かりやすくするためです。

しかし、実際にシステムを使う時には、いろんなエラーが発生する可能性があります。

そのため、エラー処理をちゃんと行なうことが欠かせません。

実はメールの送受信に関しては、BASP21がエラーメッセージを返してくれるので、問題ありません。

でもその他のプログラム部分に関しては、プログラマー自身が、エラー処理を記述する必要があります。

エラー処理が無いと、どんな不都合があるのでしょうか?

例えば、Excelのワークシートの値を参照するプログラムがあったとします。

でもユーザーがExcelのワークシートを、誤って削除してしまった場合、値を参照することができないので、エラーが発生します。

もしエラー処理をしていないと、Excelのシステムが、以下のようなエラーメッセージを表示します。

mail-79.gif

これはワークシートが無い時に起こるエラーですが、表示が分かり難いですよね。

このような実行時エラーが発生すると、そのエラーは致命的エラーになります。致命的エラーが発生すると、メッセージを表示した後に、プログラムの実行が停止します。

プログラマーなら、ここでデバッグすることもできますが、一般ユーザーの場合は、「終了」ボタンをクリックするしかありません。

*デバッグ(debug) プログラムの修正

終了すると、プログラムが強制的にストップされ、フォームが消えます。

mail-80.gif

一見、問題無いように思いますが、この流れには、重大な欠点があります。

プログラムの実行が途中で停止すると、エラーが発生する前の処理が反映されなかったり、重要なデータが消えてしまう可能性があるからです。

そこで、エラーを監視し、もしエラーが発生した場合には、プログラマーが意図した処理を行なってから、終了するようにします。

これが「エラー処理」の目的です。

それでは、エラー処理のプログラムを追加しましょう。

【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の場合でも、書き方はまったく同じです。

スポンサードリンク






メール送信・受信プログラミング初心者入門 TOPへ