スポンサードリンク

Excelでメールの送信先を指定するプログラムの解説。

今回はメール送信する時に、Excelのワークシートから、送信先を指定するVBAプログラムについて、詳細に解説します。

動作確認した時の画面を思い出しながら、読んでください。

(1)変数を宣言している部分です。

Dim pos As Long '行番号
Dim tName As String '氏名
Dim eMail As String 'メールアドレス


宣言セクション(モジュールの一番先頭)で、変数を宣言します。

ここで宣言した変数は、フォーム「frm送信」のプログラム全体で有効になるので、各イベントプロシージャや Subプロシージャから利用することができます。

今回は、変数を複数のイベントプロシージャで利用するため、この場所に書いています。

実際に複数のイベントプロシージャで利用するのは、変数 tName と eMail です。

でもExcelのワークシート「送信」に、C列、D列・・・と増やして、メールの本文にデータを挿入したい場合は、変数 pos をこの場所で宣言しておいたほうが便利です。

posには行番号が入るので、後からデータを取得しやすくなるからです。


(2)フォーム「frm送信」初期化時のイベントプロシージャです。

Private Sub UserForm_Initialize()
    'メール送信ボタン使用不可
    Me.cmd送信.Enabled = False
    
    '初期値
    Me.txtPos = 2
End Sub


・実行画面
mail-126.gif

フォームを開いた直後は、「メール送信」ボタンを使用不可にし、行番号の初期値に「2」を設定しています。(1行目は項目名のため)


(3)テキストボックスから出る時のイベントプロシージャです。

Private Sub txtPos_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  省略
End Sub


このイベントプロシージャは、一見複雑そうです。

でもユーザーが正しいデータを入力するなら、本当に必要なのは、以下の数行だけです。


Private Sub txtPos_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    '行番号を取得
    pos = CLng(Me.txtPos)

    'ワークシートの値を取得
    tName = Trim(Range("A" & pos).Value)
    eMail = Trim(Range("B" & pos).Value)

    '送信先を表示
    Me.lblMailto = "氏名:" & tName & " " & "メールアドレス:" & eMail

    'メール送信ボタン使用可
    Me.cmd送信.Enabled = True
End Sub


残りのプログラムは、行番号のテキストボックスに、適切な値が入力されなかった時の処理になっています。

それではプログラムを詳しく見てみましょう。エラー処理の解説は最後にします。


(4)メール送信ボタンを使用不可にしている部分です。
Me.cmd送信.Enabled = False

フォームを初期化時にも、ボタンを使用不可にしていますが、必ず必要です。このイベントプロシージャは、行番号を変える度に実行されるからです。

例えば、正しい数値の後に、不正な数値が代入された場合、この1行が無いと、メール送信ボタンが使用可の状態のままなので、都合が悪いのです。


(5)行番号が空白の時の処理を行なっている部分です。
If Me.txtPos = "" Then
    Me.lblMailto = "行番号を入力してください。"
    Cancel = True
    Exit Sub
End If

・実行画面
mail-130.gif

行番号が空白の場合は、ラベルにメッセージを表示した後に、「Cancel = True」で、テキストボックスから出るのをキャンセルしています。

そして「Exit Sub」でこのイベントプロシージャから抜け出します。

つまり、行番号が適切でないと、テキストボックスから出ることが出来ないわけです。


(6)テキストボックスから行番号を取得し、変数に代入している部分です。
pos = CLng(Me.txtPos)

宣言セクションで宣言した変数posに、行番号を代入しています。

「Me」はフォーム「frm送信」自身を表しています。

したがって「Me.txtPos」は、フォーム「frm送信」上にあるテキストボックス「txtPos」という意味になり、ユーザーが入力した値が、変数に代入されます。

CLngは、値を長整数型に変換する関数です。変数posは、長整数型で宣言したので、代入する前に変換しています。

*「あ」や「a」のような適切ではない値を入力すると、実行時エラーが発生するため、エラー処理が必要になります。


(7)行番号が2未満の時の処理を行なっている部分です。
If pos < 2 Then
    Me.lblMailto = "行番号は、2以上の数値を入力してください。"
    Cancel = True
    Exit Sub
End If

・実行画面
mail-128.gif

ワークシートの1行目は項目名だし、1より小さい行は無いので、2未満の場合は、メッセージを表示します。後の処理は、空白の時と同様です。


(8)ワークシートの値を取得している部分です。
tName = Trim(Range("A" & pos).Value)
eMail = Trim(Range("B" & pos).Value)

現在フォームを開いているワークシートの場合は、以下のようにして、セルの値を取得できます。

A列1行目のセル
Range("A1").Value

A列は固定ですが、行番号は変化するので、変数posを使って以下のように書き換えます。
Range("A" & pos).Value

こうして得た値を、念のため Trim という関数で、前後の空白を除去してから、変数に代入しています。
tName = Trim(Range("A" & pos).Value)

B列の場合も同様です。

ここで大事なポイントは、宣言セクションで宣言した変数に代入しているので、他のイベントプロシージャや Subプロシージャから利用できるということです。

つまり、メール送信時に、この変数の値をそのまま使えます。


(9)未入力の項目が無いかチェックしている部分です。
If tName = "" Or eMail = "" Then
    Me.lblMailto = "この行は、データが未入力の項目があります。"
    Cancel = True
Else
    '送信先を表示
    Me.lblMailto = "氏名:" & tName & " " & "メールアドレス:" & eMail
    'メール送信ボタン使用可
    Me.cmd送信.Enabled = True
End If

・実行画面(未入力有り)
mail-129.gif

行番号で指定したセルの「氏名」か「メールアドレス」が入力されていない場合は、メッセージを表示します。

・実行画面(未入力無し)
mail-127.gif

入力されている場合は、ラベルに送信先を表示して、「メール送信ボタン」を使用可にします。

つまり、行番号が適切で、その行にちゃんとデータが入力されている場合のみ、メールが送信できる仕組みです。

ただし、メールアドレスが適切かどうかまでは、チェックしていません。もっと細かくチェックするなら、正規表現を使うなどの工夫が必要です。


(10)エラー処理を行なっている部分です。

Private Sub txtPos_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    'エラーが発生したら処理を行なう
    On Error GoTo Err_Shori

  省略

Err_Shori_Exit:
    Exit Sub

'ここからエラー処理
Err_Shori:
    MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"
    Cancel = True
    Resume Err_Shori_Exit
'ここまで

End Sub


・実行画面
mail-131.gif

エラー処理については、前に解説したので、大体わかると思います。

今回のポイントは、エラーが発生した時に、「Cancel = True」で、行番号のテキストボックスから出ることをキャンセルしている点です。

実際には、エラーのメッセージボックスが表示されると、一度フォーカスがそちらに移るので、テキストボックスをマウスでクリックしてから、入力を続ける必要があります。


【補足】
このようにプログラミングでは、本当に必要な処理より、データが適切かチェックしたり、エラー処理のためのプログラムのほうが、手間がかかる場合もあります。

もしプログラマーとユーザーが同一人物なら、どんな時にエラーが出るか大体予測できるので、エラー処理を最低限で済ませる手もあります。

逆にユーザーがパソコンに詳しく無い場合だと、プログラマーが予想しないデータを入力することもあるので、きちんと対策を練る必要があります。


次回は、いよいよメールを送信するプログラムの変更です。

スポンサードリンク






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