[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]

三流君VBA:VBA Outlook リッチテキスト形式のメール で グラフを送る

メールの形式を指定したかったので、
objMAIL.BodyFormat = 3 'olFormatRichText=3 で リッチテキスト形式へ
とプロパティをセットして、リッチテキスト形式にしました。
次に、Excelのグラフをコピーしたかったので、
    ActiveSheet.ChartObjects("グラフ 1").Activate
    ActiveChart.ChartArea.Select
    Application.CutCopyMode = False
    ActiveChart.ChartArea.Copy
で、コピーしました(単にマクロ記録で記録しました。)

貼り付け の コマンドを実行したかったので、
Set oCBs = objMAIL.GetInspector.CommandBars
でコマンドバーを取り出し、
   Set oCtl = oCBs.FindControl(, I)
   を If oCtl.Caption = "貼り付け(&P)" で 探し、
  oCtl.Execute '↑で見つけた oCtl 貼り付けコマンド(outlook)を実行

でも、なんか動作が不安定です。。。
[サンプルファイル 20090507Outlook_Mail.zip]を解凍して動かしてください。

発行内容

VBA Outlook リッチテキスト形式のメール で グラフを送る

こんにちは。
今回は、
Outlook で RichText リッチテキスト形式のメール を 作成
そんな処理にチャレンジしてみます。

他の操作、
三流君VBAでOutlookを操作する
http://www.ken3.org/cgi-bin/group/vba_outlook.asp
↑も、あわせて 見てください。

/* * 1. 今回のキッカケ */

下記の質問をいただきました。
-----
>VBAでアウトルックを操作しているのですが
>エクセルのセルに入っている文字列をメール本文にすることや
>ファイルを添付することはできたのですが・・・・
>セルにある図やマイピクチャーにある画像ファイル(GIFやJPEG)を
>本文に差し込むにはどのようにVBAで記述すればよいのでしょうか
-----

Excelのグラフをそのまま貼り付けて送る、
そんなサンプルを作ってみたいと思います。

VBAで自動化の前に、まずは、手作業で
Outlook RichText リッチテキスト形式のメール
を作成してみます。※まず手作業 で できるか、確認する。

単純に、
ア. メールの書式・フォーマットをリッチテキストにしてから、
イ. Excel シート上のグラフをコピーして(グラフ選択後・右クリック・コピー)
ウ. メールの本文に貼り付け(編集--貼り付け)
こんな手順、順番かなぁ。
5/7 Outlook RichText リッチテキスト形式のメール : http://www.youtube.com/watch?v=ssGvAoWSsMY

/* * 2.リッチテキストのメールを作るには? */

>ア. メールの書式・フォーマットをリッチテキストにしてから、

メールの書式・フォーマットをリッチテキストにするのかぁ。
VBAで探ると、このあたり???

MailItem.BodyFormat Property
http://msdn.microsoft.com/en-us/library/bb207134.aspx

OlBodyFormat Enumeration
http://msdn.microsoft.com/en-us/library/bb208058.aspx

olFormatHTML        2 HTML format 
olFormatPlain       1 Plain format 
olFormatRichText    3 Rich text format 
olFormatUnspecified 0 Unspecified format 

んっ、どこかで見たと思ったら、

[Outlook メールアイテムの形式でハマる]
で、読者から、
>myMAIL.BodyFormat = 1 'olFormatPlain
と、教えていただいた、そのままでした。(覚えとけよ、探さなくて良かったのに)

今回は、1 の olFormatPlain テキストじゃなくて、
3 の olFormatRichText を セット(Rich text format)
に すれば、OKですね。

