<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/"
>

<channel rdf:about="http://mailpg.pgtop.net/">
<title>メール送信・受信プログラミング初心者入門</title>
<link>http://mailpg.pgtop.net/</link>
<description>Microsoft AccessやExcelのVBAを利用して、メールの送信や受信を行なえるようにするプログラムを作成します。データベースとメールを連携することで、利用範囲が広がります。</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.seesaa.jp/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/157169632.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/157074477.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/156484352.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/156394691.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/156204363.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/155927857.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/139195382.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/139003446.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/131042025.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/130969660.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/130895238.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/130714905.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/130623078.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/130226196.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/130150664.html" />
</rdf:Seq>
</items>
</channel>

<item rdf:about="http://mailpg.pgtop.net/article/157169632.html">
<link>http://mailpg.pgtop.net/article/157169632.html</link>
<title>Excelでメール受信するプログラムのメリットについて。</title>
<description>Excelでメール受信するVBAプログラムには、どんなメリットがあるのか、どんな使い方ができるのか、ほんの一部ですが紹介します。あらかじめメリットを理解していたほうが、プログラミングの学習も、やる気が出ると思います。(1)スパムメールをほぼ100％防止できる。プログラムを使えば、送信者や件名、本文を判断して、あなた「独自のルール」で、メールを受信できます。例えば、受信したい送信者のメールアドレスを、あらかじめ登録しておきます。メールを受信する時に、登録しておいたメールアドレス...</description>
<dc:subject>Step1・Excelでメール受信するメリット</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-07-23T07:28:54+09:00</dc:date>
<content:encoded><![CDATA[
<strong>Excel</strong>で<strong>メール受信</strong>するVBAプログラムには、どんなメリットがあるのか、どんな使い方ができるのか、ほんの一部ですが紹介します。<br /><br />あらかじめメリットを理解していたほうが、プログラミングの学習も、やる気が出ると思います。<br /><br /><br />(1)スパムメールをほぼ100％防止できる。<br />プログラムを使えば、送信者や件名、本文を判断して、あなた「独自のルール」で、メールを受信できます。<br /><br />例えば、受信したい送信者のメールアドレスを、あらかじめ登録しておきます。<br /><br />メールを受信する時に、登録しておいたメールアドレスを参照し、一致すれば受信します。<br /><br />すると、それ以外のメール(スパムメール)は、シャットアウトできます。<br /><br />複数の条件を組み合わせれば、迷惑メールをほぼ完全に防げます。<br /><br />メールサーバーには、従来どおりスパムメールが届くかも知れません。<br /><br />でも受信の段階で、自動的に除けるわけです。<br /><br /><br />(2)ネットショップの受注データをデータベース化できる。<br />自社でネットショップを運営している場合は、メールで受注しているケースが多いと思います。<br /><br />そして後は、手作業で処理しているのではないでしょうか？<br /><br />大手のショッピングモールなどでは、受注データをネット上で利用できたり、CSVとしてダウンロードできることもあります。<br /><br />また、自社でシステムを構築する場合でも、MySQLなどのWeb上で動作するデータベースを使うと、同じようなことができます。<br /><br />しかし自社で開発するとなると、それなりに高度な知識が必要になります。<br /><br />ソフトウェア開発会社に外注すると高いです。<br /><br />そのため小さな会社では、受注メールを見て、宛先を書いたり(出力)、伝票を作成したり、返信メールを送るといった業務が、手作業で行なわれています。<br /><br />それに受注データは、データベース化されていないことが多いです。<br /><br />実はメール受信の部分をプログラミングすれば、これらの作業は、ほぼ自動的に行なえます。<br /><br />MySQLなども不要なため、比較的簡単にシステムを構築できます。<br /><br />今運用しているネットショップはそのままで、メール受信の部分だけプログラミングできることも、大きなメリットです。<br /><br /><br />(3)アンケートの集計ができる。<br />Web上でアンケートフォームに入力してもらい、メールで送ることは、CGIやPHPを使えば簡単にできます。<br /><br />あとはメールを受信するプログラムを使い、受信したデータを、ExcelやAccessなどで、自動的に集計することができます。<br /><br /><br />(4)氏名やメールアドレスの登録ができる。(メルマガなどに利用)<br />これまでに紹介したメール送信の機能を使えば、オリジナルのメールマガジンを発行したり、ステップメールを送ることができます。<br /><br />でも氏名やメールアドレスの登録が面倒ですよね？<br /><br />プログラムでメール受信ができるようになれば、メルマガ登録フォームに入力されたデータを、メールで受け取り、ExcelやAccessなどで管理できるようになります。<br /><br />つまりオリジナルのメルマガ登録が、自動的にできるわけです。<br /><br /><br />(5)Accessに移植しやすい。<br />メール送信に関しては、Excelを使うことに大きなメリットがありました。<br /><br />普段使い慣れているExcelは、送信先のデータを加工しやすいからです。<br /><br />しかしメール受信に関しては、データベースソフトであるAccessのほうが、圧倒的に便利です。<br /><br />Accessを使うと、検索、抽出、集計が、クエリで簡単にできます。<br /><br />そのため当講座でも、Excelでのメール受信は、基本的な部分だけにします。<br /><br />そしてすぐにAccess版に続くような形式にしたいと思います。<br /><br />でもExcelでの学習は、無駄にはなりません。<br /><br />AccessとExcelでは、VBAを使うので、プログラムがほとんど同じだからです。<br /><br />扱う部品が違うので、多少は違うのですが、Excel版を理解していると、Access版に移植しやすいのは確かです。<br /><br />Excel版のプログラムが分からないと、Access版も分かりません。<br /><br /><br />【補足】<br />今回紹介した様なことを実現するのは、一見難しそうに感じるかも知れません。<br /><br />実はどれも基本は同じです。<br /><br /><div class="pg"><br />メールサーバーからメールを受信する。<br />↓<br />送信者や件名、本文の内容を解析する。<br />↓<br />どう処理するか決める。<br /></div><br /><br />たったこれだけです。<br /><br />したがって、個々のプログラムを詳しく解説するというよりは、全体として共通する部分のプログラムを紹介します。<br /><br />あとは目的に合わせて、カスタマイズ出来るようになります。<br /><br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/157074477.html">
<link>http://mailpg.pgtop.net/article/157074477.html</link>
<title>Excelでメール受信するプログラムについて。</title>
<description>Excelでメール受信が出来るようになると、活用範囲がもっともっと大きく広がります。当無料講座では、これまでにExcelからメール送信するプログラムを中心に紹介してきました。でも私の個人的な意見としては、「メール受信」こそが、ぜひ活用していただきたい機能なのです。もちろんメールは、受信と送信の両輪です。どちらか一つでは、十分に機能を果たせません。これまでに紹介したメール送信だけでも、かなり便利になったと思います。感謝のメールもいただいています。それにメール受信の機能をプラスす...</description>
<dc:subject>■Excelメール受信プログラム</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-07-22T07:02:07+09:00</dc:date>
<content:encoded><![CDATA[
<strong>Excel</strong>で<strong>メール受信</strong>が出来るようになると、活用範囲がもっともっと大きく広がります。<br /><br />当無料講座では、これまでにExcelからメール送信するプログラムを中心に紹介してきました。<br /><br />でも私の個人的な意見としては、「メール受信」こそが、ぜひ活用していただきたい機能なのです。<br /><br />もちろんメールは、受信と送信の両輪です。<br /><br />どちらか一つでは、十分に機能を果たせません。<br /><br />これまでに紹介したメール送信だけでも、かなり便利になったと思います。<br /><br />感謝のメールもいただいています。<br /><br />それにメール受信の機能をプラスすれば、鬼に金棒です。<br /><br />ビジネスやプライベートで、メールをもっと活用できるようになります。<br /><br />メールを受信するプログラムのメリットについては、次回に詳しく説明します。<br /><br />ほんの少しだけ例を上げると、<br /><br />・スパムメールをほぼ100％防止できる。<br />・ネットショップの受注データをデータベース化できる。<br />・アンケートの集計ができる。<br />・氏名やメールアドレスの登録ができる。(メルマガなどに利用)<br /><br />などがあります。<br /><br />メール受信は、アイデア次第で、もっと可能性が広がっています。<br /><br />私はこれまでに、上記のようなメール受信のメリットを活かしたシステム開発を、何件か手がけたことがあります。<br /><br />詳しくは話せませんが、官公庁関連や旅行業界などです。<br /><br />ユーザー様には「凄く便利になった」、「時間が短縮された」と喜んでいただきました。<br /><br />それまで手作業で行なっていた仕事が、全て自動化できたのですから、当然です。<br /><br />そこで当講座では、あなたも自分自身でメール受信のプログラムを開発し、自由自在にカスタマイズできるように、お手伝いしたいと思います。<br /><br />お楽しみに！<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/156484352.html">
<link>http://mailpg.pgtop.net/article/156484352.html</link>
<title>Excelからメール送信するVBAプログラムのまとめ。</title>
<description>今回は、Excelからメール送信するVBAプログラミングのまとめです。まず、Excelからメール送信できると、何が便利なのか考えてみましょう。表計算ソフトのExcelは、もっとも身近なソフトウェアの一つです。ほとんどの Windows パソコンにインストールされています。そのためプログラムの開発環境が、既に準備されている状態です。Excelがインストール済みなら、新たな費用は不要です。またExcelは、簡単に操作できること、多くの人が使い慣れていることもメリットです。今ではほ...</description>
<dc:subject>Step64・Excelメール送信プログラムのまとめ</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-07-16T07:33:46+09:00</dc:date>
<content:encoded><![CDATA[
今回は、<strong>Excel</strong>から<strong>メール送信</strong>するVBAプログラミングのまとめです。<br /><br />まず、Excelからメール送信できると、何が便利なのか考えてみましょう。<br /><br />表計算ソフトのExcelは、もっとも身近なソフトウェアの一つです。<br /><br />ほとんどの Windows パソコンにインストールされています。<br /><br />そのためプログラムの開発環境が、既に準備されている状態です。<br /><br />Excelがインストール済みなら、新たな費用は不要です。<br /><br />またExcelは、簡単に操作できること、多くの人が使い慣れていることもメリットです。<br /><br />今ではほとんどの人が、Excelにデータを入力したり、編集することができます。<br /><br />日頃から使い慣れているExcelで、メール送信ができれば、活用範囲が大きく広がります。<br /><br />そこでこの無料講座では、Excelからメール送信するVBAプログラムの作り方を紹介しました。<br /><br />この無料講座のスキルを習得すると、Excelで以下のようなことが出来るようになります。<br /><br />■メール送信について<br />・通常のメール送信(個別に)<br />・一括送信<br />・送信範囲を指定して送信<br />・タイトルや本文にデータを挿入できる<br />・添付ファイルを指定して送信<br /><br />挿入するデータや添付ファイルは、送信相手ごとに変えることができます。<br /><br />それに添付ファイルを複数指定することも可能です。<br /><br /><br />■ステップメールについて<br />・タイトル、文章をステップごとに指定できる<br />・送信間隔をステップごとに指定できる<br /><br />ステップメールには、通常のメール送信の機能も含めることができます。<br /><br /><br />以上のようなことが出来るようになれば、メール送信に関しては、一通りの機能を実現できたと思います。<br /><br />あなたが実際にプログラミングすれば、カスタマイズする力も身に付いているハズです。<br /><br />これ以上複雑なメール送信なら、Excelではなく、Accessなどのデータベースを使ったほうが便利です。<br /><br />例えば、Accessのクエリを使うと、<br /><br />高度な条件で抽出した名簿に対して、メール送信するようなことが可能になります。<br /><br />また売上管理システムと、メール送信システムを連動させれば、<br /><br />「最近、ある一定金額以上を購入したことのある、お得意様だけ」に特別なメールを送信することも可能です。<br /><br />もちろんExcelでも、「並べ替え」である程度のことはできます。<br /><br />この無料講座で紹介したVBAプログラムでは、セルの番地を見ているので、並べ替えても大丈夫です。<br /><br />もちろん並べ替える時は、行単位で並べ替えます。<br /><br />少なくとも氏名とメールアドレスはセットです。<br /><br />コピー&amp;ペーストしても並べ替えることができます。<br /><br />余裕のある人は試してみてください。<br /><br />しかし並べ替えや抽出が複雑になると、Accessのほうが便利なのは確かです。<br /><br />そこでメール送信の続きとして、Access版も用意する予定です。お楽しみに！<br /><br />・<a href="http://mailpg2.pgtop.net/" target="_blank">メール送信・受信プログラミング初心者入門(Access版)</a><br /><br />今はまだ準備中ですが、Excelでの「メール受信」が完了した頃に、本格的に始める予定です。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/156394691.html">
<link>http://mailpg.pgtop.net/article/156394691.html</link>
<title>Excelでステップメールを送信する時に、送信間隔を設定するプログラムの解説。</title>
<description>今回は、Excelからステップメールを送信する時に、送信間隔を設定するVBAプログラムについて、詳しく解説します。実は既に以下のステップで、ほとんど説明済みです。・Step60で完成図・Step61でプログラムのヒント・Step62で解答例そこで今回は、大事なポイントだけを、解説することにします。また以前のステップと重なっている説明もあるのですが、ご了承ください。繰り返し書いているということは、それだけ重要な部分です。特に(9)は必ず読んでください。今回の中では一番重要です。...</description>
<dc:subject>Step63・送信間隔を設定するプログラムの解説</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-07-15T08:14:23+09:00</dc:date>
<content:encoded><![CDATA[
今回は、<strong>Excel</strong>から<strong>ステップメール</strong>を送信する時に、送信間隔を設定するVBAプログラムについて、詳しく解説します。<br /><br />実は既に以下のステップで、ほとんど説明済みです。<br />・Step60で完成図<br />・Step61でプログラムのヒント<br />・Step62で解答例<br /><br />そこで今回は、大事なポイントだけを、解説することにします。<br /><br />また以前のステップと重なっている説明もあるのですが、ご了承ください。<br /><br />繰り返し書いているということは、それだけ重要な部分です。<br /><br />特に(9)は必ず読んでください。今回の中では一番重要です。<br /><br /><br />(1)送信間隔を代入するための変数(配列)を宣言している部分です。<br /><br />・宣言セクション<br /><div class="pg"><br />Option Explicit<br /><br />省略<br />Dim intervalArray() As Integer '送信間隔<br /></div><br /><br />変数の有効範囲に気をつけてください。<br /><br />この変数は、複数のプロシージャで共通して使います。<br /><br />したがって宣言セクションで、変数の宣言をしています。<br /><br />また送信間隔は、ステップごとに異なります。<br /><br />複数のデータを同じ変数名で扱いたいので、配列にしているのがポイントです。<br /><br /><br />(2)メールの送信間隔を取得する配列の要素数を変更している部分です。<br /><br /><div class="pg"><br />ReDim intervalArray(1 To maxStep)<br /></div><br /><br />配列は1から始まり、最大ステップ数までになっているのがポイントです。<br /><br />理由は、配列とステップの番号を揃えるためです。<br /><br /><br />(3)メールの送信間隔を、Excelのワークシートから取得している部分です。<br /><br /><div class="pg"><br />intervalArray(i) = CInt(Trim(Sheets("文章").Range("D" &amp; i + 1).Value))<br /></div><br /><br />送信間隔は、配列を使って、あらかじめ取得しておきます。<br /><br />これは文章とタイトルの場合と同じです。<br /><br />変数 i には、行番号が入っています。iが変化することで、異なる行の値を取得できます。<br /><br />Trim関数を使っているのは、前後の空白を取り除くためです。<br /><br /><br />(4)メールの最終送信日を取得し、次の送信日を計算している部分です。<br /><br /><div class="pg"><br />'最終送信日<br />lastDate = CDate(Trim(Range("D" &amp; i).Value))<br />'次の送信日を計算<br />nextDate = lastDate + intervalArray(nextStep)<br /></div><br /><br />最終送信日は、Excelのワークシートからセルの値を取得します。<br /><br />これはフォームが表示されている時に、対象となっているワークシートの場合です。<br /><br />取得したセルの値を、 CDate() で日付型に変換しています。<br /><br />日付の計算をするためには、データ型を揃える必要があるからです。<br /><br />次の送信日は、最終送信日に送信間隔をプラスして計算します。<br /><br />配列からデータを取り出すには、添え字を指定します。<br />intervalArray(nextStep)<br /><br />ポイントは、添え字を変数で指定していることです。<br /><br />変数の値が変われば、取得できるデータが変わります。<br /><br />これにより、個々のメールでステップごとに送信間隔を変えることができます。<br /><br /><br />(5)次の送信日がまだの場合は、メールを作成しないようにしている部分です。<br /><br /><div class="pg"><br />'送信日がまだの場合<br />If nextDate &gt; Now Then<br />&nbsp;&nbsp;Exit For<br />End If<br /></div><br /><br />Nowは現在の日時を返します。<br /><br />次の送信日が現在の日時より大きい場合は、まだメールを送るタイミングではありません。<br /><br />そこで「Exit For」でFor文を1回抜け出し、次の回へ進みます。<br /><br />つまり次のメールへ進むということです。<br /><br /><br />(6)メール送信に成功したら、ワークシート「送信」のステップと最終送信日を更新している部分です。<br /><br /><div class="pg"><br />Private Sub updateData()<br />省略<br />End Sub<br /></div><br /><br />ポイントは、最大ステップを超える場合、かつ次の送信日が未だの場合は、データを更新しないことです。<br /><br />条件を満たしているメールだけ、データを更新します。<br /><br />なぜなら、送信したメールのデータだけを更新しないと、矛盾するからです。<br /><br />考え方はメールを作成する場合と同じです。(プログラムも同じ)<br /><br /><br />(7)ステップと最終送信日の更新を行なっている部分です。<br /><br /><div class="pg"><br />'ステップアップ<br />Range("C" &amp; i).Value = nextStep<br />'最終送信日を更新<br />Range("D" &amp; i).Value = Format(Now, "yyyy/mm/dd")<br /></div><br /><br />Nowは時刻まで含んでいるので、Format関数で書式を整えています。<br /><br /><br />(8)上記のSubプロシージャを呼び出している部分です。<br /><br /><div class="pg"><br />'送信に成功したら、ステップと最終送信日を更新する<br />updateData<br /></div><br /><br />またはCall命令を使って、以下のように書いても同じ結果になります。<br /><div class="pg"><br />Call updateData<br /></div><br /><br />メールの送信が成功した場合は、ステップと最終更新日を更新する必要があるので、updateData というサブプロシージャを呼び出しています。<br /><br /><br />(9)一番重要な部分<br /><br />最大ステップを超える場合、かつ次の送信日が過ぎている場合だけ、メールを送信する部分です。<br /><br /><div class="pg"><br />'開始～終了行番号のメールを作成<br />For i = startPos To endPos<br /><br />&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br /><br />&nbsp;&nbsp;'最大ステップ数以下の場合<br />&nbsp;&nbsp;If nextStep &lt;= maxStep Then<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;'最終送信日<br />&nbsp;&nbsp;&nbsp;&nbsp;lastDate = CDate(Trim(Range("D" &amp; i).Value))<br />&nbsp;&nbsp;&nbsp;&nbsp;'次の送信日を計算<br />&nbsp;&nbsp;&nbsp;&nbsp;nextDate = lastDate + intervalArray(nextStep)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;'送信日がまだの場合<br />&nbsp;&nbsp;&nbsp;&nbsp;If nextDate &gt; Now Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit For<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br /><br />途中省略<br /><br />&nbsp;&nbsp;End If<br /><br />Next i<br /></div><br /><br /><br />↓以下のように書くとスッキリすると思うのですが、エラーが出ます。<br /><br /><div class="pg"><br />'開始～終了行番号のメールを作成<br />For i = startPos To endPos<br /><br />&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br /><br />&nbsp;&nbsp;'最終送信日<br />&nbsp;&nbsp;lastDate = CDate(Trim(Range("D" &amp; i).Value))<br />&nbsp;&nbsp;'次の送信日を計算<br />&nbsp;&nbsp;nextDate = lastDate + intervalArray(nextStep)<br /><br />&nbsp;&nbsp;'最大ステップ数以下、かつ送信日がまだの場合<br />&nbsp;&nbsp;If (nextStep &lt;= maxStep) And (nextDate &gt; Now) Then<br /><br />途中省略<br /><br />&nbsp;&nbsp;End If<br /><br />Next i<br /></div><br /><br />なぜなら、intervalArray(nextStep)の要素数がオーバーするからです。<br /><br />フォームで最大ステップに10を入力していた場合、変数 nextStep は 11までカウントアップするので、配列 intervalArray の要素数を超えるためです。<br /><br />だから解答例のような書き方をしているわけです。<br /><br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/156204363.html">
<link>http://mailpg.pgtop.net/article/156204363.html</link>
<title>ステップメールで、送信間隔を設定するプログラムの解答例。</title>
<description>Excelからステップメールを送信するプログラムでは、送信間隔を設定することができます。これまでに紹介した完成図やヒントを見て、ステップメールのVBAプログラムを改良する課題はできましたか？出来た人は、プログラミングがかなり上達しています。出来なかった人も、必ず一度は自分の頭で考えてください。考えた後にこの解答例を見ることをおすすめします。自分で考えてみるのと、まったく考えずに解答だけ見るのとでは、理解度が全く違ってくるからです。今回紹介する解答例は、たくさんある正解の一つに...</description>
<dc:subject>Step62・課題4の解答例</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-07-13T07:16:25+09:00</dc:date>
<content:encoded><![CDATA[
<strong>Excel</strong>から<strong>ステップメール</strong>を送信するプログラムでは、送信間隔を設定することができます。<br /><br />これまでに紹介した完成図やヒントを見て、ステップメールのVBAプログラムを改良する課題はできましたか？<br /><br />出来た人は、プログラミングがかなり上達しています。<br /><br />出来なかった人も、必ず一度は自分の頭で考えてください。<br /><br />考えた後にこの解答例を見ることをおすすめします。<br /><br />自分で考えてみるのと、まったく考えずに解答だけ見るのとでは、理解度が全く違ってくるからです。<br /><br />今回紹介する解答例は、たくさんある正解の一つに過ぎません。<br /><br />プログラムには、いろんな書き方があります。<br /><br />もしあなたが書いた方法で、ステップメールの送信間隔が設定できたなら、それも正解の一つです。<br /><br />それでは解答例を掲載します。<br /><br />追加・変更のあったプロシージャのみ掲載しているので、ご注意ください。<br /><br />変更の無いプロシージャは、そのまま使えるので、ここには掲載していません。<br /><br />・宣言セクション<br /><div class="pg"><br />Option Explicit<br /><br />省略<br />Dim intervalArray() As Integer '送信間隔<br /></div><br /><br /><br />・「メール送信」ボタンをクリック時<br /><div class="pg"><br />Private Sub cmd送信_Click()<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'エラーが発生したら処理を行なう<br />&nbsp;&nbsp;On Error GoTo Err_Shori<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim bobj As Object<br />&nbsp;&nbsp;Dim mailto As String<br />&nbsp;&nbsp;Dim mailfrom As String<br />&nbsp;&nbsp;Dim subj As String<br />&nbsp;&nbsp;Dim body As String<br />&nbsp;&nbsp;Dim msg As Variant 'メール作成チェック用<br />&nbsp;&nbsp;Dim rc As Integer '一括送信チェック用<br />&nbsp;&nbsp;Dim i As Long<br />&nbsp;&nbsp;Dim tName As String<br />&nbsp;&nbsp;Dim eMail As String<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'行番号の値をチェック<br />&nbsp;&nbsp;If endPos &lt; startPos Then<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "終了行番号は、開始行番号以上の値を入力してください。"<br />&nbsp;&nbsp;&nbsp;&nbsp;'フォーカスを移す<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.txtEndPos.SetFocus<br />&nbsp;&nbsp;&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;End If<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'未入力の項目が無いかチェック<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;tName = Trim(Range("A" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;eMail = Trim(Range("B" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;If tName = "" Or eMail = "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "行番号" &amp; i &amp; "にデータが未入力の項目があります。"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'フォーカスを移す<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.txtEndPos.SetFocus<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br /><br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'オブジェクトを作成<br />&nbsp;&nbsp;Set bobj = CreateObject("basp21")<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'メールアドレスが有効かチェック<br />&nbsp;&nbsp;Dim match As Integer<br />&nbsp;&nbsp;Dim target As String<br />&nbsp;&nbsp;Dim regstr As String<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;regstr = "/^[\w\-+\.]+\@[\w\-+\.]+$/i"<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;eMail = Trim(Range("B" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;target = eMail<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;match = bobj.match(regstr, target)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;If match = 0 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "行番号" &amp; i &amp; "のメールアドレスが正しくありません。"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br /><br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'文章を取得して配列にセットする<br />&nbsp;&nbsp;Dim textArray() As String '動的配列<br />&nbsp;&nbsp;ReDim textArray(1 To maxStep) '要素数を設定<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim titleArray() As String<br />&nbsp;&nbsp;ReDim titleArray(1 To maxStep)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;ReDim intervalArray(1 To maxStep)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim filePath As String<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = 1 To maxStep<br />&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;filePath = Trim(Sheets("文章").Range("B" &amp; i + 1).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;titleArray(i) = Trim(Sheets("文章").Range("C" &amp; i + 1).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;intervalArray(i) = CInt(Trim(Sheets("文章").Range("D" &amp; i + 1).Value))<br />&nbsp;&nbsp;&nbsp;&nbsp;'文章を配列にセット<br />&nbsp;&nbsp;&nbsp;&nbsp;textArray(i) = readTextFile(filePath)<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'送信者<br />&nbsp;&nbsp;mailfrom = mSender &amp; vbTab &amp; id &amp; ":" &amp; pass<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;'件名取得<br />&nbsp;&nbsp;subj = Me.txtSubject<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'本文取得<br />&nbsp;&nbsp;body = Me.txtBody<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim tmpSubj As String<br />&nbsp;&nbsp;Dim tmpBody As String<br />&nbsp;&nbsp;Dim files As String<br />&nbsp;&nbsp;Dim nextStep As Long<br />&nbsp;&nbsp;Dim lastDate As Date<br />&nbsp;&nbsp;Dim nextDate As Date<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'開始～終了行番号のメールを作成<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   <br />&nbsp;&nbsp;&nbsp;&nbsp;'最大ステップ数以下の場合<br />&nbsp;&nbsp;&nbsp;&nbsp;If nextStep &lt;= maxStep Then<br />&nbsp;&nbsp;&nbsp;&nbsp;  <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'最終送信日<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastDate = CDate(Trim(Range("D" &amp; i).Value))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'次の送信日を計算<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextDate = lastDate + intervalArray(nextStep)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'送信日がまだの場合<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If nextDate &gt; Now Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit For<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tName = Trim(Range("A" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eMail = Trim(Range("B" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'宛先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailto = eMail<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'件名を一時変数に代入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = subj<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'件名に自動挿入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = Replace(tmpSubj, "[氏名]", tName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = Replace(tmpSubj, "[タイトル]", titleArray(nextStep))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'本文を一時変数に代入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpBody = body<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'本文に自動挿入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpBody = Replace(tmpBody, "[氏名]", tName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpBody = Replace(tmpBody, "[文章]", textArray(nextStep))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'添付ファイル<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files = Trim(Range("F" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files = Replace(files, ";", vbTab)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'メール作成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg = bobj.SendMail(mailq, mailto, mailfrom, tmpSubj, tmpBody, files)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'作成チェック<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If msg &lt;&gt; "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox "行番号" &amp; i &amp; "のメールで作成エラー。" &amp; vbCrLf &amp; msg, vbOKOnly + vbCritical, "作成時エラー"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'送信用フォルダをクリアする<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Dir(mailq &amp; "\*.txt") &lt;&gt; "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kill mailq &amp; "\*.txt"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "行番号" &amp; i &amp; "のメールを作成しました。"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Me.lblMsg = "メール送信開始・・・"<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'メール一括送信<br />&nbsp;&nbsp;rc = bobj.FlushMail(svname, mailq, logfile)<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;'送信チェック<br />&nbsp;&nbsp;If rc &lt;= -1 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox "送信できませんでした。" &amp; vbCrLf &amp; "エラー：" &amp; rc, vbOKOnly + vbCritical, "送信時エラー"<br />&nbsp;&nbsp;ElseIf rc = 0 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox "送信に該当するメールがありませんでした。", vbOKOnly + vbInformation, "情報"<br />&nbsp;&nbsp;Else<br />&nbsp;&nbsp;&nbsp;&nbsp;'送信に成功したら、ステップと最終送信日を更新する<br />&nbsp;&nbsp;&nbsp;&nbsp;updateData<br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox rc &amp; "件のメールを送信しました。", vbOKOnly + vbInformation, "完了"<br />&nbsp;&nbsp;End If<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'ラベルをクリア<br />&nbsp;&nbsp;Me.lblMsg = ""<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />Err_Shori_Exit:<br />&nbsp;&nbsp;Exit Sub<br /><br />'ここからエラー処理<br />Err_Shori:<br />&nbsp;&nbsp;MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"<br />&nbsp;&nbsp;Resume Err_Shori_Exit<br />'ここまで<br /><br />End Sub<br /></div><br /><br /><br />・各データの更新<br /><div class="pg"><br />Private Sub updateData()<br />&nbsp;&nbsp;'ステップと最終送信日を更新<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim i As Long<br />&nbsp;&nbsp;Dim nextStep As Long<br />&nbsp;&nbsp;Dim lastDate As Date<br />&nbsp;&nbsp;Dim nextDate As Date<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'最大ステップ数以下の場合<br />&nbsp;&nbsp;&nbsp;&nbsp;If nextStep &lt;= maxStep Then<br />&nbsp;&nbsp;&nbsp;&nbsp;  <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'最終送信日<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastDate = CDate(Trim(Range("D" &amp; i).Value))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'次の送信日を計算<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextDate = lastDate + intervalArray(nextStep)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'送信日がまだの場合<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If nextDate &gt; Now Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit For<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ステップアップ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Range("C" &amp; i).Value = nextStep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'最終送信日を更新<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Range("D" &amp; i).Value = Format(Now, "yyyy/mm/dd")<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />End Sub<br /></div><br /><br /><br />【動作確認】<br />プログラミングを行なう時には、動作確認しながらの試行錯誤が欠かせません。<br /><br />動作確認の手順は、「<a href="http://mailpg.pgtop.net/category/7584836-1.html" target="_self">Step60・課題4 送信間隔を設定する</a>」でも説明しています。<br /><br />以下に動作確認のポイントだけを書いておきます。<br /><br />(1)Excelワークシート「送信」の最終送信日の値は、ランダムに入力してかまいません。<br /><br />でも、必ず今日より前の日付にしてください。＊重要<br /><br />それと日付の書式(形式)は守って入力します。＊重要<br /><br /><br />(2)メールの送信が上手くいくと、「ステップ」と「最終送信日」が自動的に更新されることを確認してください。<br /><br />条件に一致し、送信したメールのデータだけが更新されるはずです。<br /><br /><br />(3)最大ステップを超える場合、かつ送信日が未だの場合は、メールが送信されないことも確認してください。<br /><br />ワークシート「送信」のステップに10以上を指定すると、送信されません。<br />(フォームの最大ステップに10以下を指定した場合)<br /><br />また最終送信日にステップごとの送信間隔をプラスして、次の送信日を計算し、<br /><br />もし現在より大きい(未来)だと、まだメールを送信する時期ではないため、送信されません。<br /><br />つまり条件に一致しないメールは、作成されません。<br /><br /><br />(4)プログラムの意味については、「<a href="http://mailpg.pgtop.net/category/8473924-1.html" target="_self">Step61・課題4 送信間隔を設定するヒント</a>」を参考にしてください。<br /><br /><br />いかがでしたか？<br /><br />あなたの考えたプログラムと合っていましたか。<br /><br />またはどこが違っていたでしょうか。<br /><br /><br />上記のプログラムも、プロシージャに分割することで、もっとスッキリ書くことができます。<br /><br />しかしプログラミング初心者には、上から下に流れるプログラムのほうが理解しやすい(流れを追いやすい)ので、あえてそのままにしています。<br /><br />余裕のある人は、プロシージャに分割することに挑戦してみるとよいでしょう。<br /><br /><a name="more"></a>

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

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/139195382.html">
<link>http://mailpg.pgtop.net/article/139195382.html</link>
<title>ステップメールで、送信間隔を設定できるようにするプログラム。</title>
<description>Excelからステップメールを送信するVBAプログラムの仕上げとして、送信間隔を設定できるように、プログラムをカスタマイズ(改良)してみましょう。通常、ステップメールでは、次のステップを送信するまでの送信間隔(1日後、3日後、7日後など)を設定できるものがあります。そこで今回の課題では、以下のようなステップメールを送信できる機能を実現します。まずは完成図を見て、イメージを掴んでください。【完成図】(1)ワークシート「送信」のD列に、「最終送信日」を記録できるようにします。最終...</description>
<dc:subject>Step60・課題4 送信間隔を設定する</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-01-24T07:50:24+09:00</dc:date>
<content:encoded><![CDATA[
<strong>Excel</strong>から<strong>ステップメール</strong>を送信するVBAプログラムの仕上げとして、送信間隔を設定できるように、プログラムをカスタマイズ(改良)してみましょう。<br /><br />通常、ステップメールでは、次のステップを送信するまでの送信間隔(1日後、3日後、7日後など)を設定できるものがあります。<br /><br />そこで今回の課題では、以下のようなステップメールを送信できる機能を実現します。<br /><br />まずは完成図を見て、イメージを掴んでください。<br /><br />【完成図】<br />(1)ワークシート「送信」のD列に、「最終送信日」を記録できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-344.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-344-thumbnail2.gif" width="320" height="73" border="0" align="" alt="mail-344.gif" /></a><br /><br />最終送信日とは、前回にステップメールを送信した日付のことです。<br /><br />ステップが 0 の場合は、新しい読者なので、まだメールは未送信です。その時は登録日の日付を入力しておきます。<br /><br />＊日付は空白にはしないでください。<br />＊日付として正しい形式で入力します。(半角で)<br /><br />日付の値は、ランダムに入力してかまいません。でも、必ず今日より前の日付にしてください。<br /><br /><br />(2)ステップメールの送信が成功すると、D列の最終送信日を、更新するようにします。<br />自動的に送信日の日付が、入力されるようにしてください。<br /><br /><br />(3)ワークシート「文章」では、D列に次のステップメールを送るまでの「間隔(日)」を指定できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-345.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-345-thumbnail2.gif" width="320" height="104" border="0" align="" alt="mail-345.gif" /></a><br /><br />＊数値は、半角で入力してください。<br />＊step1は新規の読者なので、間隔は0にします。(すぐに送るため)<br /><br />間隔の値は、ランダムに入力してかまいません。<br /><br />例えば上の図では、step1とstep2の間には、1日あることになります。<br /><br />また、step4はstep3を送ってから、3日後に送信するという意味です。<br /><br /><br />(4)動作確認について<br />今回の課題の動作確認の方法は、これまでと変わりません。<br /><br />ワークシート「送信」に切り替えると、ユーザーフォーム「frm送信」が自動的に表示されます。<br /><br />あとはテキストボックスに入力して、メールを一括送信します。<br /><br />送信フォームの件名と本文に入力する文字列を掲載しておきます。動作確認の際にご利用ください。<br /><br />・件名<br /><div class="pg"><br />[氏名]様　[タイトル]<br /></div><br /><br />・本文<br /><div class="pg"><br />[氏名]様<br /><br />こんにちは。○○です。<br />本日はメールマガジンをお届けします。<br /><br />[氏名]様のお役に立てれば幸いです。<br /><br />[文章]<br /><br />最後までお読みいただき、ありがとうございました。<br />株式会社○○<br /></div><br /><br />既に最大ステップに達している人には、これ以上メールが配信されないのは、前回までと同じです。<br /><br />これまでとの違いは、ステップごとに間隔(日)を設定しているので、条件を満たしていない場合は、メールが送信されないことです。<br /><br />つまり、最大ステップに達していない、かつ日付の間隔を満たしている時だけ、ステップメールが送信されます。<br /><br />そして最後に、ワークシート「送信」のD列の最終送信日が、自動的に更新されていることを確認してください。<br /><br />もちろん今回送信した人だけ、更新されていなければなりません。<br /><br /><br />(5)メーラーで受信してみる<br />ステップメールの送信が上手くいったかどうかは、送信したメールを Outlook Express のようなメーラーで受信して確認します。<br /><br />・条件に一致しているメールは、ちゃんと届いていますか？<br />・本来は送信されないはずのメールが届いていませんか？<br /><br /><br />【課題の手順】<br />今回の課題は、前回までに作成した「ステップメール.xls」をカスタマイズして行ないます。ついでにステップメールの復習を兼ねています。<br /><br />課題は、以下の順番で行なってください。<br />・「ステップメール.xls」を開く　＊マクロを有効にする<br />・VBEを起動する　「Altキー」＋「F11キー」<br />・プログラムを一部変更、追加する<br />・動作確認<br /><br /><br />以上の図と説明を見ただけで、ステップメールをカスタマイズできれば、かなりプログラミングが上達しています。<br /><br />まずは自力で挑戦してみてください。もし出来なくても、自分の頭で考えてみることが大切です。<br /><br />「日付をどう扱うか」というのがポイントです。<br /><br />次回にヒントを掲載します。<br /><br /><br />【補足】<br />今回の課題では、完全には自動化していません。<br /><br />ユーザーが送信作業を行なう時に、日付を計算して、条件を満たしていれば送信するという、シンプルな仕組みにします。<br /><br />したがって、ユーザーが毎日一度は、「メール送信」ボタンをクリックすることが、前提となっています。<br /><br />ユーザーが送信作業を怠けると、必ずしも設定した間隔で送信されるとは限りません。少し遅れることもあります。<br /><br />完全に自動化するには、タイマーなどの機能を追加すれば可能です。<br /><br />毎日決まった時間に、自動的に「メール送信」ボタンをクリックするように、プログラミングするだけです。<br /><br />でもここまでやると、課題としては難しくなるので、今回は省きました。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/139003446.html">
<link>http://mailpg.pgtop.net/article/139003446.html</link>
<title>Excelでステップメールを送信するプログラムの解説。</title>
<description>今回は、Excelからステップメールを送信するためのVBAプログラムについて、詳しく解説します。実は既に以下のステップで、ほとんど説明済みです。・Step55で完成図・Step56、Step57でプログラムのヒント・Step57で解答例そこで今回は、大事なポイントだけを、解説することにします。また以前のステップと重なっている説明もあるのですが、ご了承ください。繰り返し書いているということは、それだけ重要な部分です。(1)最大ステップを代入するための変数を宣言している部分です。...</description>
<dc:subject>Step59・ステップメール送信プログラムの解説</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2010-01-22T07:44:00+09:00</dc:date>
<content:encoded><![CDATA[
今回は、<strong>Excel</strong>から<strong>ステップメール</strong>を送信するためのVBAプログラムについて、詳しく解説します。<br /><br />実は既に以下のステップで、ほとんど説明済みです。<br />・Step55で完成図<br />・Step56、Step57でプログラムのヒント<br />・Step57で解答例<br /><br />そこで今回は、大事なポイントだけを、解説することにします。<br /><br />また以前のステップと重なっている説明もあるのですが、ご了承ください。繰り返し書いているということは、それだけ重要な部分です。<br /><br />(1)最大ステップを代入するための変数を宣言している部分です。<br /><div class="pg"><br />Dim maxStep As Long<br /></div><br /><br />変数の有効範囲に気をつけてください。<br /><br />この変数は、複数のプロシージャで共通して使います。したがって宣言セクションで、変数の宣言をしています。<br /><br /><br />(2)文章を取得して配列にセットする部分については、Step57で説明済みです。<br />Dim textArray() As String からの部分<br /><br />この部分が、ステップメールで一番重要なところです。<br /><br />文章とタイトルは、配列を使って、あらかじめ取得しておきます。<br /><br />ただし、メール送信フォームを開いたからといって、必ずしも送信するとは限りません。<br /><br />そこでユーザーが、「メール送信」ボタンをクリックした時に取得しています。<br /><br />この部分は、サブプロシージャとして分けたほうが、スッキリするかもしれません。<br /><br /><br />(3)ステップメールでも、ユーザーフォームから、件名と本文を取得します。<br /><div class="pg"><br />'件名取得<br />subj = Me.txtSubject<br />'本文取得<br />body = Me.txtBody<br /></div><br /><br />これらは、ステップメールで、どのメールにも共通する文字になります。<br /><br /><br />(4)件名と本文を、一時的に格納するため、変数を宣言している部分です。<br /><div class="pg"><br />Dim tmpSubj As String<br />Dim tmpBody As String<br /></div><br /><br />ステップメールでは、個々のメールの内容が異なるため、元になる変数(subj、body)を直接書き換えてしまうと、不都合があります。<br /><br />そのため、変数の内容をコピーするための一時変数を準備しています。<br /><br /><br />(5)次のステップを代入する変数を宣言している部分です。<br /><div class="pg"><br />Dim nextStep As Long<br /></div><br /><br />この変数の有効範囲は、宣言したプロシージャ内だけです。<br /><br /><br />(6)次のステップを計算している部分です。<br /><div class="pg"><br />nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br /></div><br /><br />次のステップは、現在のステップに1を加算するだけです。<br /><br />現在のステップは、Excelのワークシートからセルの値を取得します。<br /><br />これはフォームが表示されている時に、対象となっているワークシートの場合です。<br /><br />変数 i には、行番号が入っています。iが変化することで、異なる行の値を取得できます。<br /><br />Trim関数を使っているのは、前後の空白を取り除くためです。<br /><br />あとは、取得したセルの値を、念のため CLng で長整数型に変換してから、1をプラスしています。<br /><br /><br />(7)次のステップが、最大ステップ数以下の場合だけ、処理を行なうようにしている部分です。<br /><div class="pg"><br />If nextStep &lt;= maxStep Then<br />省略<br />End If<br /></div><br /><br />最大ステップを超える場合は、メールを作成しないようにするための処理です。<br /><br /><br />(8)件名に値を自動挿入している部分です。<br /><div class="pg"><br />tmpSubj = subj<br />tmpSubj = Replace(tmpSubj, "[氏名]", tName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = Replace(tmpSubj, "[タイトル]", titleArray(nextStep))<br /></div><br /><br />元の変数の値(subj)は変えずに置換したいので、一時変数(tmpSubj)に代入しています。<br /><br />自動挿入するためには、Replace関数を使って置換します。<br />＊置換するのは tmpSubj のほうです。<br /><br />件名では、挿入タグ(検索文字列)に、以下のものが使えます。<br />[氏名]、[タイトル]<br /><br />配列からデータを取り出すには、添え字を指定します。<br />titleArray(nextStep)<br /><br />ポイントは、添え字を変数で指定することです。変数の値が変われば、取得できるデータが変わります。<br /><br /><br />(9)本文に値を自動挿入している部分です。<br /><div class="pg"><br />tmpBody = body<br />tmpBody = Replace(tmpBody, "[氏名]", tName)<br />tmpBody = Replace(tmpBody, "[文章]", textArray(nextStep))<br /></div><br /><br />要領は件名と同じです。<br /><br />本文では、挿入タグ(検索文字列)に、以下のものが使えます。<br />[氏名]、[文章]<br /><br /><br />(10)個々のメールを作成している部分です。<br /><div class="pg"><br />msg = bobj.SendMail(mailq, mailto, mailfrom, tmpSubj, tmpBody, files)<br /></div><br /><br />件名と本文の引数には、一時変数(tmpSubj、tmpBody)を使っている点に注目してください。<br /><br />これにより、個々のメールで内容を変えることができます。<br /><br />元の変数(subj、body)を使うと、全部同じメールになるので注意してください。それに挿入タグ(検索文字列)も、残ったままになるはずです。<br /><br /><br />(11)送信チェックを行なっているプログラムを変更しました。<br /><div class="pg"><br />'送信チェック<br />If rc &lt;= -1 Then<br />&nbsp;&nbsp;MsgBox "送信できませんでした。" &amp; vbCrLf &amp; "エラー：" &amp; rc, vbOKOnly + vbCritical, "送信時エラー"<br />ElseIf rc = 0 Then<br />&nbsp;&nbsp;MsgBox "送信に該当するメールがありませんでした。", vbOKOnly + vbInformation, "情報"<br />Else<br />&nbsp;&nbsp;'送信に成功したら、ステップアップする<br />&nbsp;&nbsp;updateStep<br />&nbsp;&nbsp;MsgBox rc &amp; "件のメールを送信しました。", vbOKOnly + vbInformation, "完了"<br />End If<br /></div><br /><br />ステップメールでは、必ずしも該当するメールがあるとは限りません。<br /><br />例えば、全ての人が既に最大ステップに達している場合も考えられます。<br /><br />そのままでは、送信するメールが無い時に、「送信時エラー」が表示されてしまうので、少しだけ変更しました。<br /><br />該当するメールが無い場合は、変数rc に「0」が代入されています。それを利用して、メッセージを表示することにしました。<br />ElseIf rc = 0 Then の部分<br /><br />また、送信が成功した場合は、ステップアップする必要があるので、updateStep というサブプロシージャを呼び出しています。<br /><br />Call命令を使って、以下のように書いても同じ結果になります。<br />Call updateStep<br /><br /><br />(12)最大ステップを更新した時のイベントプロシージャです。<br /><div class="pg"><br />Private Sub txtMaxStep_Exit(ByVal Cancel As MSForms.ReturnBoolean)<br />省略<br />End Sub<br /></div><br /><br />ユーザーフォームで、最大ステップに入力した値をチェックするため、イベントプロシージャを新たに作成しました。<br /><br />行番号のテキストボックスと、ほとんど同じ処理です。少し書き換えただけです。<br /><br /><br />(13)フォームを初期化時のイベントプロシージャに、プログラムを追加しています。<br /><div class="pg"><br />Private Sub UserForm_Initialize()<br />省略<br />&nbsp;&nbsp;Me.txtMaxStep = 10<br />省略<br />&nbsp;&nbsp;maxStep = 10<br />省略<br /></div><br /><br />最大ステップのテキストボックス(txtMaxStep)と変数(maxStep)に、初期値として「10」を代入しています。<br /><br />変数maxStepにも初期値を代入するのは、ユーザーフォームを開いた時に、テキストボックスの値を変更せずに送信することもあるからです。<br /><br />maxStepの値は、テキストボックスを更新したタイミングで代入される仕組みにしているので、テキストボックスを操作しない場合は、変数の値が空になります。<br /><br />それを防ぐための処理です。<br /><br /><br />(14)ステップを更新するためのSubプロシージャを、新しく作成しました。<br /><div class="pg"><br />Private Sub updateStep()<br />&nbsp;&nbsp;'ステップ更新<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim i As Long<br />&nbsp;&nbsp;Dim nextStep As Long<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'最大ステップ数以下の場合<br />&nbsp;&nbsp;&nbsp;&nbsp;If nextStep &lt;= maxStep Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ステップアップ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Range("C" &amp; i).Value = nextStep<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />End Sub<br /></div><br /><br />メール送信が成功したら、ワークシート「送信」のステップを、更新する必要があります。<br /><br />ポイントは、最大ステップを超える場合は、ステップアップしないことです。つまり最大ステップ数以下の場合だけステップアップします。<br />If nextStep &lt;= maxStep Then の部分<br /><br />このように、処理をSubプロシージャに分けることで、本体のプログラムがシンプルになります。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/131042025.html">
<link>http://mailpg.pgtop.net/article/131042025.html</link>
<title>ステップメールを送信するプログラムの解答例。</title>
<description>Excelからステップメールを送信することができます。完成図やヒントを見て、ステップメールのVBAプログラムを作成する課題はできましたか？出来た人は、プログラミングの実力がアップしています。出来なかった人も、一度は自分の頭で考えてから解答例を見ることをおすすめします。考えずに解答だけ見ると、理解度が全く違ってくるからです。今回紹介する解答例は、正解の一つに過ぎません。プログラムにはいろんな書き方があるので、もしあなたが書いた方法で、ステップメールが送信できているなら、それも正...</description>
<dc:subject>Step58・課題3の解答例</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2009-10-24T08:09:31+09:00</dc:date>
<content:encoded><![CDATA[
<strong>Excel</strong>から<strong>ステップメール</strong>を送信することができます。<br /><br />完成図やヒントを見て、ステップメールのVBAプログラムを作成する課題はできましたか？<br /><br />出来た人は、プログラミングの実力がアップしています。<br /><br />出来なかった人も、一度は自分の頭で考えてから解答例を見ることをおすすめします。<br /><br />考えずに解答だけ見ると、理解度が全く違ってくるからです。<br /><br />今回紹介する解答例は、正解の一つに過ぎません。プログラムにはいろんな書き方があるので、もしあなたが書いた方法で、ステップメールが送信できているなら、それも正解の一つです。<br /><br />それでは解答例を掲載します。<br /><br />追加・変更のあったプロシージャのみ掲載しているので、ご注意ください。変更の無いプロシージャはそのまま使えるので、ここには掲載していません。<br /><br /><div class="pg"><br />Option Explicit<br /><br />Dim svname As String<br />Dim id As String<br />Dim pass As String<br />Dim mSender As String '送信者<br />Dim mailq As String 'メールキュー<br />Dim logfile As String 'ログファイル<br />Dim startPos As Long '開始行番号<br />Dim endPos As Long '終了行番号<br />Dim maxStep As Long '最大ステップ<br /><br />Private Sub cmd送信_Click()<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'エラーが発生したら処理を行なう<br />&nbsp;&nbsp;On Error GoTo Err_Shori<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim bobj As Object<br />&nbsp;&nbsp;Dim mailto As String<br />&nbsp;&nbsp;Dim mailfrom As String<br />&nbsp;&nbsp;Dim subj As String<br />&nbsp;&nbsp;Dim body As String<br />&nbsp;&nbsp;Dim msg As Variant 'メール作成チェック用<br />&nbsp;&nbsp;Dim rc As Integer '一括送信チェック用<br />&nbsp;&nbsp;Dim i As Long<br />&nbsp;&nbsp;Dim tName As String<br />&nbsp;&nbsp;Dim eMail As String<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'行番号の値をチェック<br />&nbsp;&nbsp;If endPos &lt; startPos Then<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "終了行番号は、開始行番号以上の値を入力してください。"<br />&nbsp;&nbsp;&nbsp;&nbsp;'フォーカスを移す<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.txtEndPos.SetFocus<br />&nbsp;&nbsp;&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;End If<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'未入力の項目が無いかチェック<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;tName = Trim(Range("A" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;eMail = Trim(Range("B" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;If tName = "" Or eMail = "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "行番号" &amp; i &amp; "にデータが未入力の項目があります。"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'フォーカスを移す<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.txtEndPos.SetFocus<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br /><br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'オブジェクトを作成<br />&nbsp;&nbsp;Set bobj = CreateObject("basp21")<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'メールアドレスが有効かチェック<br />&nbsp;&nbsp;Dim match As Integer<br />&nbsp;&nbsp;Dim target As String<br />&nbsp;&nbsp;Dim regstr As String<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;regstr = "/^[\w\-+\.]+\@[\w\-+\.]+$/i"<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;eMail = Trim(Range("B" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;target = eMail<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;match = bobj.match(regstr, target)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;If match = 0 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "行番号" &amp; i &amp; "のメールアドレスが正しくありません。"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br /><br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'文章を取得して配列にセットする<br />&nbsp;&nbsp;Dim textArray() As String '動的配列<br />&nbsp;&nbsp;ReDim textArray(1 To maxStep) '要素数を設定<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim titleArray() As String<br />&nbsp;&nbsp;ReDim titleArray(1 To maxStep)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim filePath As String<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = 1 To maxStep<br />&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;filePath = Trim(Sheets("文章").Range("B" &amp; i + 1).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;titleArray(i) = Trim(Sheets("文章").Range("C" &amp; i + 1).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;'文章を配列にセット<br />&nbsp;&nbsp;&nbsp;&nbsp;textArray(i) = readTextFile(filePath)<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'送信者<br />&nbsp;&nbsp;mailfrom = mSender &amp; vbTab &amp; id &amp; ":" &amp; pass<br /><br />&nbsp;&nbsp;'件名取得<br />&nbsp;&nbsp;subj = Me.txtSubject<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'本文取得<br />&nbsp;&nbsp;body = Me.txtBody<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim tmpSubj As String<br />&nbsp;&nbsp;Dim tmpBody As String<br />&nbsp;&nbsp;Dim files As String<br />&nbsp;&nbsp;Dim nextStep As Long<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'開始～終了行番号のメールを作成<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'最大ステップ数以下の場合<br />&nbsp;&nbsp;&nbsp;&nbsp;If nextStep &lt;= maxStep Then<br />&nbsp;&nbsp;&nbsp;&nbsp;  <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ワークシートの値を取得<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tName = Trim(Range("A" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eMail = Trim(Range("B" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'宛先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailto = eMail<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'件名を一時変数に代入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = subj<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'件名に自動挿入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = Replace(tmpSubj, "[氏名]", tName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpSubj = Replace(tmpSubj, "[タイトル]", titleArray(nextStep))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'本文を一時変数に代入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpBody = body<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'本文に自動挿入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpBody = Replace(tmpBody, "[氏名]", tName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpBody = Replace(tmpBody, "[文章]", textArray(nextStep))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'添付ファイル<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files = Trim(Range("F" &amp; i).Value)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files = Replace(files, ";", vbTab)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'メール作成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg = bobj.SendMail(mailq, mailto, mailfrom, tmpSubj, tmpBody, files)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'作成チェック<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If msg &lt;&gt; "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox "行番号" &amp; i &amp; "のメールで作成エラー。" &amp; vbCrLf &amp; msg, vbOKOnly + vbCritical, "作成時エラー"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'送信用フォルダをクリアする<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Dir(mailq &amp; "\*.txt") &lt;&gt; "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kill mailq &amp; "\*.txt"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "行番号" &amp; i &amp; "のメールを作成しました。"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Me.lblMsg = "メール送信開始・・・"<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'メール一括送信<br />&nbsp;&nbsp;rc = bobj.FlushMail(svname, mailq, logfile)<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;'送信チェック<br />&nbsp;&nbsp;If rc &lt;= -1 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox "送信できませんでした。" &amp; vbCrLf &amp; "エラー：" &amp; rc, vbOKOnly + vbCritical, "送信時エラー"<br />&nbsp;&nbsp;ElseIf rc = 0 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox "送信に該当するメールがありませんでした。", vbOKOnly + vbInformation, "情報"<br />&nbsp;&nbsp;Else<br />&nbsp;&nbsp;&nbsp;&nbsp;'送信に成功したら、ステップアップする<br />&nbsp;&nbsp;&nbsp;&nbsp;updateStep<br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox rc &amp; "件のメールを送信しました。", vbOKOnly + vbInformation, "完了"<br />&nbsp;&nbsp;End If<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'ラベルをクリア<br />&nbsp;&nbsp;Me.lblMsg = ""<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />Err_Shori_Exit:<br />&nbsp;&nbsp;Exit Sub<br /><br />'ここからエラー処理<br />Err_Shori:<br />&nbsp;&nbsp;MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"<br />&nbsp;&nbsp;Resume Err_Shori_Exit<br />'ここまで<br /><br />End Sub<br /><br />Private Sub txtMaxStep_Exit(ByVal Cancel As MSForms.ReturnBoolean)<br />&nbsp;&nbsp;'エラーが発生したら処理を行なう<br />&nbsp;&nbsp;On Error GoTo Err_Shori<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'最大ステップが空白の時の処理<br />&nbsp;&nbsp;If Me.txtMaxStep = "" Then<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "最大ステップを入力してください。"<br />&nbsp;&nbsp;&nbsp;&nbsp;Cancel = True<br />&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;End If<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'最大ステップを取得<br />&nbsp;&nbsp;maxStep = CLng(Me.txtMaxStep)<br />&nbsp;&nbsp;   <br />&nbsp;&nbsp;'最大ステップが1未満の時の処理<br />&nbsp;&nbsp;If maxStep &lt; 1 Then<br />&nbsp;&nbsp;&nbsp;&nbsp;Me.lblMsg = "最大ステップは、1以上の数値を入力してください。"<br />&nbsp;&nbsp;&nbsp;&nbsp;Cancel = True<br />&nbsp;&nbsp;&nbsp;&nbsp;Exit Sub<br />&nbsp;&nbsp;End If<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'ラベルをクリア<br />&nbsp;&nbsp;Me.lblMsg = ""<br />&nbsp;&nbsp;'メール送信ボタン使用可<br />&nbsp;&nbsp;Me.cmd送信.Enabled = True<br />&nbsp;&nbsp;<br />Err_Shori_Exit:<br />&nbsp;&nbsp;Exit Sub<br /><br />'ここからエラー処理<br />Err_Shori:<br />&nbsp;&nbsp;MsgBox Err.Description, vbOKOnly + vbCritical, "実行時エラー"<br />&nbsp;&nbsp;Cancel = True<br />&nbsp;&nbsp;Resume Err_Shori_Exit<br />'ここまで<br /><br />End Sub<br /><br />Private Sub UserForm_Initialize()<br />&nbsp;&nbsp;'メール送信ボタン使用不可<br />&nbsp;&nbsp;Me.cmd送信.Enabled = False<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'初期値<br />&nbsp;&nbsp;Me.txtStartPos = 2<br />&nbsp;&nbsp;Me.txtEndPos = 2<br />&nbsp;&nbsp;Me.txtMaxStep = 10<br />&nbsp;&nbsp;startPos = 2<br />&nbsp;&nbsp;endPos = 2<br />&nbsp;&nbsp;maxStep = 10<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'送信者<br />&nbsp;&nbsp;mSender = Trim(Sheets("設定").Range("B1").Value)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'SMTPサーバー<br />&nbsp;&nbsp;svname = Trim(Sheets("設定").Range("B2").Value)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'送信ID<br />&nbsp;&nbsp;id = Trim(Sheets("設定").Range("B3").Value)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'送信パスワード<br />&nbsp;&nbsp;pass = Trim(Sheets("設定").Range("B4").Value)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'メールキュー<br />&nbsp;&nbsp;mailq = "C:\mailPG\Send"<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;'ログファイル<br />&nbsp;&nbsp;logfile = "C:\mailPG\logfile.txt"<br />End Sub<br /><br />Private Sub updateStep()<br />&nbsp;&nbsp;'ステップ更新<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Dim i As Long<br />&nbsp;&nbsp;Dim nextStep As Long<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;For i = startPos To endPos<br />&nbsp;&nbsp;&nbsp;&nbsp;'次のステップ<br />&nbsp;&nbsp;&nbsp;&nbsp;nextStep = CLng(Trim(Range("C" &amp; i).Value)) + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'最大ステップ数以下の場合<br />&nbsp;&nbsp;&nbsp;&nbsp;If nextStep &lt;= maxStep Then<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ステップアップ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Range("C" &amp; i).Value = nextStep<br />&nbsp;&nbsp;&nbsp;&nbsp;End If<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Next i<br />&nbsp;&nbsp;<br />End Sub<br /></div><br /><br /><br />【動作確認】<br />プログラミングを行なう時には、動作確認しながらの試行錯誤が欠かせません。<br /><br />(1)動作確認の手順は、前回の <a href="http://mailpg.pgtop.net/category/7188956-1.html" target="_self">Step55・課題3 ステップメールを送信する</a> の「完成図」と同じ要領です。<br /><br /><br />(2)メールの送信が上手くいくと、ステップが自動的に更新されることも確認してください。<br /><br />また、最大ステップを超えるメールは送信されないことも確認してください。ワークシート「送信」のステップに10以上を指定すると、送信されません。<br /><br /><br />(3)プログラムについては、Step56、Step57のヒントを参考にしてください。<br /><br /><br /><br />【ワンポイント】<br />今回はステップメールを送信する前に、タイトルと文章をあらかじめ配列に格納しました。<br /><br />この方法は、送信するメール数に対し、文章数が少ない時に有効です。あらかじめデータを用意しておくことで、処理が速くなります。(ただしメモリーは消費する)<br /><br />逆に文章数のほうが多く、メール数が少ない場合には、使わない文章まで読み込んでおくと無駄になります。<br /><br />そのような場合には、メールを作成する時に、必要な文章だけ読み込むという手もあります。<br /><br />どちらの方法が良いのかは、システムの使い方によって変わります。<br /><br /><br /><a name="more"></a>

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

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

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/130714905.html">
<link>http://mailpg.pgtop.net/article/130714905.html</link>
<title>Excelでステップメールを送信するプログラム。</title>
<description>いよいよExcelからステップメールを送信するVBAプログラムを作成してみましょう。今回の課題では、以下のようなステップメールを送信できる機能を実現します。【完成図】(1)ワークシート「送信」のC列で、ステップを指定できるようにします。ステップとは、今どの段階までメールを送信済みか表します。・0の場合は新しい読者 まだメールは未送信・1の場合は、1回目のメールは送信済みステップの数値は、ランダムに入力してかまいません。でも、あらかじめ準備した文章のテキストファイル数と一致させ...</description>
<dc:subject>Step55・課題3 ステップメールを送信する</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2009-10-20T08:02:36+09:00</dc:date>
<content:encoded><![CDATA[
いよいよ<strong>Excel</strong>から<strong>ステップメール</strong>を送信するVBAプログラムを作成してみましょう。<br /><br />今回の課題では、以下のようなステップメールを送信できる機能を実現します。<br /><br />【完成図】<br />(1)ワークシート「送信」のC列で、ステップを指定できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-330.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-330-thumbnail2.gif" width="320" height="67" border="0" align="" alt="mail-330.gif" /></a><br /><br />ステップとは、今どの段階までメールを送信済みか表します。<br />・0の場合は新しい読者　まだメールは未送信<br />・1の場合は、1回目のメールは送信済み<br /><br />ステップの数値は、ランダムに入力してかまいません。<br /><br />でも、あらかじめ準備した文章のテキストファイル数と一致させる必要があるので、0～10 の範囲内で指定してください。<br /><br />また実際にステップメールを送信する時には、ワークシート「送信」のC列に「+1」した値を使います。<br /><br />ステップに入力されているのは、「送信済み」の値なので、新しいメールは次の値になるからです。<br /><br /><br />(2)ワークシート「文章」では、メールの本文中に挿入するテキストファイル名(B列)と、メールの件名に挿入するタイトル(C列)を指定できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-331.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-331-thumbnail2.gif" width="320" height="97" border="0" align="" alt="mail-331.gif" /></a><br /><br />＊タイトルは、全て入力してください。<br />＊テキストファイル名は、フルパスで指定します。<br /><br />フルパスで指定することで、ファイルはどこに保存しても添付できるメリットがあります。<br /><br /><br />(3)ワークシート「送信」に切り替えると、ユーザーフォーム「frm送信」が自動的に表示されます。<br /><br />以下のように入力して、メールを一括送信できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-332.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-332-thumbnail2.gif" width="286" height="320" border="0" align="" alt="mail-332.gif" /></a><br /><br />・行番号と最大ステップには、初期値が入力される。<br />・送信するメールの範囲を指定できるようにする。<br />・メールは1通でも送れるようにする。<br />・最大ステップを指定できるようにする。<br />・件名に、氏名とタイトルを挿入できるようにする。<br />・本文に、氏名と文章を挿入できるようにする。<br />・文章はステップによって自動的に変わる。<br />・添付ファイルの機能は、そのまま残す。<br /><br />最大ステップを指定する理由は、メールを送信する度にワークシート「送信」のステップをカウントアップしますが、用意したファイル数の10を超えないように、プログラム側で制御するためです。<br /><br />例えば、ステップが既に10の人には、これ以上メールが配信されないようにします。<br /><br />送信フォームの件名と本文に入力する文字列を掲載しておきます。動作確認の際にご利用ください。<br /><br />・件名<br /><div class="pg"><br />[氏名]様　[タイトル]<br /></div><br /><br />・本文<br /><div class="pg"><br />[氏名]様<br /><br />こんにちは。○○です。<br />本日はメールマガジンをお届けします。<br /><br />[氏名]様のお役に立てれば幸いです。<br /><br />[文章]<br /><br />最後までお読みいただき、ありがとうございました。<br />株式会社○○<br /></div><br /><br /><br />メール本文のテキストボックスを詳しく見てみましょう。<br /><br />(4)挿入タグを使い、本文に氏名を自動的に挿入できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-333.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-333-thumbnail2.gif" width="320" height="195" border="0" align="" alt="mail-333.gif" /></a><br /><br />＊同じ挿入タグは、何回でも使えます。<br /><br /><br />(5)どのステップメールでも共通する部分(ヘッダーやフッター)は、ユーザーが自由に入力できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-342.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-342-thumbnail2.gif" width="320" height="194" border="0" align="" alt="mail-342.gif" /></a><br /><br /><br />(6)挿入タグを使い、ステップごとに指定したテキストファイルを読み込んで、メール本文に「文章」を挿入できるようにします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-335.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-335-thumbnail2.gif" width="320" height="195" border="0" align="" alt="mail-335.gif" /></a><br /><br />＊ここがステップメールで一番大事な部分です。<br /><br /><br />以上がメール送信に関する部分です。<br /><br /><br />次は送信されたメールが、どのように届くか見てみましょう。<br />以下は Outlook Express のようなメーラーで受信した場合です。<br /><br />(7)メールの件名に、氏名やタイトルが自動的に挿入されています。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-336.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-336-thumbnail2.gif" width="320" height="45" border="0" align="" alt="mail-336.gif" /></a><br /><br />＊もし添付ファイルを指定してあれば、添付されます。<br /><br /><br />各メールを開いて、中を詳しく確認してみます。<br /><br />(8)メール本文に氏名が自動的に挿入されています。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-337.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-337-thumbnail2.gif" width="320" height="183" border="0" align="" alt="mail-337.gif" /></a><br /><br /><br />(9)共通するヘッダー部分です。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-343.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-343-thumbnail2.gif" width="320" height="182" border="0" align="" alt="mail-343.gif" /></a><br /><br /><br />(10)テキストファイルから読み込んだ文章が、メール本文に挿入されています。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-339.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-339-thumbnail2.gif" width="320" height="189" border="0" align="" alt="mail-339.gif" /></a><br /><br />宛先のステップごとにメールの本文がちゃんと変わります。<br /><br /><br />(11)共通するフッター部分もちゃんとあります。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-340.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-340-thumbnail2.gif" width="320" height="132" border="0" align="" alt="mail-340.gif" /></a><br /><br /><br />(12)正常に送信が完了すると、ワークシート「送信」のステップ(C列)が、自動的にカウントアップします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-341.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-341-thumbnail2.gif" width="320" height="68" border="0" align="" alt="mail-341.gif" /></a><br /><br />ただし、最大ステップを超えないようにします。<br /><br /><br />【課題の手順】<br />プログラミングの手順は、「メール送受信.xls」の場合とほとんど同じです。したがってメール送信の復習を兼ねています。<br /><br />課題は、以下の順番で行なってください。<br />・「ステップメール.xls」を開く　＊マクロを有効にする<br />・VBEを起動する　「Altキー」＋「F11キー」<br />・「cmd送信」クリック時のプログラムを、一部変更する<br />・動作確認<br /><br /><br />以上の図と説明を見ただけで、ステップメールの課題を作成できれば、かなりプログラミングが上達しています。<br /><br />まずは自力で挑戦してみてください。もし出来なくても、自分の頭で考えてみることが大切です。<br /><br />ステップごとに挿入する「文章とタイトルをどう扱うか」というのがポイントです。<br /><br />次回にヒントを掲載します。<br /><br /><br />【補足】<br />今回の課題では、ステップごとの時間間隔までは考慮していません。<br /><br />通常、ステップメールでは、次のステップを送信するまでの時間間隔(1日後、3日後、7日後など)を設定できるものがあります。<br /><br />でもそこまでの機能を加えると、プログラムが複雑になるので、課題としては難しいと思い、今回は省きました。<br /><br />したがって、ユーザーが送信作業を行なう間隔が、そのままメール送信間隔になります。<br /><br />また、ユーザーが「メール送信」ボタンをクリックする度に、ステップが更新されるシンプルな仕組みにします。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/130623078.html">
<link>http://mailpg.pgtop.net/article/130623078.html</link>
<title>ステップメールのプログラムを作成するために、ユーザーフォームの準備をする。</title>
<description>ステップメールの課題の前に、Excelのユーザーフォーム「frm送信」に、ラベルとテキストボックスを追加します。追加するのは、ステップメールの「最大ステップ」を入力するための部品です。例えば、最大ステップのテキストボックスに 10 を指定した時は、11以上のステップにはならないように制御することができます。【1】Excelのファイル「ステップメール.xls」を開きます。＊マクロを有効にする【2】VBEを起動します。＊「Altキー」＋「F11キー」【3】フォーム「frm送信」に...</description>
<dc:subject>Step54・ステップメール作成準備3</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2009-10-19T06:17:13+09:00</dc:date>
<content:encoded><![CDATA[
<strong>ステップメール</strong>の課題の前に、<strong>Excel</strong>のユーザーフォーム「frm送信」に、ラベルとテキストボックスを追加します。<br /><br />追加するのは、ステップメールの「最大ステップ」を入力するための部品です。<br /><br />例えば、最大ステップのテキストボックスに 10 を指定した時は、11以上のステップにはならないように制御することができます。<br /><br />【1】Excelのファイル「ステップメール.xls」を開きます。<br /><br />＊マクロを有効にする<br /><br /><br />【2】VBEを起動します。<br /><br />＊「Altキー」＋「F11キー」<br /><br /><br />【3】フォーム「frm送信」にラベルとテキストボックスを追加します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-329.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-329-thumbnail2.gif" width="287" height="320" border="0" align="" alt="mail-329.gif" /></a><br /><br />追加した部品のプロパティは、以下のように設定してください。<br />・テキストボックス<br />オブジェクト名　txtMaxStep<br /><br />・ラベル<br />オブジェクト名　変更しない<br />Caption　最大ステップ<br /><br />これでフォーム「frm送信」側の準備は、完了です。<br /><br /><br />ついでに以下の手順も行なってください。<br /><br />【4】フォーム「frm受信」は、ステップメールでは使わないので、削除しましょう。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-325.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-325-thumbnail2.gif" width="320" height="277" border="0" align="" alt="mail-325.gif" /></a><br /><br /><br />Excelのユーザーフォームの削除は独特で、「解放」することによって行ないます。<br /><br />【5】「frm受信」をマウスで右クリックし、コンテキストメニューから、「frm受信 の解放」を選択します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-326.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-326-thumbnail2.gif" width="263" height="320" border="0" align="" alt="mail-326.gif" /></a><br /><br /><br />【6】以下のようなメッセージが表示されたら、「いいえ」をクリックします。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-327.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-327-thumbnail2.gif" width="320" height="113" border="0" align="" alt="mail-327.gif" /></a><br /><br />実はユーザーフォームは、エクスポートやインポートすることができます。<br /><br />このメッセージは、ユーザーフォームを削除(解放)する前に、エクスポートしてファイルに保存しておきますか？という意味です。<br /><br />エクスポートしておけば、復元したり、他のExcelにインポートして使うことも可能です。<br /><br />エクスポートやインポートは、標準モジュールの場合も同様です。<br /><br /><br />【7】フォーム「frm受信」が解放され、消えました。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-328.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-328-thumbnail2.gif" width="320" height="288" border="0" align="" alt="mail-328.gif" /></a><br /><br /><br />【8】最後にワークシート「文章」のC列の見出しを、「件名」から「タイトル」に変更します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-324.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-324-thumbnail2.gif" width="320" height="98" border="0" align="" alt="mail-324.gif" /></a><br /><br />変更するのは、ユーザーフォーム「frm送信」側でも「件名」というラベル表示を使っているため、プログラムを書く時に紛らわしいからです。<br /><br />そこで、タイトルという見出しに変更することにしました。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/130226196.html">
<link>http://mailpg.pgtop.net/article/130226196.html</link>
<title>テキストファイルを読み込むプログラムの動作確認を行なう。</title>
<description>ステップメールで送信する文章を、テキストファイルから読み込むために、ユーザー定義関数を作成しました。今回は、そのVBAプログラムの動作確認を行なう方法について、詳しく説明します。標準モジュールに書いたプログラムを呼び出して実行するには、いくつか方法があります。1.VBAのプログラム内から呼び出して使う。2.VBEのイミディエイトウィンドウで実行する。3.Excelのワークシート上で関数として使う。1については、課題でも登場するので、軽く説明する程度にして、今回は2と3に重点を...</description>
<dc:subject>Step53・ユーザー定義関数の動作確認</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2009-10-14T07:59:26+09:00</dc:date>
<content:encoded><![CDATA[
<strong>ステップメール</strong>で<strong>送信</strong>する文章を、テキストファイルから読み込むために、ユーザー定義関数を作成しました。<br /><br />今回は、そのVBAプログラムの動作確認を行なう方法について、詳しく説明します。<br /><br />標準モジュールに書いたプログラムを呼び出して実行するには、いくつか方法があります。<br />1.VBAのプログラム内から呼び出して使う。<br />2.VBEのイミディエイトウィンドウで実行する。<br />3.Excelのワークシート上で関数として使う。<br /><br />1については、課題でも登場するので、軽く説明する程度にして、今回は2と3に重点を置いて解説します。<br /><br />【1.VBAのプログラム内から呼び出して使う。】<br />基本的には、以下のような使い方になります。<br /><div class="pg"><br />Dim filePath As String<br />Dim tmpText As String<br />filePath = "C:\mailPG\Text\step1.txt"<br />tmpText = readTextFile(filePath)<br />Debug.Print tmpText<br /></div><br />＊「\」はWindowsでは円記号のことです。<br /><br />ユーザー定義関数のreadTextFileは、引数にテキストファイルのフルパスを指定すると、内容を読み込んで、戻り値として文字列を返します。<br /><br />Functionプロシージャ側の定義<br /><div class="pg"><br />Public Function readTextFile(filePath As String) As String<br />&nbsp;&nbsp;省略<br />&nbsp;&nbsp;readTextFile = str<br />End Function<br /></div><br /><br />そこで変数tmpTextで、戻り値を受け取っています。データ型も文字列型で同じにしています。<br /><br />あとは変数tmpTextをプログラムの中で利用できます。<br /><br />変数filePathに代入するフルパスの値を変えれば、別のファイルも読み込めます。<br /><br />ただしテキスト形式のファイルに限ります。テキスト形式ならHTMLタグでも大丈夫です。<br /><br />上の使用例では、確認のため、「Debug.Print」でイミディエイトウィンドウに表示していますが、これは無くてもかまいません。<br /><br /><br />【2.VBEのイミディエイトウィンドウで実行する。】<br />標準モジュールに書いたプログラムを一番簡単にテストできるのが、この方法です。<br /><br />(1)イミディエイトウィンドウに以下のように入力し、「Enterキー」で実行してください。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-316.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-316-thumbnail2.gif" width="320" height="89" border="0" align="" alt="mail-316.gif" /></a><br /><br /><div class="pg"><br />?readTextFile("C:\mailPG\Text\step1.txt")<br /></div><br />この関数の引数は、文字列型で定義しているので、ファイルのフルパスを「"」(ダブルクォーテーション)で囲っている点に注意してください。<br /><br />また先頭の「?」(クエスチョンマーク)を忘れないようにしてください。<br /><br />イミディエイトウィンドウでは、「?」の後に指定した「関数の戻り値」や、「変数の値」を表示する仕組みになっているからです。<br /><br /><br />(2)イミディエイトウィンドウにテキストファイルの内容が表示されました。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-318.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-318-thumbnail2.gif" width="320" height="93" border="0" align="" alt="mail-318.gif" /></a><br /><br /><br />もしイミディエイトウィンドウが表示されていない場合は、以下の手順で表示できます。<br /><br />VBEのメニューから「表示 → イミディエイトウィンドウ」<br /><a href="http://mailpg.up.seesaa.net/image/mail-317.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-317-thumbnail2.gif" width="320" height="305" border="0" align="" alt="mail-317.gif" /></a><br /><br /><br />【3.Excelのワークシート上で関数として使う。】<br />実はユーザー定義関数は、Excelにあらかじめ用意されている標準の関数と同じように、ワークシート上でも使うことができます。<br /><br />(1)動作確認のため、新しいワークシートを挿入します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-319.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-319-thumbnail2.gif" width="262" height="320" border="0" align="" alt="mail-319.gif" /></a><br /><br /><br />(2)例えば、「A1」セルの計算式に、以下のように入力します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-320.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-320-thumbnail2.gif" width="320" height="200" border="0" align="" alt="mail-320.gif" /></a><br /><br /><div class="pg"><br />=readTextFile("C:\mailPG\Text\step1.txt")<br /></div><br />先頭の「=」(イコール)を忘れないようにしてください。<br /><br />ワークシート上では、セルに計算式を設定する場合は、「=」を付ける仕組みになっています。<br /><br /><br />(3)テキストファイルの内容が表示されました。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-321.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-321-thumbnail2.gif" width="320" height="240" border="0" align="" alt="mail-321.gif" /></a><br /><br />でも横長で見難いですよね。<br /><br /><br />(4)「A1」で「セルの書式設定」を変えると、以下のように見やすくなります。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-322.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-322-thumbnail2.gif" width="320" height="313" border="0" align="" alt="mail-322.gif" /></a><br /><br />セルの書式設定<br />・配置タブ　縦位置　上詰め<br />・配置タブ　文字の制御　折り返して全体を表示する<br /><br /><br />(5)動作確認が済んだら、テストで使用したワークシートは、削除してください。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-323.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-323-thumbnail2.gif" width="289" height="93" border="0" align="" alt="mail-323.gif" /></a><br /><br /><br />(6)今回は動作テストなので、Excelファイルの変更点を保存する必要はありません。<br /><br />以上のように、ユーザー定義関数を作れるようになると、Excelのワークシート上で出来ることが広がります。<br /><br /><br />【補講】<br />ここで重要なポイントは、簡単な関数名と引数を指定するだけで、複雑な処理を行ない、その結果を得られることです。<br /><br />今回は十数行程度の短いプログラムでしたが、数百行、数千行に及ぶ複雑なプログラムの結果を得ることも可能です。<br /><br />それをたった1行の関数の呼び出しだけで行なえるのです。このようなことが、ユーザー定義関数を作るメリットです。<br /><br />既存の関数や制御文、変数、定数などを上手く組み合わせて、いかに新しいユーザー定義関数を作り、便利にできるかというのが、プログラマーの腕の見せ所です。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/130150664.html">
<link>http://mailpg.pgtop.net/article/130150664.html</link>
<title>ステップメールで送信する文章を、テキストファイルから読み込む方法について。</title>
<description>ステップメールで送信する文章は、テキストファイル形式で保存・編集する仕組みにしました。また文章は、メールに添付するのではなく、メール本文中に挿入することにします。そのためには、テキストファイルを読み込む(データを取り出す)プログラムが必要なので、作成しましょう。VBAでは、標準で用意された関数以外にも、ユーザーが独自に関数を作ることができます。それを「ユーザー定義関数」と言います。今回は、「標準モジュール」にユーザー定義関数のプログラムを書きます。標準モジュールで作成したユー...</description>
<dc:subject>Step52・テキストファイルを読み込む</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2009-10-13T07:57:11+09:00</dc:date>
<content:encoded><![CDATA[
<strong>ステップメール</strong>で<strong>送信</strong>する文章は、テキストファイル形式で保存・編集する仕組みにしました。<br /><br />また文章は、メールに添付するのではなく、メール本文中に挿入することにします。<br /><br />そのためには、テキストファイルを読み込む(データを取り出す)プログラムが必要なので、作成しましょう。<br /><br />VBAでは、標準で用意された関数以外にも、ユーザーが独自に関数を作ることができます。それを「ユーザー定義関数」と言います。<br /><br />今回は、「標準モジュール」にユーザー定義関数のプログラムを書きます。<br /><br />標準モジュールで作成したユーザー定義関数は、VBAプログラムの中だけでなく、 <strong>Excel</strong>のワークシート上でも呼び出して使うことができるので、とても便利です。<br /><br />この方法を覚えておけば、Excelの活用範囲が大きく広がります。<br /><br />【1】Excelのファイル「ステップメール.xls」を開きます。<br /><br />＊マクロを有効にする<br /><br /><br />【2】VBEを起動します。<br /><br />＊「Altキー」＋「F11キー」<br /><br /><br />【3】プロジェクト エクスプローラに「標準モジュール」が表示されているか確認します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-310.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-310-thumbnail2.gif" width="306" height="320" border="0" align="" alt="mail-310.gif" /></a><br /><br /><br />まだ標準モジュールが無い場合は、追加します。<br /><br />【4】VBEのメニューから、「挿入 → 標準モジュール」を選択します。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-312.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-312-thumbnail2.gif" width="320" height="236" border="0" align="" alt="mail-312.gif" /></a><br /><br /><br />【5】追加された標準モジュールを確認してみましょう。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-313.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-313-thumbnail2.gif" width="320" height="186" border="0" align="" alt="mail-313.gif" /></a><br /><br />①プロジェクト エクスプローラに標準モジュールが表示されました。<br />②標準モジュールには、「コードの表示」しかありません。<br />③標準モジュールのプログラムを入力する画面です。<br />④プロパティで「Module1」が選択されています。<br />⑤標準モジュールのプロパティは、「オブジェクト名」だけなのが特徴です。<br /><br />オブジェクト名を変えることも出来ますが、今回はそのまま「Module1」にします。<br /><br /><br />【6】標準モジュールで、以下のようにプログラムを入力してください。<br /><br /><a href="http://mailpg.up.seesaa.net/image/mail-315.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-315-thumbnail2.gif" width="320" height="188" border="0" align="" alt="mail-315.gif" /></a><br /><br /><div class="pg"><br />Public Function readTextFile(filePath As String) As String<br />&nbsp;&nbsp;Dim fileNo As Integer<br />&nbsp;&nbsp;Dim line As String<br />&nbsp;&nbsp;Dim str As String<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;fileNo = FreeFile<br />&nbsp;&nbsp;Open filePath For Input As #fileNo<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Do Until EOF(fileNo)<br />&nbsp;&nbsp;&nbsp;&nbsp;Input #fileNo, line<br />&nbsp;&nbsp;&nbsp;&nbsp;str = str &amp; line &amp; vbCrLf<br />&nbsp;&nbsp;Loop<br /><br />&nbsp;&nbsp;Close #fileNo<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;readTextFile = str<br />&nbsp;&nbsp;<br />End Function<br /></div><br />＊Functionになっている点に注意<br /><br /><br />【7】ここまでの作業を「保存」してください。<br /><br /><br />今回作成した Functionプロシージャの動作確認は、次回のステップで説明します。<br /><br /><br />【解説】<br />(1)標準モジュールについて<br />標準モジュールに書いたプログラムは、そのExcelファイル内で、共通して利用することができます。<br /><br />例えば、VBAのプログラム内、イミディエイトウィンドウ、Excelのワークシート上で呼び出して実行することが可能です。<br /><br />ただし定義した同じファイル内に限られます。他のExcelファイルには影響しません。<br /><br /><br />(2)Functionプロシージャの基本<br /><div class="pg"><br />Public Function readTextFile(filePath As String) As String<br />&nbsp;&nbsp;省略<br />&nbsp;&nbsp;readTextFile = str<br />End Function<br /></div><br />・Publicとは「公の」という意味を表すキーワードです。<br />・Publicで宣言したユーザー定義関数は、どこからでも呼び出して使えます。<br />・Functionプロシージャは、「Function」で始まり、「End Function」で終了します。<br />・関数名は、自由に付けることができます。働きがわかりやすい名前が良いでしょう。<br />例　readTextFile<br />・Functionプロシージャは、引数を受け取ることが出来ます。<br />例　readTextFile(filePath As String)<br />「,」(カンマ)で区切れば、複数の引数を受け取れます。<br />filePathは、関数内だけで有効な変数です。<br />関数を呼び出す時の引数と、受け取る関数の引数のデータ型は一致させる必要があります。<br />・Functionプロシージャは、戻り値を返すことができます。今回はString型です。<br />例　readTextFile(filePath As String) As String<br />・戻り値を返すには、関数名と同じ名前に代入します。<br />readTextFile = str<br /><br /><br />(3)変数を宣言している部分です。<br /><div class="pg"><br />Dim fileNo As Integer<br />Dim line As String<br />Dim str As String<br /></div><br />・fileNo　ファイル番号を格納する変数<br />・line　テキストファイルの1行分のデータを格納する変数<br />・str　複数行のデータを結合するための変数<br /><br /><br />(4)FreeFile 関数を使って、空いているファイル番号を取得している部分です。<br /><div class="pg"><br />fileNo = FreeFile<br /></div><br />ファイルは、このファイル番号を使って操作します。<br /><br /><br />(5)Openステートメントでファイルを開きます。<br /><div class="pg"><br />Open filePath For Input As #fileNo<br /></div><br />filePathは関数の引数で、ファイル名がフルパスで代入されています。<br />例　C:\mailPG\Text\step1.txt<br />＊「\」はWindowsでは円記号のことです。<br />＊ここでのInputは、ファイル モードを示します。<br /><br /><br />(6)データを取り出している部分です。<br /><div class="pg"><br />Do Until EOF(fileNo)<br />&nbsp;&nbsp;Input #fileNo, line<br />&nbsp;&nbsp;str = str &amp; line &amp; vbCrLf<br />Loop<br /></div><br />「Do Loop」という制御文を使って、ファイルの終端(EOF)になるまで(Until)、1行ずつデータを取り出します。<br /><br />ここでのInputは、ステートメントです。ファイルからデータを読み込んで、変数に格納する働きがあります。<br /><br />変数lineには、1行分のデータが入っています。<br /><br />でもそのままだと、制御文で処理を繰り返す時に、次のデータで上書きされてしまいます。そこで変数strを使って、文字列を連結し、一時的に保存しています。<br /><br />ここで大事なポイントは、「vbCrLf」で改行していることです。vbCrLfは、VBAであらかじめ定義されている定数で、改行を意味します。<br /><br />正確には、キャリッジリターン(Cr)とラインフィード(Lf)の組み合わせです。<br /><br />実は変数lineに代入された文字列には、改行が含まれていません。改行自体を1行の区切りとしているためです。<br /><br />したがって vbCrLf がないと、文章が改行されずに、1行になってしまうので、注意してください。<br /><br /><br />(7)ファイルを閉じている部分です。<br /><div class="pg"><br />Close #fileNo<br /></div><br />使い終わったファイルは閉じて、メモリーを解放します。<br /><br /><br />(8)Functionプロシージャが返す「戻り値」を指定している部分です。<br /><div class="pg"><br />readTextFile = str<br /></div><br />変数strには、テキストファイルの内容が、改行を含めて代入されています。<br /><br /><br />以上がVBAプログラムで、テキストファイルを読み込む仕組みです。<br /><br />もし難しく感じる場合は、プログラムをそのまま書くだけでも結構です。関数は使い方さえわかれば、利用することができます。<br /><br />もちろん理解できたほうが、あなた自身でもユーザー定義関数を作れるのでよいのですが。<br /><br /><br />【補足】<br />今回のプログラムは、処理をわかりやすくするために、あえてエラー処理を省略しました。テキストファイルを読み込むプログラムに集中して欲しかったからです。<br /><br />そのため、引数に指定するファイルが実在することが、正しく動作する条件です。<br /><br />本来はちゃんとエラー処理を書いたほうが、安定したプログラムになります。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
</rdf:RDF>

