三流解説 VBA Outlook 登録されたアドレス 複数へ メールを送信する 05-11

Excel の シート に 名前とメールアドレスを登録し、
メールを送信する、そんなサンプルです。
サンプルの狙いは、Excel VBA で Outlookのメール作成です。

サンプルファイルは[Excel_Outlook_TEST20090511.zip]です。
ダウンロードして動かしてみてください。

簡単に設計してみた。

簡単な基本設計・詳細設計から、作成を始める
まぁ、いろいろ と あるけど、手抜きのラフな設計で(おぃおぃ)

基本設計・要求仕様書

基本設計、要求仕様がブレていると、完成したシステムの着地点がかなりずれるので重要です。
と、言ってるそばから、2・3行、箇条書きにしただけの 基本設計です。

システム概要・システム化の目的
案内文や定期文章のメール送信作業を軽減したい。
複数の宛先へ 同じ文章を送りたい。

要求仕様書 -- やりたいこと システムにさせたいこと 求めいてる結果は?
1.送信先を管理したい
主な送信先を事前に登録しておき、メール作成時に使用したい。
まぁ、いろいろと続くんだけど。。。
2.メールの本文を作成したい
送るメールの本文を作成し、メールを作成する。
3.送信する宛先を指定したい
必ず全てに送らないで、
今回だけ外す や 今回はここだけに送りたい・・・
※早い話、毎回すべてじゃなくて、送信先を選択できるようにしてほしい。

詳細設計

基本設計をカバーする、詳細設計をしないと・・と思いつつ、
詳細設計も かなり 簡単にしました。(ハードコピー と 簡単な説明だけ・・・)

画面イメージ
1.宛先マスター(シート)

[メール作成ボタン] ・・ 押されたらメールを作成する。

10行目から マスターデータをシートに書き込む
A列 B列 C列
宛先 メールアドレス 送信有無のフラグ

2. 送信文章 (シート)


A7にメールの件名

A列、10行目から本文を書き込む。

機能別 詳細設計

1.送信先を管理したい	
	ユーザーが宛先マスター シートに随時登録する

2.メールの本文を作成したい	
	ユーザーが 送信文章シートに
	 件名
	 本文 
	を 登録する。

3.送信する宛先を指定したい	
	送信先を選択するには、宛先マスター シートの C列に 1を入れる。
	1を入力後、メール作成ボタンを押す。

まぁ、今回は、ボタンが1つしかないので、さびしいけど

メール作成ボタン
Outlook を 起動してメールを作成する。
作成条件は
  C列が1のデータを作成する。
  メールアドレス .TO に B列のアドレスをセットする
  件名に 送信文章シートのA7の件名をセットする
  本文は、送信文章シートのA10から ”↑ここまで” を つなげ、セットする。

コードの作成開始

関数分割もなく、泥縄式にクソコードを書いていきます。
まぁ、箇条書き ぐらいは、しますか(設計書もどきからコピーして、頭に書く・コメントにする。)

Sub MAIL_MAKE_0511()

'メール作成ボタン
'    Outlook を 起動してメールを作成する。
'    作成条件は
'      C列が1のデータを作成する。
'      メールアドレス .TO に B列のアドレスをセットする
'      件名に 送信文章シートのA7の件名をセットする
'      本文は、送信文章シートのA10から ”↑ここまで” を つなげ、セットする。

End Sub

件名の代入 と 本文を作る。

まずは、件名 と 送信する本文を作ります。(あとで作ってもいいけど)
Sub MAIL_MAKE_0511() 'メール作成ボタン

    Dim strTITLE  As String  'メールの件名、タイトル。
    Dim strDOC    As String  '送信する文章
    Dim strWORK   As String  '一時変数
    Dim yLINE     As Integer 'Y行目のカウント
    
    strTITLE = Trim(Sheets("送信文章").Range("A7")) '隣の送信文章のA7セルを代入
    
    '本文を作る
    strDOC = ""  '初期化する
    For yLINE = 10 To 999   '10行目から最大999行まで
        strWORK = Sheets("送信文章").Cells(yLINE, "A")  'A列のY行目の文字を取り出す
        If strWORK = "↑ここまで" Then Exit For  '↑ここまで だったら ループを抜ける
        strDOC = strDOC & strWORK & vbCrLf  '1行、文字を追加する
    Next yLINE
    Debug.Print "作られた本文は:[" & strDOC & "]です。" & vbCrLf & vbCrLf
    

'    Outlook を 起動してメールを作成する。
'    作成条件は
'      C列が1のデータを作成する。
'      メールアドレス .TO に B列のアドレスをセットする
'      件名に 送信文章シートのA7の件名をセットする
'      本文は、送信文章シートのA10から ”↑ここまで” を つなげ、セットする。

End Sub

ループで単純にまわして、
strDOC = strDOC & strWORK & vbCrLf '1行、文字を追加する
で作成。
終了の判断は、
If strWORK = "↑ここまで" Then Exit For '↑ここまで だったら ループを抜ける
で行いました。

件名の代入 と 本文を作る。(変数を作成する)

Excel VBA から Outlook を 起動する

次は、Outlookを起動してみたいと思います