Sub MAKE_MAIL_ITEM_RichText() 'リッチテキストのメールを作成する。

    Dim oApp As Object
    Dim myNameSpace As Object
    Dim myFolder As Object

    Dim objMAIL As Object 'メールのオブジェクト

    'outlook 起動
    Set oApp = CreateObject("Outlook.Application")

    Set myNameSpace = oApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
    myFolder.Display  '表示 いつものクセで .Visible = True とやりがちだけど

    'メールアイテムの作成
    Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、
    objMAIL.BodyFormat = 3           'olFormatRichText=3 で リッチテキスト形式へ
    objMAIL.Display   '画面表示(Mail入力、編集画面を表示)

    '宛先・件名・本文 などのデータを代入する
    objMAIL.To = Range("B3")      '宛先 .TO  セルB3から代入
    objMAIL.CC = Range("B4")      '宛先 .CC  セルB4から代入
    objMAIL.Subject = Range("B6")   '.Subjectで件名 セルB6から代入
    
    'テストなので、 そのまま 開きっぱなし。
    'ここで、普通はオブジェクトの開放など、後始末をする。

End Sub
2009/05/07 No.183 Outlook 関係の 画像
05/07 Outlook olFormatRichText リッチテキストのメールを作るには? : http://www.youtube.com/watch?v=v7Ein7x7j3k

/* * 3.送りたいデータをコピーする Excelなら便利なマクロ記録で */

>イ. Excel シート上のグラフをコピーして(グラフ選択後・右クリック・コピー)

次は、Excelから送りたいデータをコピーします。
まぁ、簡単にマクロ記録で記録してみます。(記録後、肉付けや削る、そんな感じで。)

Sub Macro1()  'マクロ記録でグラフのコピー方法を探った。

    Range("A10:C14").Select
    Selection.Copy

    ActiveSheet.ChartObjects("グラフ 1").Activate
    ActiveChart.ChartArea.Select
    Application.CutCopyMode = False
    ActiveChart.ChartArea.Copy

    Range("A32:A42").Select
    Selection.Copy

    Range("C32").Select

End Sub
↑まぁ、こんな感じで、探ると楽なのでは???
05/07 マクロ記録でグラフのコピー方法を探った。 : http://www.youtube.com/watch?v=WYVb5m7NotY

/* * 4.Outlook の 編集・貼り付け コマンドを実行したい */

>ウ. メールの本文に貼り付け(編集--貼り付け)

Outlookのコマンドバーから 貼り付け を 選択(実行してみたいと思います)

[OL] Outlook ソリューションで CommandBars を使用する方法
http://support.microsoft.com/kb/201095/ja
の Excel ユーティリティを使用して Outlook CommandBar ID の一覧を生成する

↑を参考にして、署名を入れる、そんなテストプログラム↓を少し前に作りました。

2/2 未完成 VBA OutLook で メール本文を作成して、署名を追加するサンプル
http://ken3-info.blog.ocn.ne.jp/day/2009/02/22_vba_outlook_4a33.html

Sub MAKE_MAIL_ITEM222()

    Dim oApp As Object
    Dim myNameSpace As Object
    Dim myFolder As Object

    Dim objMAIL As Object 'メールのオブジェクト
    Dim strMOJI As String '本文

    'outlook 起動
    Set oApp = CreateObject("Outlook.Application")

    Set myNameSpace = oApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
    myFolder.Display  '表示 いつものクセで .Visible = True とやりがちだけど

    'メールアイテムの作成
    Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、
    
    '宛先・件名・本文 などのデータを代入する
    objMAIL.To = "test@ken3.org"           '宛先 ほかに.cc や.Bccも可能です
    
    objMAIL.Subject = "テスト メールの件名です "  '.Subjectに文字列設定で件名
    
    '本文を作る、(vbCrLfで改行されます)
    strMOJI = "こんにちは(このメールtestアドレスなので質問は別便で)" & vbCrLf _
            & " ここで 文字列を作って .Bodyに代入する" & vbCrLf _
            & " メールアイテムが作成されたらその後、 " & vbCrLf _
            & " .save 下書きへ保存 や .sendで送信(確認が出る)" & vbCrLf _
            & " 今回は、.Display で メール作成画面を表示" & vbCrLf _
            & Now() & "作成"

    objMAIL.Body = strMOJI                 '本文の代入

    DoEvents
    objMAIL.Display   '途中で編集したい時(メール編集画面を表示してみた)
    DoEvents

