三流君VBA:VBA Outlook リッチテキスト形式のメール で グラフを送る
三流君VBA:Outlookを操作してメールを送りたい
を見てください。
※検索で間違ってくる人がおおいので、頭 ヘッダに移動。
ここからしたが、
Outlook → Excel 逆の記事です。
下記のような質問のメッセージをいただきました。
>はじめまして。何度もHPを閲覧致しましたが分からない点があるので教えてください。
>知りたいことは、OutlookのVBAから、EXCELの特定セルの情報をどのように取得するかです。
>
>AAA.XLSというファイルがデスクトップにある場合、
>"C:\Users\taka\Desktop\AAA.xls"を設定して呼び込もうと思ってます。
>さらに、このファイルのA1セルの情報を取得して、Outlookの本文に設定したいです。
>
>まとめると、
>AAA.XLSファイルのA1セルを自動的に取得して、
>Outlookの本文に設定するにはどのようにすればいいか、です。
上記の質問に対して、いつもの三流プログラマー的なアプローチでアタックしてみます。
調査方法、作業の流れ、、、で蛇足が多いですがご勘弁を。
1.OutlookのVBAから、EXCELを起動する
を処理したいので、
アウトルックからエクセルを起動する、そんな方法を調べてみます。
Outlook2003のマクロを有効にする
ツール−−マクロ−−セキュリティ を 選択後、セキュリティ レベルを低レベル じゃなかった、中の マクロ実行前に警告にします。
※本当は 署名付きマクロにするのがいいんだろうけど。。。
CreateObject("Excel.Application")でエクセルを起動する
あとは、昔、AccessからExcelの起動を行ったサンプルがあったので( No.002 AccessからExcel出力 http://www.ken3.org/vba/backno/vba002.html )
から、下記のコードを抜き出して、テストしてみました。
Sub test() Dim oApp As Object 'アプリケーションを入れる箱 Set oApp = CreateObject("Excel.Application") 'エクセルのアプリケーションを作る oApp.Visible = True '可視、見えるようにする。お約束/呪文? oApp.UserControl = True 'ユーザー操作可能とする。※これがないとすぐに落ちたようになる End Sub
なんとか、空のExcelが起動しました。
試行錯誤の動画・・・
http://www.youtube.com/watch?v=XKd9GYwCuhI
www.youtube.com
2.デスクトップのAAA.xlsを開くマクロ(VBA)を調べる
>AAA.XLSというファイルがデスクトップにある場合、
>"C:\Users\taka\Desktop\AAA.xls"を設定して呼び込もうと思ってます。
デスクトップのaaa.xlsを開くマクロ(VBA)を探ってみます。
マクロ記録を使って調べてみたいので、
エクセルを立ち上げたら、
ツール−−マクロ−−新しいマクロの記録
を選択して、操作の記録を開始します。
記録が開始されたので、落ち着いて(私みたいにあせらないで(笑))、
実際の操作 デスクトップのaaa.xlsを開いてみます。
※普通に手作業で開きます。(記録させます)
aaa.xlsを開いたら、開いたことを確認したら、マクロの記録を終了させます。
次に、記録されたコード(マクロ)を確認したいので、
ツール −− マクロ −− Visual Basic Editor か Alt+F11(ショートカットキー)
で、VBAの編集画面を開きます。
↑ここから、記録したコードをコピーして、Outlook側のコードに貼り付けます↓
貼り付け後、そのままでは動かないので(記録したコードそのままでは動作しないので、)
Set oApp = CreateObject("Excel.Application") 'エクセルのアプリケーションを作る
で、oAppがエクセルのアプリケーションなので、
Workbooks.Open ("C:\Documents and Settings\user2000\デスクトップ\aaa.xls")
ここ↑の頭にoAppを付けてWorkbooks.Openを使うと、Outlookから.xlsファイルを開けます。
こんな感じ
oApp.Workbooks.Open ("C:\Documents and Settings\user2000\デスクトップ\aaa.xls")
で、頭にoAppを付けて使うことができます。
Sub test() Dim oApp As Object 'アプリケーションを入れる箱 Set oApp = CreateObject("Excel.Application") 'エクセルのアプリケーションを作る oApp.Visible = True '可視、見えるようにする。お約束/呪文? oApp.UserControl = True 'ユーザー操作可能とする。※これがないとすぐに落ちたようになる 'xlsファイルを開く 頭にoApp.を付けて、記録したマクロを流用してみました。 oApp.Workbooks.Open ("C:\Documents and Settings\user2000\デスクトップ\aaa.xls") 'oApp.ActiveWorkbook.Close End Sub
試行錯誤の動画とテスト結果
http://www.youtube.com/watch?v=FJHAi3EhyP8
www.youtube.com
3.Outlookのメールを作成して、読み込んだExcelのA1セルを本文にセットする。
>AAA.XLSファイルのA1セルを自動的に取得して、
>Outlookの本文に設定するにはどのようにすればいいか、です。
あとは、読み込んだaaa.xlsのA1セルからデータを取得して、
新規のメールにセットする、そんな感じでいいのかなぁ?
メールの作成
メールアイテムを作成するには、Dim objMAIL As Outlook.MailItem 'メールのオブジェクト Set objMAIL = Application.CreateItem(olMailItem) 'olMailItem=0 直値はいけないと思いつつ、 objMAIL.Display '画面表示(Mail入力、編集画面を表示)
で、作成可能なので( http://www.ken3.org/cgi-bin/group/vba_outlook.asp#MailItem 参照 )
宛先、件名、本文のセット
メールアイテム作成後、'宛先・件名・本文 などのデータを代入する objMAIL.To = "test@ken3.org" '宛先 ほかに.cc や.Bccも可能です 'objMAIL.CC = "vba@ken3.org" '宛先 .cc 'objMAIL.BCC = "vba@ken3.org ; oltest@ken3.org" '宛先を複数は ; セミコロンで区切る objMAIL.Subject = "テスト 件名" '.Subjectに文字列設定で件名 '本文を作る、(vbCrLfで改行されます) strMOJI = oApp.Range("a1") & vbCrLf _ & oApp.Range("A2") & vbCrLf _ & oApp.Range("A3") & vbCrLf _ & "test " objMAIL.Body = strMOJI '本文の代入
↑、ポイントは、
oApp.Range("a1")
で、エクセルのA1が取得できるので、単純に代入して vbCrLfで改行させながら文字列を作っただけです。
作った文字列は単純に objMAIL.Body = strMOJI で本文に代入しました。
値の取得で開いたエクセルを閉じる
あとは、使い終わった エクセルを閉じたいので、'excel を 閉じる oApp.ActiveWorkbook.Close oApp.Quit
oApp.ActiveWorkbook.Closeでブックを閉じてから、
oApp.Quitでエクセル本体を閉じました。
完成したソースファイル
Outlook VBA から Excelファイルを開いてセルA1..のデータ を 新規メールにセットするそんな処理で作成した、
全体のコード(Outlook VBA)はこんな感じです。
Option Explicit Sub test() Dim oApp As Object 'アプリケーションを入れる箱 Set oApp = CreateObject("Excel.Application") 'エクセルのアプリケーションを作る oApp.Visible = True '可視、見えるようにする。お約束/呪文? oApp.UserControl = True 'ユーザー操作可能とする。※これがないとすぐに落ちたようになる 'xlsファイルを開く 頭にoApp.を付けて、記録したマクロを流用してみました。 oApp.Workbooks.Open ("C:\Documents and Settings\user2000\デスクトップ\aaa.xls") 'oApp.ActiveWorkbook.Close Dim objMAIL As Outlook.MailItem 'メールのオブジェクト Dim strMOJI As String '本文 'メールアイテムの作成 Set objMAIL = Application.CreateItem(olMailItem) 'olMailItem=0 直値はいけないと思いつつ、 objMAIL.Display '画面表示(Mail入力、編集画面を表示) '宛先・件名・本文 などのデータを代入する objMAIL.To = "test@ken3.org" '宛先 ほかに.cc や.Bccも可能です 'objMAIL.CC = "vba@ken3.org" '宛先 .cc 'objMAIL.BCC = "vba@ken3.org ; oltest@ken3.org" '宛先を複数は ; セミコロンで区切る objMAIL.Subject = "テスト 件名" '.Subjectに文字列設定で件名 '本文を作る、(vbCrLfで改行されます) strMOJI = oApp.Range("a1") & vbCrLf _ & oApp.Range("A2") & vbCrLf _ & oApp.Range("A3") & vbCrLf _ & "test " objMAIL.Body = strMOJI '本文の代入 objMAIL.Display '編集画面のまま止めておきたい時 や テスト中に動作を見たいとき 'excel を 閉じる oApp.ActiveWorkbook.Close oApp.Quit End Sub
テスト結果
http://www.youtube.com/watch?v=4Fck2jUZnDg
www.youtube.com
終わりの挨拶
まだまだ、探りかたとサンプルが甘いけど、
三流君VBAでOutlookを操作する
三流君 Outlook Mail メールを操作する
三流君 Outlook Task 仕事・タスクを操作する
三流君 Outlook Appointment 予定表を操作する
三流君 Outlook Contact 連絡先・アドレス帳を操作する
で、細々解説しているので、良かったらのぞきにきてください。
あとは、アレンジして自分の物にして、楽しんでください。
日頃の作業が マクロ(VBA) で 楽になるといいなぁと思いつつ、失礼します。
三流プログラマー Ken3