Excel VBAによってブックをメールで送信する機能で、DialogコレクションのxlDialogSendMailを表示するものがあります。

実行するとメールソフトが起動して本文などを入力できます。
指定できる引数は以下のものがあります。

arg1 宛先のメールアドレス
arg2  メールの件名
arg3  受信通知の有無

宛先だけではなく、CCの宛先メールアドレスの設定方法をご存知の方がおりましたらご教授していただけないでしょうか。
たとえば以下のようなCodeを書くとa@hotmail.comへ件名"質問"というマクロが設定がされます。

Sub aaa()

Application.Dialogs(xlDialogSendMail)
.Show arg1:="a@hotmail.com" arg2:="質問", arg3:=False

End Sub

これにCCの宛先を設定する方法をご教授お願いいたします。

よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2006/09/29 21:44:15
  • 終了:2006/10/06 21:45:03

回答(3件)

id:tokuya_n No.1

tokuya_n回答回数56ベストアンサー獲得回数72006/09/29 22:13:31

ポイント27pt

MSが提唱しているCDOを使ってメールの送信を行なってみます。

http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html

'*******************************************************************************

' メール送信(CDO) ※参照設定:Microsoft CDO for Exchange 2000 Library

'             Microsoft ActiveX Data Objects 2.x Library

'*******************************************************************************

' [引数]

' ①MailSmtpServer : SMTPサーバ名(又はIPアドレス)

' ②MailFrom : 送信元アドレス

' ③MailTo : 宛先アドレス(複数の場合はカンマで区切る)

' ④MailCc : CCアドレス(複数の場合はカンマで区切る)

' ⑤MailBcc : BCCアドレス(複数の場合はカンマで区切る)

' ⑥MailSubject : 件名

' ⑦MailBody : 本文(改行はvbCrLf付加)

' ⑧MailAddFile : 添付ファイル(複数の場合はカンマで区切るか配列渡し) ※Option

' ⑨MailCharacter : 文字コード指定(デフォルトはShift-JIS) ※Option

' [戻り値]

' 正常時:"OK", エラー時:"NG"+エラーメッセージ

'*******************************************************************************

Private Function SendMailByCDO(MailSmtpServer As String, _

MailFrom As String, _

MailTo As String, _

MailCc As String, _

MailBcc As String, _

MailSubject As String, _

MailBody As String, _

Optional MailAddFile As Variant, _

Optional MailCharacter As String)

という関数の定義例が載ってます。

id:ardarim No.2

ardarim回答回数897ベストアンサー獲得回数1452006/09/30 11:26:06

ポイント27pt

xlDialogSendMailを使ったやり方だと、宛先、件名、受信通知有無の3つの引数しか指定できず、Ccは指定できません。


(参考)

VBA資料編1 組み込みダイアログボックス一覧


xlDialogSendMail以外の方法でCcの指定ができる方法がありますのでそちらを使用するのがよいかと思います。


(1)Outlookを前提にする場合

OutlookをCOMオブジェクトとして呼び出して制御します。

こちら(Excel VBA質問箱 IV)にサンプルがあります。


(2)使用しているメーラーに依存しない方法

マイクロソフトがVBAなどから呼び出せるよう用意している方法でCDO(Microsoft Collaboration Data Objects)という仕組みがあります。

こちらに詳しい解説があります。

VBA応用(CDOでメール送信)

id:TakuTa

takuya_nさん ardarimさん

ご回答ありがとうございました。

Outlookを利用してファイルをメールしたいのですが、ardarimさんより教えていただきました(Excel VBA質問箱 IV)を参考にして以下のようなCodeを作成しました。

Sub Outlookで送る()

'

Set myOutLook = CreateObject("outlook.application")

Set myitem = myOutLook.CreateItem(olmailItem)

'OutLookを起動。

myitem.To = "アドレス"

myitem.CC = "CCアドレス"

myitem.Subject = "件名"

myitem.Body = "本文"

myitem.Display

'myitem.send

Set MyAttachments = myitem.Attachments

MyAttachments.Add "ファイルの指定", 1, 1, "ファイルの表示名"

Set MyAttachments = myitem.Attachments

Set myOutLook = Nothing: Set myitem = Nothing

End Sub

すると”コンパイルエラー 変数が定義されていません”となり、うまくいきませんでした。

大変恐縮ですが、どのようにすればうまくいくか教えていただけますでしょうか。

VBAの初心者なので申し訳ございません。

よろしくお願いいたします。

2006/09/30 12:39:41
id:tokuya_n No.3

tokuya_n回答回数56ベストアンサー獲得回数72006/09/30 19:30:08

ポイント26pt

どの行がエラーだとか、指摘はありませんか?

ただ、私の環境ではコピペしただけで完璧に動作しました。

たぶん、抜粋された部分のソースコードのエラーではないと思われます。


参考までに、私の環境というのは

WindowsXP

Microsoft Office Excel2003

Microsoft Office Outlook2003

です。


ardarim さんが

> (1)Outlookを前提にする場合

と書いておられるように、そのコードはMicrosoft Outlook Object Libraryを使用するものです。

Outlook Express では使用できませんのでご注意。