'署名を入れる
    '署名のコマンドバーを探し、実行する
    Dim oCBs As Object  '上級者に怒られるけど object型 正解はAs Office.CommandBarsだけど
    Dim oCtl As Object  '正解は Office.CommandBarControl かな
    
    '今起動中のobjMAIL(メール作成中)のコマンドバーを取り出すよ
    Set oCBs = objMAIL.GetInspector.CommandBars
    
    'ループで署名の文字を探す、、、
    Dim I As Long  'カウンター
    For I = 1 To 35000
       'コントロール I 番目を取り出す
       Set oCtl = oCBs.FindControl(, I)
       
       If Not (oCtl Is Nothing) Then  'オブジェクトが空じゃなければ
           '文字列でコマンド名を比較する
            Debug.Print ".Caption " & oCtl.Caption
            If oCtl.Caption = "署名(&S)" Then
                'ここで、octlを実行したいなぁ。ってことで
                'っと、その前に、どの署名か?判断が必要なのかなぁ。
                Dim oCtlSUB As Object  'その下を探るので勝手にSUBを作った。
                For Each oCtlSUB In oCtl.Controls  '署名の下でまわす
                    Debug.Print "sub .Caption" & oCtlSUB.Caption
                    If oCtlSUB.Caption = "TESTです。" Then
                        oCtlSUB.Execute   ' ↑で見つけた署名を実行
                        Exit For 'もう実行したので 抜ける、これ以上はループしないでいいので。
                    End If
                Next
                Exit For  'もう実行したので 抜ける、これ以上はループしないでいいので。
            End If
       End If
    Next
    
    '↑が見つからなかった時の処理や、エラー処理が無いなぁ
    '※、オイオイ、オブジェクトの後始末もしないのかよ。
    'サンプルだからって、手を抜きすぎ、、、
    
    

    'ここで、普通はオブジェクトの開放など、後始末をする。

