できるだけシステムの完成図や動作確認のイメージから、プログラミングできることが理想的です。
でも初心者には少し難しい部分もあるので、いくつかヒントを出しておきます。
これらのヒントを見ただけで、プログラミングができたら、とりあえず課題は合格です。
(1)新しい変数名
最大ステップ maxStep Long型
次のステップ nextStep Long型
それぞれどこで変数を宣言したほうがよいのか、考えてください。
ヒントは変数の有効範囲です。そのプロシージャ内だけで使う場合と、複数のプロシージャで共通して使う場合は、宣言する場所が異なります。
(2)フォームを初期化時のイベントプロシージャにプログラムを追加します。
最大ステップのテキストボックス(txtMaxStep)と変数(maxStep)に、初期値として「10」を代入します。
Private Sub UserForm_Initialize()
省略
End Sub
どのように書けばよいのか考えてください。このプロシージャ内にヒントがあります。
(3)最大ステップに入力した値をチェックするため、イベントプロシージャを新たに作成します。
Private Sub txtMaxStep_Exit(ByVal Cancel As MSForms.ReturnBoolean)
省略
End Sub
ヒントは、行番号のテキストボックスと同じ要領です。少し書き換えるだけで済みます。
またイベントプロシージャは、必ずコンボボックスから選択して作成してください。
(4)Excelのワークシートからセルの値を取得するには、以下のようにします。
Range("C" & i).Value
これはフォームが表示されている時に、対象となっているワークシートの場合です。
変数 i には、行番号が入っています。iが変化することで、異なる行の値を取得できます。
(5)文章とタイトルは、配列を使って、あらかじめ取得しておきます。
この部分がステップメールで一番重要なところです。少し難しいので、プログラムを掲載しておきます。
'文章を取得して配列にセットする
Dim textArray() As String '動的配列
ReDim textArray(1 To maxStep) '要素数を設定
Dim titleArray() As String
ReDim titleArray(1 To maxStep)
Dim filePath As String
For i = 1 To maxStep
'ワークシートの値を取得
filePath = Trim(Sheets("文章").Range("B" & i + 1).Value)
titleArray(i) = Trim(Sheets("文章").Range("C" & i + 1).Value)
'文章を配列にセット
textArray(i) = readTextFile(filePath)
Next i
このプログラムをどこに書けばいいのか、考えてみてください。
ヒントは、メール送信フォームを開いたからといって、必ずしも送信するとは限らないことです。
上記の配列を使ったプログラムについては、次回に詳しく解説します。とりあえず今回は、そのまま使ってください。
(6)次のステップは、現在のステップに1を加算するだけです。
nextStep = CLng(Trim(Range("C" & i).Value)) + 1
(7)次のステップが、最大ステップ数以下の場合だけ、処理を行なうようにします。
If nextStep <= maxStep Then
省略
End If
最大ステップを超える場合は、メールを作成しないようにするための処理です。
これをどこに組み込めばよいのか、考えてみてください。
(8)挿入タグ(検索文字列)は、次のようにしてください。
[氏名]、[タイトル]、[文章]
自動挿入するためには、Replace関数を使って置換します。
(9)通常、配列からデータを取り出すには、添え字を指定します。
例 titleArray(1)、titleArray(2)、titleArray(3)・・・
例 textArray(1)、textArray(2)、textArray(3)・・・
番号が変われば、取得できるデータが変わります。このように()「括弧」で囲まれた値を添え字といいます。
ヒントは、添え字を変数で指定することです。
(10)ステップメールでは、必ずしも該当するメールがあるとは限りません。
例えば、全ての人が既に最大ステップに達している場合も考えられます。
ところが今のままでは、送信するメールが無い時に、「送信時エラー」が表示されてしまいます。
したがって送信チェックを行なっているプログラムを変更する必要があります。
If rc <= 0 Then
MsgBox "送信できませんでした。" & vbCrLf & "エラー:" & rc, vbOKOnly + vbCritical, "送信時エラー"
Else
MsgBox rc & "件のメールを送信しました。", vbOKOnly + vbInformation, "完了"
End If
ヒントは、該当するメールが無い場合は、変数rc に「0」が代入されています。
(11)メール送信が成功したら、ワークシート「送信」のステップを、更新する必要があります。
そこでステップを更新するためのSubプロシージャを、新しく作成します。
Private Sub updateStep()
省略
End Sub
このSubプロシージャの中身を考えて、完成させてください。
ヒントは、最大ステップを超える場合は、ステップアップしないことです。
(12)上記のSubプロシージャを呼び出して使う時には、以下のようにします。
updateStep
またはCall命令を使って、以下のように書いても同じ結果になります。
Call updateStep
これをどこで呼び出したらよいのか、考えてください。
ヒントは、メールの送信が上手くいった場合にだけ、呼び出すということです。
このように、処理をSubプロシージャに分けることで、本体のプログラムがシンプルになります。
以上のヒントを参考にして、プログラムの作成に挑戦してみてください。
どうですか?ステップメールは上手くプログラミングできたでしょうか?
どうしてもわからない場合は、メール送信の基礎からもう一度復習して、再度チャレンジしてみるとよいでしょう。