配列とは、同じ変数名でデータを扱いたい時に便利な仕組みです。
配列と繰り返しの制御文を組み合わせることで、プログラムをシンプルに書くことができます。
例えば変数が100個必要な場合をイメージしてみてください。
それぞれの変数名を100も考えるのは大変ですよね。それに100個の変数を初期化したり、値を代入する処理も大変です。
Dim a, b, c ・・・ As Integer
a = 0
b = 1
c = 2
・・・
Debug.Print a
Debug.Print b
Debug.Print c
・・・
そんな時は、配列を使えば変数名は1つで済むし、処理も簡単になります。
・最も簡単な例
Dim a(99) As Integer
Dim i As Integer
For i = 0 To 99
a(i) = i
Debug.Print a(i)
Next i
配列を宣言する時には、配列名の後に要素数を指定し、配列のデータ型を書きます。
例 Dim a(99) As Integer
これは a という変数を 0〜99 まで用意し、そのデータ型は整数型であるという宣言です。
配列は、通常「0」から始まるので、注意してください。
a(99) 0〜99の100個になる
a(100) 0〜100の101個になる
*99のような値を要素数という。
要素数には、リテラルの数値(5や10など)か、定数を指定できます。
ここで大事なことですが、要素数に変数を指定することはできないので、気をつけてください。
また、配列に格納された値を利用するには、配列名に添字を指定します。
例 a(0)、a(1)・・・a(99)
*0のような値を添字という。
以上までが、配列を使う処理の基本です。
それでは上記の基本を踏まえて、タイトルや文章を配列に格納する部分のVBAプログラムについて詳しく説明します。
・今回使うプログラム
'文章を取得して配列にセットする
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
通常、配列の添字は 0 から始まります。
でもメールのステップは「1」から始まります。また「1〜最大ステップ」の範囲で要素数が変化します。
したがって配列を宣言する時の要素数には、変数を使いたいところです。しかし要素数には変数が使えません。
そこで、まずは要素数を指定しないで宣言しておいて、
Dim textArray() As String
あらためて ReDim を使って「動的配列」として、配列の要素数を設定し直しています。
ReDim textArray(1 To maxStep)
これを「部分範囲指定配列」と言います。
この方法だと、配列の要素数に変数が利用できます。
また配列の添字と、メールのステップ番号が一致できるメリットもあります。
もし通常のように添え字を 0 から始める場合は、プログラムで加算などの調整をする必要があります。
できれば配列の番号とステップの番号を一致させていたほうがわかりやすいので、このような書き方にしました。
ワークシート「文章」からデータを取得する時に、「+1」しているのは、1行目が見出しだからです。これも番号を一致させるための工夫です。
例 Sheets("文章").Range("B" & i + 1).Value
他のワークシートを参照する場合は、シート名から始める必要があります。
メール本文に挿入する文章を取得し、配列に保存しておくためには、まずファイル名を取得します。
filePath = Trim(Sheets("文章").Range("B" & i + 1).Value)
そしてユーザー定義関数として作成した readTextFile を使い文章を取得します。
textArray(i) = readTextFile(filePath)
この関数は、引数としてファイル名をフルパスで指定すると、テキストファイルからデータを読み込み、文字列として返します。
返って来る値を「戻り値」といいます。
その戻り値を、文字列型の配列で受け取っているわけです。配列の添字(i)が変化することで、複数の文章を格納しておくことができます。
タイトルの場合は、もっと単純で、ワークシートから取得した値を、配列に直接格納しているだけです。
titleArray(i) = Trim(Sheets("文章").Range("C" & i + 1).Value)
実は今回作成した、タイトルや文章を配列に格納する部分のVBAプログラムは、Functionプロシージャ(関数プロシージャ)として、分離することもできます。
そのほうが、メインのプログラムがシンプルになります。
でもプログラムの流れを追いやすいように、あえてそのまま書くことにします。
余裕のある人は、Functionプロシージャの作成に挑戦してみてください。

