また文章は、メールに添付するのではなく、メール本文中に挿入することにします。
そのためには、テキストファイルを読み込む(データを取り出す)プログラムが必要なので、作成しましょう。
VBAでは、標準で用意された関数以外にも、ユーザーが独自に関数を作ることができます。それを「ユーザー定義関数」と言います。
今回は、「標準モジュール」にユーザー定義関数のプログラムを書きます。
標準モジュールで作成したユーザー定義関数は、VBAプログラムの中だけでなく、 Excelのワークシート上でも呼び出して使うことができるので、とても便利です。
この方法を覚えておけば、Excelの活用範囲が大きく広がります。
【1】Excelのファイル「ステップメール.xls」を開きます。
*マクロを有効にする
【2】VBEを起動します。
*「Altキー」+「F11キー」
【3】プロジェクト エクスプローラに「標準モジュール」が表示されているか確認します。
まだ標準モジュールが無い場合は、追加します。
【4】VBEのメニューから、「挿入 → 標準モジュール」を選択します。
【5】追加された標準モジュールを確認してみましょう。
①プロジェクト エクスプローラに標準モジュールが表示されました。
②標準モジュールには、「コードの表示」しかありません。
③標準モジュールのプログラムを入力する画面です。
④プロパティで「Module1」が選択されています。
⑤標準モジュールのプロパティは、「オブジェクト名」だけなのが特徴です。
オブジェクト名を変えることも出来ますが、今回はそのまま「Module1」にします。
【6】標準モジュールで、以下のようにプログラムを入力してください。
Public Function readTextFile(filePath As String) As String
Dim fileNo As Integer
Dim line As String
Dim str As String
fileNo = FreeFile
Open filePath For Input As #fileNo
Do Until EOF(fileNo)
Input #fileNo, line
str = str & line & vbCrLf
Loop
Close #fileNo
readTextFile = str
End Function
*Functionになっている点に注意
【7】ここまでの作業を「保存」してください。
今回作成した Functionプロシージャの動作確認は、次回のステップで説明します。
【解説】
(1)標準モジュールについて
標準モジュールに書いたプログラムは、そのExcelファイル内で、共通して利用することができます。
例えば、VBAのプログラム内、イミディエイトウィンドウ、Excelのワークシート上で呼び出して実行することが可能です。
ただし定義した同じファイル内に限られます。他のExcelファイルには影響しません。
(2)Functionプロシージャの基本
Public Function readTextFile(filePath As String) As String
省略
readTextFile = str
End Function
・Publicとは「公の」という意味を表すキーワードです。
・Publicで宣言したユーザー定義関数は、どこからでも呼び出して使えます。
・Functionプロシージャは、「Function」で始まり、「End Function」で終了します。
・関数名は、自由に付けることができます。働きがわかりやすい名前が良いでしょう。
例 readTextFile
・Functionプロシージャは、引数を受け取ることが出来ます。
例 readTextFile(filePath As String)
「,」(カンマ)で区切れば、複数の引数を受け取れます。
filePathは、関数内だけで有効な変数です。
関数を呼び出す時の引数と、受け取る関数の引数のデータ型は一致させる必要があります。
・Functionプロシージャは、戻り値を返すことができます。今回はString型です。
例 readTextFile(filePath As String) As String
・戻り値を返すには、関数名と同じ名前に代入します。
readTextFile = str
(3)変数を宣言している部分です。
Dim fileNo As Integer
Dim line As String
Dim str As String
・fileNo ファイル番号を格納する変数
・line テキストファイルの1行分のデータを格納する変数
・str 複数行のデータを結合するための変数
(4)FreeFile 関数を使って、空いているファイル番号を取得している部分です。
fileNo = FreeFile
ファイルは、このファイル番号を使って操作します。
(5)Openステートメントでファイルを開きます。
Open filePath For Input As #fileNo
filePathは関数の引数で、ファイル名がフルパスで代入されています。
例 C:\mailPG\Text\step1.txt
*「\」はWindowsでは円記号のことです。
*ここでのInputは、ファイル モードを示します。
(6)データを取り出している部分です。
Do Until EOF(fileNo)
Input #fileNo, line
str = str & line & vbCrLf
Loop
「Do Loop」という制御文を使って、ファイルの終端(EOF)になるまで(Until)、1行ずつデータを取り出します。
ここでのInputは、ステートメントです。ファイルからデータを読み込んで、変数に格納する働きがあります。
変数lineには、1行分のデータが入っています。
でもそのままだと、制御文で処理を繰り返す時に、次のデータで上書きされてしまいます。そこで変数strを使って、文字列を連結し、一時的に保存しています。
ここで大事なポイントは、「vbCrLf」で改行していることです。vbCrLfは、VBAであらかじめ定義されている定数で、改行を意味します。
正確には、キャリッジリターン(Cr)とラインフィード(Lf)の組み合わせです。
実は変数lineに代入された文字列には、改行が含まれていません。改行自体を1行の区切りとしているためです。
したがって vbCrLf がないと、文章が改行されずに、1行になってしまうので、注意してください。
(7)ファイルを閉じている部分です。
Close #fileNo
使い終わったファイルは閉じて、メモリーを解放します。
(8)Functionプロシージャが返す「戻り値」を指定している部分です。
readTextFile = str
変数strには、テキストファイルの内容が、改行を含めて代入されています。
以上がVBAプログラムで、テキストファイルを読み込む仕組みです。
もし難しく感じる場合は、プログラムをそのまま書くだけでも結構です。関数は使い方さえわかれば、利用することができます。
もちろん理解できたほうが、あなた自身でもユーザー定義関数を作れるのでよいのですが。
【補足】
今回のプログラムは、処理をわかりやすくするために、あえてエラー処理を省略しました。テキストファイルを読み込むプログラムに集中して欲しかったからです。
そのため、引数に指定するファイルが実在することが、正しく動作する条件です。
本来はちゃんとエラー処理を書いたほうが、安定したプログラムになります。