三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Outlookからマクロ/VBAを使用して EXCELのデータを本文へ転記する

ExcelOutlook の 記事は

三流君VBA:VBA Outlook リッチテキスト形式のメール で グラフを送る
三流君VBA:Outlookを操作してメールを送りたい

を見てください。
※検索で間違ってくる人がおおいので、頭 ヘッダに移動。
ここからしたが、
OutlookExcel 逆の記事です。


下記のような質問のメッセージをいただきました。

>はじめまして。何度もHPを閲覧致しましたが分からない点があるので教えてください。
>知りたいことは、OutlookVBAから、EXCELの特定セルの情報をどのように取得するかです。
>
>AAA.XLSというファイルがデスクトップにある場合、
>"C:\Users\taka\Desktop\AAA.xls"を設定して呼び込もうと思ってます。
>さらに、このファイルのA1セルの情報を取得して、Outlookの本文に設定したいです。
>
>まとめると、
>AAA.XLSファイルのA1セルを自動的に取得して、
>Outlookの本文に設定するにはどのようにすればいいか、です。

上記の質問に対して、いつもの三流プログラマー的なアプローチでアタックしてみます。
調査方法、作業の流れ、、、で蛇足が多いですがご勘弁を。

1.OutlookVBAから、EXCELを起動する

>知りたいことは、OutlookVBAから、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

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。
・[Excel/Access VBA]の解説
・[ASP(Active Server Pages)]の解説。
・[元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
・[プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
三流君を踏み台にする
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



Googleを使用して検索する

読者の声:三流君の説明・解説じゃ よくわからなかったから、Googleを使って、自分で検索します。
三流君:残念です。あっ、下記にGoogleの検索窓を設置しました。
いろいろ指定して試してみてください。

Google
探す言葉:気になる単語や,オブジェクト(Document),プロパティ(.Busy)やメソッド(.Navigate)などを入れて検索してみてください。


言語を指定:見つからない時は指定無しで探す

サイト指定:人気QAサイト や 一次情報MS本家を指定する
一次情報・二次情報まとめから探る
QAサイトの質問から探る
検索実行: ←オプション確認後に検索ボタンを押してください

期間指定:情報の鮮度も大切?
検索実行: ←オプション確認後に検索ボタンを押してください


本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)