スポンサードリンク

Excelでステップメールを送信する時に、送信間隔を設定するプログラムの解説。

今回は、Excelからステップメールを送信する時に、送信間隔を設定するVBAプログラムについて、詳しく解説します。

実は既に以下のステップで、ほとんど説明済みです。
・Step60で完成図
・Step61でプログラムのヒント
・Step62で解答例

そこで今回は、大事なポイントだけを、解説することにします。

また以前のステップと重なっている説明もあるのですが、ご了承ください。

繰り返し書いているということは、それだけ重要な部分です。

特に(9)は必ず読んでください。今回の中では一番重要です。


(1)送信間隔を代入するための変数(配列)を宣言している部分です。

・宣言セクション

Option Explicit

省略
Dim intervalArray() As Integer '送信間隔


変数の有効範囲に気をつけてください。

この変数は、複数のプロシージャで共通して使います。

したがって宣言セクションで、変数の宣言をしています。

また送信間隔は、ステップごとに異なります。

複数のデータを同じ変数名で扱いたいので、配列にしているのがポイントです。


(2)メールの送信間隔を取得する配列の要素数を変更している部分です。


ReDim intervalArray(1 To maxStep)


配列は1から始まり、最大ステップ数までになっているのがポイントです。

理由は、配列とステップの番号を揃えるためです。


(3)メールの送信間隔を、Excelのワークシートから取得している部分です。


intervalArray(i) = CInt(Trim(Sheets("文章").Range("D" & i + 1).Value))


送信間隔は、配列を使って、あらかじめ取得しておきます。

これは文章とタイトルの場合と同じです。

変数 i には、行番号が入っています。iが変化することで、異なる行の値を取得できます。

Trim関数を使っているのは、前後の空白を取り除くためです。


(4)メールの最終送信日を取得し、次の送信日を計算している部分です。


'最終送信日
lastDate = CDate(Trim(Range("D" & i).Value))
'次の送信日を計算
nextDate = lastDate + intervalArray(nextStep)


最終送信日は、Excelのワークシートからセルの値を取得します。

これはフォームが表示されている時に、対象となっているワークシートの場合です。

取得したセルの値を、 CDate() で日付型に変換しています。

日付の計算をするためには、データ型を揃える必要があるからです。

次の送信日は、最終送信日に送信間隔をプラスして計算します。

配列からデータを取り出すには、添え字を指定します。
intervalArray(nextStep)

ポイントは、添え字を変数で指定していることです。

変数の値が変われば、取得できるデータが変わります。

これにより、個々のメールでステップごとに送信間隔を変えることができます。


(5)次の送信日がまだの場合は、メールを作成しないようにしている部分です。


'送信日がまだの場合
If nextDate > Now Then
  Exit For
End If


Nowは現在の日時を返します。

次の送信日が現在の日時より大きい場合は、まだメールを送るタイミングではありません。

そこで「Exit For」でFor文を1回抜け出し、次の回へ進みます。

つまり次のメールへ進むということです。


(6)メール送信に成功したら、ワークシート「送信」のステップと最終送信日を更新している部分です。


Private Sub updateData()
省略
End Sub


ポイントは、最大ステップを超える場合、かつ次の送信日が未だの場合は、データを更新しないことです。

条件を満たしているメールだけ、データを更新します。

なぜなら、送信したメールのデータだけを更新しないと、矛盾するからです。

考え方はメールを作成する場合と同じです。(プログラムも同じ)


(7)ステップと最終送信日の更新を行なっている部分です。


'ステップアップ
Range("C" & i).Value = nextStep
'最終送信日を更新
Range("D" & i).Value = Format(Now, "yyyy/mm/dd")


Nowは時刻まで含んでいるので、Format関数で書式を整えています。


(8)上記のSubプロシージャを呼び出している部分です。


'送信に成功したら、ステップと最終送信日を更新する
updateData


またはCall命令を使って、以下のように書いても同じ結果になります。

Call updateData


メールの送信が成功した場合は、ステップと最終更新日を更新する必要があるので、updateData というサブプロシージャを呼び出しています。


(9)一番重要な部分

最大ステップを超える場合、かつ次の送信日が過ぎている場合だけ、メールを送信する部分です。


'開始〜終了行番号のメールを作成
For i = startPos To endPos

  '次のステップ
  nextStep = CLng(Trim(Range("C" & i).Value)) + 1

  '最大ステップ数以下の場合
  If nextStep <= maxStep Then

    '最終送信日
    lastDate = CDate(Trim(Range("D" & i).Value))
    '次の送信日を計算
    nextDate = lastDate + intervalArray(nextStep)

    '送信日がまだの場合
    If nextDate > Now Then
      Exit For
    End If

途中省略

  End If

Next i



↓以下のように書くとスッキリすると思うのですが、エラーが出ます。


'開始〜終了行番号のメールを作成
For i = startPos To endPos

  '次のステップ
  nextStep = CLng(Trim(Range("C" & i).Value)) + 1

  '最終送信日
  lastDate = CDate(Trim(Range("D" & i).Value))
  '次の送信日を計算
  nextDate = lastDate + intervalArray(nextStep)

  '最大ステップ数以下、かつ送信日がまだの場合
  If (nextStep <= maxStep) And (nextDate > Now) Then

途中省略

  End If

Next i


なぜなら、intervalArray(nextStep)の要素数がオーバーするからです。

フォームで最大ステップに10を入力していた場合、変数 nextStep は 11までカウントアップするので、配列 intervalArray の要素数を超えるためです。

だから解答例のような書き方をしているわけです。


スポンサードリンク






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