End Sub
↑これ(コマンドバー)を利用して、 貼り付け 処理のコマンドを実行させてみたいと思います
'リッチテキストのメールにグラフを貼って作成する。
Sub MAKE_MAIL_ITEM_RichText_Gra()

    Dim oApp As Object
    Dim myNameSpace As Object
    Dim myFolder As Object

    Dim objMAIL As Object 'メールのオブジェクト

    'outlook 起動
    Set oApp = CreateObject("Outlook.Application")

    Set myNameSpace = oApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
    myFolder.Display  '表示 いつものクセで .Visible = True とやりがちだけど

    'メールアイテムの作成
    Set objMAIL = oApp.CreateItem(0) 'olMailItem=0 直値はいけないと思いつつ、
    objMAIL.BodyFormat = 3           'olFormatRichText=3 で リッチテキスト形式へ
    
    '宛先・件名・本文 などのデータを代入する
    objMAIL.To = Range("B3")      '宛先 .TO  セルB3から代入
    objMAIL.CC = Range("B4")      '宛先 .CC  セルB4から代入
    objMAIL.Subject = Range("B6")   '.Subjectで件名 セルB6から代入

    DoEvents
    objMAIL.Body = ""  '本文の初期化
    DoEvents

    objMAIL.Display   '画面表示(Mail入力、編集画面を表示)
    DoEvents

    'Outlook貼り付けのコマンドをコマンドバーから探す
    Dim oCBs As Object  '上級者に怒られるけど object型 正解はAs Office.CommandBarsだけど
    Dim oCtl As Object  '正解は Office.CommandBarControl かな

    '[OL] Outlook ソリューションで CommandBars を使用する方法
    ' http://support.microsoft.com/kb/201095/ja
    'の Excel ユーティリティを使用して Outlook CommandBar が 参考になると思います。

    '今起動中のobjMAIL(メール作成中)のコマンドバーを取り出すよ
    Set oCBs = objMAIL.GetInspector.CommandBars
    
    'ループで貼り付けの文字を探す、、、
    Dim I As Long  'カウンター
    For I = 1 To 35000
       'コントロール I 番目を取り出す
       Set oCtl = oCBs.FindControl(, I)
       
       If Not (oCtl Is Nothing) Then  'オブジェクトが空じゃなければ
           '文字列でコマンド名を比較する
            Debug.Print ".Caption " & oCtl.Caption
            If oCtl.Caption = "貼り付け(&P)" Then
                ' ↑で見つけたら oCtlはそのままで、ループを抜ける。
                Exit For  'もう実行したので 抜ける、これ以上はループしないでいいので。
            End If
       End If
    Next

    'コピー(Excelから)と貼り付け(Outlookへ)処理
    
    Range("A10:F14").Select  'Excel
    Selection.Copy
    DoEvents
    
    oCtl.Execute '↑で見つけたoCtl 貼り付けコマンド(outlook)を実行
    DoEvents
    
    ActiveSheet.ChartObjects("グラフ 1").Activate
    ActiveChart.ChartArea.Select
    Application.CutCopyMode = False
    ActiveChart.ChartArea.Copy
    DoEvents
    
    oCtl.Execute '↑で見つけた oCtl 貼り付けコマンド(outlook)を実行
    DoEvents
    
    Range("A32:G42").Select
    Selection.Copy
    DoEvents

    oCtl.Execute '↑で見つけた oCtl 貼り付けコマンド(outlook)を実行
    DoEvents
    
    'テストなので、コメントにして 今は、そのまま 開きっぱなし。
    'objMAIL.Save   '保存、下書きへ  保存後、用が無かったら.Closeで閉じるのがいいのかなぁ。。。
    'objMAIL.Close 2  '閉じる Mailの編集画面を閉じる
    'objMAIL.Send   '送信箱へ ※セキュリティの警告メッセージが出るよ
    
    'ここで、普通はオブジェクトの開放など、後始末をする。
    Set oCtl = Nothing
    Set oCBs = Nothing

End Sub
↑ポイントは、 .Caption = "貼り付け(&P)" を見つけて、 oCtl.Execute で見つけた oCtl 貼り付けコマンド(outlook)を実行 そんな感じかなぁ。 ※動作が少し 不安定なのが、気になります。。。 2009/05/07 No.183 Outlook 関係の 画像
05/07 Outlook の 編集・貼り付け コマンドを実行したい : http://www.youtube.com/watch?v=XvE5JuzxE5k

/* * 5.おまけ グラフオブジェクトの名前を変更したい。。。 */

    ActiveSheet.ChartObjects("グラフ 1").Activate
の
グラフ1だと味気ないので、名前を変更しようと操作してたら、なかなかできなかった。
で、
検索で見つかったのがコレ↓

Excel 2007 のグラフ名を変更するのに名前ボックスは使用できません。
http://support.microsoft.com/kb/928984/ja

> ActiveSheet.Shapes(1).name = chart_name

↑だって、、、なんだかなぁ。※本文とは関係ない脱線、寄り道でした。。。

/* * 6.終わりの挨拶 */

今回は、
・メールの形式をリッチテキストにする
・メールにExcelのグラフを貼り付ける
・コマンドバーから貼り付けを探した。
そんな、流れでした。

テスト時、本文にうまく コピー・貼り付け が できなかったのが気になるので、
さらに別な貼り付け方も考えないとなぁ、、、と、思いつつ、

プログラム作りは
^^^^^^^^^^^^^^^^
う〜ん・・・
まぁ、人それぞれ、十人十色、百社百色だけどね。
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

今回も逃げるように。。。。失礼します。
[サンプルファイル 20090507Outlook_Mail.zip]を解凍して動かしてください。

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

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

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

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]