'    Outlook を 起動

    Dim oApp As Object        'OutlookのApplication オブジェクトを入れる
    Dim myNameSpace As Object '名前のスペースと言われても、、
    Dim myFolder As Object    'フォルダー指定

    'outlook 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を
    Set oApp = CreateObject("Outlook.Application")

    '呪文1 名前空間 の 指定 と言っても、.GetNamespace("MAPI")しただけ
    Set myNameSpace = oApp.GetNamespace("MAPI")
    
    '次は作業フォルダーの指定(.GetDefaultFolder) と 表示(.Display)
    Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
    myFolder.Display  '表示 いつものクセで .Visible = True とやりがちだけど

CreateObject("Outlook.Application")で、無事に起動することができ、

Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
myFolder.Display で、デフォルトの受信トレイを表示できます。

Excel2003 VBA から Outlookを起動

↑三流解説 [え〜と] And [こんな感じ] を連発(笑)した動画。

C列が1か判断してメールの作成

Outlook が 無事に起動できたので、
If Cells(yLINE, "C") = 1 Then で 作成の判断を行い、
メールを作成 Set objMAIL = oApp.CreateItem(0) して
件名、宛先、本文のセットは、
objMAIL.To = strEMAIL '.TO 宛先をセットする
objMAIL.Subject = strTITLE '.Subject 件名
objMAIL.Body = strDOC '.Body 本文の代入
でセットしてみます。
Sub MAIL_MAKE_0511() 'メール作成ボタン

'作成開始の確認
    If MsgBox("メールを作成します、よろしいですか?", vbYesNo, "確認") = vbNo Then
        Exit Sub   'vbNo いいえ だったら、関数をすぐに抜ける。
    End If

'件名に 送信文章シートのA7の件名をセットする
    Dim strTITLE  As String  'メールの件名、タイトル。
    strTITLE = Trim(Sheets("送信文章").Range("A7")) '隣の送信文章のA7セルを代入

'本文は、送信文章シートのA10から ”↑ここまで” を つなげ、セットする。
    Dim strDOC    As String  '送信する文章
    Dim strWORK   As String  '一時変数
    Dim yLINE     As Integer 'Y行目のカウント
    '本文を作る
    strDOC = ""  '初期化する
    For yLINE = 10 To 999   '10行目から最大999行まで
        strWORK = Sheets("送信文章").Cells(yLINE, "A")  'A列のY行目の文字を取り出す
        If strWORK = "↑ここまで" Then Exit For  '↑ここまで だったら ループを抜ける
        strDOC = strDOC & strWORK & vbCrLf  '1行、文字を追加する
    Next yLINE
    Debug.Print "作られた本文は:[" & strDOC & "]です。" & vbCrLf & vbCrLf

'    Outlook を 起動
    Dim oApp As Object        'OutlookのApplication オブジェクトを入れる
    Dim myNameSpace As Object '名前のスペースと言われても、、
    Dim myFolder As Object    'フォルダー指定

    'outlook 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を
    Set oApp = CreateObject("Outlook.Application")

    '呪文1 名前空間 の 指定 と言っても、.GetNamespace("MAPI")しただけ
    Set myNameSpace = oApp.GetNamespace("MAPI")
    
    '次は作業フォルダーの指定(.GetDefaultFolder) と 表示(.Display)
    Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定
    myFolder.Display  '表示 いつものクセで .Visible = True とやりがちだけど

'メールを作成する。
'    作成条件は
'      C列が1のデータを作成する。
'      メールアドレス .TO に B列のアドレスをセットする
    Dim objMAIL  As Object   'MAILアイテムを操作するオブジェクト
    Dim strEMAIL As String   '送信先のメールアドレス

    For yLINE = 10 To 999  '10行目からループを開始する
        strEMAIL = Trim(Cells(yLINE, "B"))  'B列をアドレスとして代入する。
        '終了の判断
        If strEMAIL = "" Then Exit For  'メールアドレスが空なら、ループを抜ける。
        
        'メールの作成確認 C列が1か判断する。
        If Cells(yLINE, "C") = 1 Then
    
            'メールアイテムの作成
            Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、
            objMAIL.Display   '画面表示(Mail入力、編集画面を表示)
        
            '宛先・件名・本文 などのデータを代入する
            objMAIL.To = strEMAIL      '.TO 宛先をセットする
            objMAIL.Subject = strTITLE '.Subject 件名
            objMAIL.Body = strDOC      '.Body 本文の代入
    
            objMAIL.Save               '保存する、下書きへ保存です。
            
            Set objMAIL = Nothing      '開きっぱなしで、そのまま、次のメールを処理する。
        End If

    Next yLINE

    MsgBox "メール 下書き 作成終了" & vbCrLf & "確認後、手動で送信してください。"

End Sub

C列が1か判断してメールの作成 VBA Outlook Create MailITEM .Save

終わりの挨拶

まだまだ、改善点が多数存在しますが、たたき台として使ってみてください。
何かの参考となれば、幸いです。

サンプルファイルは[Excel_Outlook_TEST20090511.zip]です。
ダウンロードして動かしてみてください。


ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[Outlook三流解説のトップページへ 戻る] / [Outlook三流サンプル一覧へ 戻る]

[三流君 VBAでアウトルック Mailの操作] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [サンプル一覧へ 戻る]