まず、フォーム上のテキストボックスに行番号を入力すると、Excelのワークシートから、送信先の氏名とメールアドレスを取得し、自動的にラベルに表示するプログラムを作ります。
【1】Excelのファイル「メール送受信.xls」を開きます。
*マクロを有効にする
【2】VBEを起動します。
*「Altキー」+「F11キー」
【3】フォーム「frm送信」を選択し、「コードの表示」ボタンをクリックします。
【4】左側のコンボボックスから「General」、右側のコンボボックスから「Declarations」を選択します。
【5】以下のように、モジュールの一番先頭で、変数を宣言します。
Dim pos As Long
Dim tName As String
Dim eMail As String
ここは「宣言セクション」と言い、ここで宣言した変数は、各プロシージャから利用することができます。
またモジュールとは、宣言セクションと各プロシージャを含めた、プログラム全体を指します。
【6】コンボボックスから「UserForm」、「Initialize」を選択します。
*オブジェクトとイベントは、必ずコンボボックスから選択してください。
コピーして貼り付けたり、手入力すると、動作しない原因になります。
【7】フォームを初期化時のイベントプロシージャが表示されました。
【8】以下のようにコードを入力してください。
Private Sub UserForm_Initialize()
'メール送信ボタン使用不可
Me.cmd送信.Enabled = False
'初期値
Me.txtPos = 2
End Sub
【9】コンボボックスから「txtPos」、「Exit」を選択します。
【10】テキストボックスから出る時(フォーカス喪失時)のイベントプロシージャが表示されました。
以下のようにコードを入力してください。
プログラムが少し長いので、イベントプロシージャの内側は、コピーペーストしてもかまいません。ただしイベントプロシージャ自体は、必ずコンボボックスから選択します。
Private Sub txtPos_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'エラーが発生したら処理を行なう
On Error GoTo Err_Shori
'メール送信ボタン使用不可
Me.cmd送信.Enabled = False
'行番号が空白の時の処理
If Me.txtPos = "" Then
Me.lblMailto = "行番号を入力してください。"
Cancel = True
Exit Sub
End If
'行番号を取得
pos = CLng(Me.txtPos)
'行番号が2未満の時の処理
If pos < 2 Then
Me.lblMailto = "行番号は、2以上の数値を入力してください。"
Cancel = True
Exit Sub
End If
'ワークシートの値を取得
tName = Trim(Range("A" & pos).Value)
eMail = Trim(Range("B" & pos).Value)
'未入力の項目が無いかチェック
If tName = "" Or eMail = "" Then
Me.lblMailto = "この行は、データが未入力の項目があります。"
Cancel = True
Else
'送信先を表示
Me.lblMailto = "氏名:" & tName & " " & "メールアドレス:" & eMail
'メール送信ボタン使用可
Me.cmd送信.Enabled = True
End If
Err_Shori_Exit:
Exit Sub
'ここからエラー処理
Err_Shori:
MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"
Cancel = True
Resume Err_Shori_Exit
'ここまで
End Sub
これで準備完了です。動作確認は、次のステップで行ないます。
プログラムについては、コメントをたくさん書いているので、大体わかると思いますが、動作確認の後に、詳しく説明します。
【補足】
(1)ガイド機能について
VBEには、ガイド機能があり、プログラムを入力中に、半角で「.」(ドット)を入力すると、候補が自動的にリスト表示されます。
例えば、以下のプログラムは、両方とも同じ動作をします。
Me.cmd送信.Enabled = False
Me!cmd送信.Enabled = False
VBAでは、ユーザー定義のアイテムは「!」で区切り、プロパティなど既存のアイテムは「.」で区切ることになっています。
したがって、正確には後者のほうが正しい書き方かもしれませんが、「.」を使うと、ガイド機能が使えるので便利です。「!」では候補が表示されません。
(2)テキストボックスの値
VBAでは、同じ処理を行なう時に、いくつか書き方があります。
例えば、以下のプログラムは、全て同じ結果が得られます。
Me.txtPos
Me.txtPos.Value
Me.txtPos.Text
余裕があれば、試してみてください。