汎用的なのはCDOを使用する方法です。

  • id:ardarim
    プログラムの先頭で、「Option Explicit」という記述をしていないでしょうか?


    この1行を入れた場合、すべての変数はDimステートメントで明示的に定義を行わないいけなくなります。(これは性能を最適化したり、プログラムミスを起こしにくくするための指定です)
    Option Explicitを指定して、Dimステートメントで変数を定義しなかった場合、「コンパイルエラー 変数が定義されていません」が発生します。


    Option Explicitを削除するか、すべての変数をDimステートメントで定義するようにしてみてください。


    もしOption Explicitを指定していないのにこのエラーが出る場合は、必要な参照設定(追加機能を利用するためのライブラリの参照)が行われていない可能性があります。[ツール]-[参照設定]で、「Microsoft Outlook 11.0 Object Library」にチェックが入っているか確認してください。入っていなければチェックを入れてOKを押してください。
    olMailItemという定数は、「Microsoft Outlook 11.0 Object Library」が参照設定されていないとエラーになります。
  • id:TakuTa
    takuya_nさん ardarimさん

    早速のご回答ありがとうございます。

    ardarimさんのご指摘のとおり、「Option Explicit」を削除したところ、うまくOutlookの画面が希望とおり表示されました! ただ、実際に送信をしたところ、『実行時エラー’2147024894(80070002)’指定されたファイルがみつかりません』と表示がありました。
    私の希望としましては、Excel fileを作成したユーザーがマクロを実行すると私宛にCCでメールを送っていただくようにしたいです。ユーザーの画面上に表示されているExcel fileを添付するようなマクロのCodeにするには以下をどのように修正すればよろしいでしょうか。

    Sub Outlookで送る()

    Set myOutLook = CreateObject("outlook.application")

    Set myitem = myOutLook.CreateItem(olmailItem)

    myitem.To = "アドレス"

    myitem.CC = "CCアドレス"

    myitem.Subject = "件名"

    myitem.Body = "本文"

    myitem.Display

    Set MyAttachments = myitem.Attachments

    MyAttachments.Add "ファイルの指定", 1, 1, "ファイルの表示名"

    Set MyAttachments = myitem.Attachments

    Set myOutLook = Nothing: Set myitem = Nothing

    End Sub

    お手数をおかけして申し訳ございませんが、よろしくお願いいたします。
  • id:ardarim
    添付しようとしているExcelファイルは、マイドキュメントに入っていたりしないでしょうか?

    マイドキュメントは、通常 C:\Documents and Settings\ユーザー名\My Documents\ のようなフォルダ位置に格納されているため、パス名に空白が入っています。
    そのため、うまくOutlook側とやりとりができていない可能性があります。

    Excel側から「C:\Documents and Settings\ユーザー名\My Documents\test.xls」というファイルを送ったつもりでも、Outlook側は最初の空白まで「C:\Documents」という添付ファイルと認識しているということです。
    逆に、パス名に空白が入っていない、C:\test.xlsのようなファイルで実行した場合はエラーにならないのではないでしょうか?

    この場合、ファイル名を "~" で囲むことで、パス名に空白が入っていても大丈夫にすることができます。例えばこんな感じです。
    MyAttachments.Add """" & "C:\Documents and Settings\ユーザー名\My Documents\test.xls" & """"

    自分自身(Excelファイル)の場合であれば、
    MyAttachments.Add """" & ActiveWorkbook.FullName & """"

    ファイル名の前後につけている """" というのは、実際にOutlookに送られる時には1つの " に変換されます。(通常文字列は、"~" で囲みますが、"~"の中でさらに " を使いたい場合、2つ重ねで "" と書くことで、1つの " に変換されます。)。

    申し訳ありませんが、私自身はOutlookユーザーではないため、確認できているわけではありません。
  • id:tokuya_n
    コメント欄で質問が続いていたとは気付きませんで(^-^;)
    せっかく環境があるので試してみたところ、ActiveWorkbook.FullNameの場合にはダブルクォーテーションでくくらなくてもうまいこと処理されるみたいです。


    'myitem.send

    Set MyAttachments = myitem.Attachments

    '上書き保存
    ActiveWorkbook.Save

    '今保存したこのファイルを添付ファイルに設定
    MyAttachments.Add ActiveWorkbook.FullName

    Set MyAttachments = myitem.Attachments


    上書き保存1行入れたほうがいいかも。
    (新規作成ファイルの場合も考慮すべきかな?)
  • id:TakuTa
    takuya_nさん ardarimさん

    度重なるのご回答ありがとうございます。

    色々と試行錯誤した結果、以下のようなCodeで思い通りのマクロが実行されました。

    Sub Outlookで送る()

    ThisWorkbook.Save

    Set myOutLook = CreateObject("outlook.application")

    Set myitem = myOutLook.CreateItem(olMailItem)

    myitem.To = "アドレス"

    myitem.CC = "CCアドレス"

    myitem.Subject = "件名"

    myitem.Body = "本文"

    myitem.Display

    myitem.Attachments.Add ThisWorkbook.Path + "¥" + ThisWorkbook.Name

    Set myOutLook = Nothing: Set myitem = Nothing

    End Sub

    このマクロの目的はあるExcel fileを私からユーザーへ送り、そのfileを複数のユーザーを経由し、最終的に私へ戻ってくるということが目的です。 次の方へ送信する際にCCで私を入れていただくことで、そのfileが現在どこに滞留しているかを私が管理したいがために作成しました。ユーザーは添付ファイルを開き必要事項を入力し、マクロを実行することで、次のユーザーへfileを転送します。 

    もし上記Codeに改善の余地がありましたらご指摘いただければ大変うれしく思います。
    今回がこのサイトへ初めて質問させていただきましたが、とてもよい勉強をすることができました。 今後ともよろしくお願いいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません