ステップメールを改良して、送信間隔を設定できるプログラムを作成します。
課題4の内容や動作確認の方法は、「Step60・課題4 送信間隔を設定する」をご覧ください。
課題の説明だけで、プログラミングできることが理想的です。
でもプログラミング初心者には、まだまだ難しい部分もあると思います。
そこでいくつかヒントを出しておきます。
以下のヒントを見ただけで、プログラミングができたら、とりあえず課題は合格です。
(1)新しい変数名
送信間隔 intervalArray() Integer型の配列
どこで変数を宣言したほうがよいのか、考えてください。
ヒントは変数の有効範囲です。
そのプロシージャ内だけで使う場合と、複数のプロシージャで共通して使う場合は、宣言する場所が異なります。
また配列の変数は、どのように宣言するのか、復習も兼ねています。
ステップメールのタイトルや文章を代入した配列を思い出してください。要領は同じです。
(2)メールの送信間隔を取得する配列の要素数を変更します。
ReDim intervalArray(1 To maxStep)
配列は1から始まり、最大ステップ数までになっているのがポイントです。
理由は、配列とステップの番号を揃えるためです。
このプログラムをどこに書けばいいのか、考えてみてください。
(3)メールの送信間隔は、配列を使って、Excelのワークシートから、あらかじめ取得しておきます。
intervalArray(i) = CInt(Trim(Sheets("文章").Range("D" & i + 1).Value))
このプログラムをどこに書けばいいのか、考えてみてください。
ヒントは、繰り返しの制御文の中です。
タイトルや文章の場合を思い出してください。要領は同じです。
(4)メールの最終送信日を取得し、次の送信日を計算します。
'最終送信日
lastDate = CDate(Trim(Range("D" & i).Value))
'次の送信日を計算
nextDate = lastDate + intervalArray(nextStep)
CDate()は、引数を日付型に変換するVBAの関数です。
日付の計算をするためには、データ型を揃える必要があるからです。
(5)次の送信日がまだの場合は、メールを作成しないようにします。
'送信日がまだの場合
If nextDate > Now Then
Exit For
End If
Nowは現在の日時を返します。
次の送信日が現在の日時より大きい場合は、まだメールを送るタイミングではありません。
そこで「Exit For」でFor文を1回抜け出し、次の回へ進みます。
つまり次のメールへ進むということです。
これをどこに組み込めばよいのか、考えてみてください。
(6)メール送信に成功したら、ワークシート「送信」のステップと最終送信日を更新します。
前回に「updateStep」というSubプロシージャを作りましたが、それを改良します。
ただし今回は、ステップと最終送信日を同時に更新するため、Subプロシージャ名が適切ではなくなります。
そのため「updateData」に変更しましょう。
updateStep → updateData
Private Sub updateData()
省略
End Sub
このSubプロシージャの中身を考えて、完成させてください。
ヒントは、最大ステップを超える場合、かつ送信日が未だの場合は、データを更新しないことです。
なぜなら、送信したメールのデータだけを更新しないと、矛盾するからです。
考え方はメールを作成する場合と同じです。(プログラムも同じ)
(7)ステップと最終送信日の更新は、次のように行ないます。
'ステップアップ
Range("C" & i).Value = nextStep
'最終送信日を更新
Range("D" & i).Value = Format(Now, "yyyy/mm/dd")
Nowは時刻まで含んでいるので、Format関数で書式を整えています。
このプログラムを updateData プロシージャの中に組み込んでください。
(8)上記のSubプロシージャを呼び出して使う時には、以下のようにします。
updateData
またはCall命令を使って、以下のように書いても同じ結果になります。
Call updateData
これをどこで呼び出したらよいのか、考えてください。
updateStep → updateData
ヒントは、メールの送信が上手くいった場合にだけ、呼び出すということです。
以上のヒントを参考にして、課題プログラムの作成に挑戦してみてください。
ヒントと言っても、ほとんど答えを書いているようなものですね。
どうですか?
送信間隔を指定できるステップメールは、上手くプログラミングできたでしょうか?