<?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="https://blog.seesaa.jp/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/445854307.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/432478142.html" />
<rdf:li rdf:resource="http://mailpg.pgtop.net/article/411406486.html" />
<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:Seq>
</items>
</channel>

<item rdf:about="http://mailpg.pgtop.net/article/445854307.html">
<link>http://mailpg.pgtop.net/article/445854307.html</link>
<title>いろんなプログラムからメール送受信に使えるBASP21について。</title>
<description>Excelでメールを送受信するVBAプログラムは、汎用コンポーネントのBASP21を使っています。実はBASP21は優れもので、EXCELのVBAだけではなく、VBScriptやWSH(Windows Scripting Host)など、他のプログラミング言語からも利用することができます。もちろんVBAを使えるAccessや、より高機能なVB(Visual Basic)からも使えます。その中でも、Windowsパソコンで一番簡単なのは、VBScriptかWSHでしょうね。特に..</description>
<dc:subject>いろんなプログラムから使えるBASP21</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2017-01-12T16:30:53+09:00</dc:date>
<content:encoded><![CDATA[
Excelで<strong>メール</strong>を<strong>送受信</strong>するVBAプログラムは、<br />汎用コンポーネントのBASP21を使っています。<br /><br />実はBASP21は優れもので、EXCELのVBAだけではなく、<br /><br />VBScriptやWSH(Windows Scripting Host)など、他のプログラミング言語からも利用することができます。<br /><br />もちろんVBAを使えるAccessや、より高機能なVB(Visual Basic)からも使えます。<br /><br />その中でも、Windowsパソコンで一番簡単なのは、VBScriptかWSHでしょうね。<br /><br />特にソフトウェアを用意することなく、<br />買ったばかりのパソコンでも、すぐに実行できますから。<br /><br />プログラムもメモ帳のようなテキストエディタがあれば作成できるし、<br /><br />プログラムの実行も、ファイルをダブルクリックするだけです。<br /><br />例えば、VBScriptでプログラムを作成するなら、<br />まずテキストエディタでプログラムを書きます。<br /><br />プログラム自体は、ほとんどVBAと同じ書き方です。<br />構文や関数などほぼ同じ。<br /><br />あとは保存する時にファイルの拡張子を「.vbs」にするだけ。<br /><br />そして拡張子「.vbs」のファイルをダブルクリックすると、<br />プログラムが実行されますよ。<br /><br />簡単ですよね。実にシンプルです。<br /><br />私はこの手軽さが大好きですｗ<br /><br />プログラムから簡単なメールを送信したり、<br />受信したメールをテキストファイルで読む程度なら、<br /><br />VBScriptでも十分に開発することができます。<br /><br />プログラムの中に文章とメルアドを直接書いておき、<br />ダブルクリックするだけで送信！みたいな使い方。<br /><br />また、Accessのようなデータベースを使うメリットは、<br />テーブルに保存したデータを利用して、<br /><br />個別に内容を変えたメールを送信したり、<br />クエリを使っていろんな条件で絞り込んだリストにメールを送れることです。<br /><br />メールの受信でもメリットがあります。<br /><br />VBAでメールの内容を取り出したり、抽出したり、<br />SQL文を使って各テーブルにデータを分けて保存することができます。<br /><br />Accessを窓口として、より本格的なデータベースに保存することも可能です。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/432478142.html">
<link>http://mailpg.pgtop.net/article/432478142.html</link>
<title>ExcelVBAでメールを受信するプログラムは2段階処理が必要。</title>
<description>Excelでメールを受信するVBAプログラムは、手順が2段階になります。実際にプログラミングする前に、概要を説明しておきます。ExcelのVBAからも利用できるコンポーネントのBASP21では、メールの送受信に関するメソッドが2つあります。それはRcvMail(メール受信)とReadMail(メール読込み)です。まずRcvMailメソッドは、POP3プロトコルでメールを受信することができます。メールサーバーからメールを受信して、パソコン内の指定したフォルダに、テキスト形式で保..</description>
<dc:subject>Step3・メール受信プログラムは2段階で</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2016-01-12T19:46:59+09:00</dc:date>
<content:encoded><![CDATA[
Excelで<strong>メール</strong>を<strong>受信</strong>するVBAプログラムは、手順が2段階になります。<br /><br />実際にプログラミングする前に、概要を説明しておきます。<br /><br />ExcelのVBAからも利用できるコンポーネントのBASP21では、<br />メールの送受信に関するメソッドが2つあります。<br /><br />それはRcvMail(メール受信)とReadMail(メール読込み)です。<br /><br />まずRcvMailメソッドは、POP3プロトコルでメールを受信することができます。<br /><br />メールサーバーからメールを受信して、<br />パソコン内の指定したフォルダに、テキスト形式で保存します。<br /><br />どのフォルダに保存するかは、ディレクトリ名を指定することで、簡単に設定できます。<br /><br />フォルダ内にはメール1件につき、1つのテキストファイルが作成されます。<br /><br />またRcvMailには、様々な引数が用意されています。<br />RcvMail(svname,user,pass,command,dirname)<br /><br />これらの引数を指定することで、メール受信に関する細かい設定が可能です。<br /><br />例えば、メール数を調べたり、一度の受信数を制限したり、<br />メールサーバーのメールを削除するか残すかなどの設定もできます。<br /><br />件名や送信者を調べることも可能です。<br /><br />ということは、特定の送信者からのメールだけを選別して受信することもできるのです。<br /><br />だからちょっと工夫することで、スパムメール、迷惑メールは100％防げますよ。<br /><br />これがメール受信プログラムを、わざわざ独自に作る大きなメリットなのです。<br /><br />次にReadMailメソッドで、フォルダに保存されたメールの中身を読み込みます。<br /><br />受信したテキストファイルの中身には、メールの本文を含め、ヘッダーや添付ファイル名<br />などの情報が記載されています。<br /><br />これらの情報がメソッドからの戻り値として、配列で返されます。<br /><br />あとはプログラムの中で配列から情報を取り出して利用します。<br /><br />例えば、Excelのセルに表示したり、Accessなどのデータベースに保存することが可能です。<br /><br />データを変数の中に取り込んでしまえば、あとの加工は自由自在です。<br /><br />送信者ごとに分類したり、メール本文から特定の情報を取り出す、解析も簡単。<br /><br />アイデア次第では、メールだけでいろんなことが出来ます。<br /><br />会社の業務レポートをデータベース化したり、<br />商品の受注データを取り込めば、販売管理や顧客管理ツールなどもメールでできてしまいます。<br /><br />これが二つ目の大きなメリットになるわけです。<br /><br />ps:<br />最終的にはメールで受信すれば良いわけで、Webフォームから送ったメールでもOKなんです。<br /><br />わざわざWeb上のデータベースを使った大掛かりなショッピングカートを作らなくても、<br />既存のフォームにちょっと手を加えるだけで、ネットショップの仕組みが出来ますよ。<br /><br />具体的なメール受信プログラムについては、次回からの記事に掲載します。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://mailpg.pgtop.net/article/411406486.html">
<link>http://mailpg.pgtop.net/article/411406486.html</link>
<title>Excelでメールを受信するための準備をする。</title>
<description>Excel(エクセル)でメールを受信するプログラムを作成する前に、もう一度確認して欲しいことがあります。全てこれまでの記事に書いた事ばかりですが、とても重要なので、再度まとめておきます。この「メール送信・受信プログラミング初心者入門」を、メニューの順番通りにステップを進めていた場合は、特に問題ありません。もうすぐにExcelで受信のプログラミングが出来ます。しかし、いきなりメール受信のプログラムのステップから入っている場合は、要チェックです。(1)マイクロソフト社のExcel..</description>
<dc:subject>Step2・Excelメール受信の準備</dc:subject>
<dc:creator>メール送受信入門</dc:creator>
<dc:date>2014-12-28T14:11:56+09:00</dc:date>
<content:encoded><![CDATA[
Excel(エクセル)で<strong>メール</strong>を<strong>受信</strong>するプログラムを作成する前に、もう一度確認して欲しいことがあります。<br /><br />全てこれまでの記事に書いた事ばかりですが、<br /><br />とても重要なので、再度まとめておきます。<br /><br />この「メール送信・受信プログラミング初心者入門」を、<br /><br />メニューの順番通りにステップを進めていた場合は、特に問題ありません。<br /><br />もうすぐにExcelで受信のプログラミングが出来ます。<br /><br />しかし、いきなりメール受信のプログラムのステップから入っている場合は、<br /><br />要チェックです。<br /><br />(1)マイクロソフト社のExcelがインストールされているか、確認してください。<br />これからExcelでプログラミングするのですから、当然必要ですよね。<br /><br /><br />(2)BASP21がインストールされているか、確認してください。<br />BASP21の機能でメールの送受信を行うためです。<br /><br />まだの方は、以下の記事を参考にしてください。<br /><br />BASP21をインストールする<br /><a href="http://mailpg.pgtop.net/article/125529780.html" target="_self">メール送受信の機能を追加するため、「BASP21」をインストールする。</a><br /><br /><br />(3)受信用のReceiveフォルダがあるか、確認してください。<br /><br />手順通り進めていれば、Excelのファイル「メール送受信.xls」がある<br />「mailPG」フォルダの中に、「Receive」というフォルダが作成されているはずです。<br /><br />Step1・フォルダを作成する<br /><a href="http://mailpg.pgtop.net/article/125588809.html" target="_self">メール送受信を行なうため、プログラムを格納するフォルダを作成する。</a><br /><br /><br />(4)受信用のフォーム、ワークシートは作成しましたか？<br />受信用のフォームとワークシートは、既に以下のステップで作成済みです。<br /><br />Step7・受信フォームを作成する<br /><a href="http://mailpg.pgtop.net/article/125928386.html" target="_self">Excelでメール受信用のユーザーフォームを作成する。</a><br /><br />こんなフォームが表示されればOKです。<br /><a href="http://mailpg.up.seesaa.net/image/mail-59.gif" target="_blank"><img src="http://mailpg.up.seesaa.net/image/mail-59-thumbnail2.gif" width="320" height="231" border="0" align="" alt="mail-59.gif" /></a><br /><br />まだの方は、ステップを戻って作成してください。<br /><br /><br />(5)受信専用のメルアドを1つ準備する。<br />プログラムから直接、メールボックスを操作するので、<br />普段使っているメールアドレスだと、いろいろ不都合です。<br /><br />プログラムテスト用のメールアドレスが必要です。<br /><br />テストには不具合(バグ)がつきものです。<br /><br />何が起こるかわからないので、必ず別にメルアドを用意してください。<br /><br />詳しくは、以下の記事を参考にしてください。<br /><br />メールアドレスを準備<br /><a href="http://mailpg.pgtop.net/article/125378440.html" target="_self">メール送受信で利用するメールアドレスを用意する。</a><br /><br /><br />以上、ここまで準備出来たらOKです。<br /><br />いよいよExcelで、メールを受信するプログラミングが出来ます。<br /><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<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>
</rdf:RDF>

