次の方法で共有


ExcelからVBAでoutlookを起動しメールを送信しようとしましたが、送信トレイに入ったままで送信されません。

質問

2019年6月4日火曜日 8:28

ExcelからVBAでoutlookを起動し、object.Displayでメールフォームを表示してメールを送信しましたが、送信トレイに入ったままで送信されません。

そこで少し調べて以下のサイトを見つけたのですが、

http://pineplanter.moo.jp/non-it-salaryman/2016/09/22/excel-vba-sendmail/

どうやらメールフォームだけだと送信トレイに入って送信されないみたいです。

Outlook自体がこういう仕様でどうにもならないのか、それとも何らかの解決法があるのか私にはわかりません。

現在は仕方がないのでoutlookはやめて、thunderbirdをコマンドラインで起動してメールを送信しています。

何らかの解決方法をご存知の方がいるのなら、よろしくおねがいします。

すべての返信 (5)

2019年6月4日火曜日 10:30

shin_0125さん、こんばんは。

ご呈示のサイトにあるとおり、Outlookアプリケーションの立ち上げは必要のようですよ。
ただし、MailItemオブジェクト.Send で、VBAから送信できるはずです。
次のURLのサイトをご参照ください。
https://tonari-it.com/excel-vba-outlook-mail-send/

そうではなくて、「MailItemオブジェクト.Send で送信したけれども送信トレイに入ったままで送信されない。」ということですと、小生には訳が分からないです。お力になれず、申し訳ないです。


2019年6月4日火曜日 15:05

Outlook のメールフォームを使わないでいいのなら以下のような感じで Excel のセルを
メール作成のインターフェイスにしてしまうという手もあります。

VBA ソースのサンプル

Option Explicit

Const olMailItem = 0

' テキスト形式
Const olFormatPlain     As Long = 1
' HTML 形式
Const olFormatHTML      As Long = 2
' リッチテキスト形式
Const olFormatRichText  As Long = 3

Sub test()
    Dim OlApp As Object ' Outlook.Application
    Dim olMi As Object ' Outlook.MailItem

    ' Outlook のオブジェクトを作成
    Set OlApp = CreateObject("Outlook.Application") ' New Outlook.Application
    ' Outlook メールアイテムを作成
    Set olMi = OlApp.CreateItem(olMailItem)
    ' 宛先 (最大 5 件まで対応)
    olMi.To = Application.WorksheetFunction.TextJoin(";", True, Range("b1:g1"))
    ' CC (最大 5 件まで対応)
    olMi.CC = Application.WorksheetFunction.TextJoin(";", True, Range("b2:g2"))
    ' BCC (最大 5 件まで対応)
    olMi.BCC = Application.WorksheetFunction.TextJoin(";", True, Range("b3:g3"))
    ' 件名
    olMi.Subject = Range("b4").Value
    ' 本文の書式をテキストにする
    olMi.BodyFormat = olFormatPlain
    ' 本文
    olMi.Body = Range("b5").Value

    ' 宛先、CC、BCC のいずれかが入力されているかをチェック
    Select Case True
    Case olMi.To = "" And olMi.CC = "" And olMi.BCC = ""
        MsgBox "送信先、CC、BCC いずれかは入力してください。", vbCritical
        Exit Sub
    End Select

    ' 件名入力チェック
    If olMi.Subject = "" Then
        If MsgBox("件名が入力されていません。" & vbCrLf & "送信してよろしいですか?", vbQuestion Or vbOKCancel Or vbDefaultButton2) = vbCancel Then
            Exit Sub
        End If
    End If

    ' 本文入力チェック
    If olMi.Body = "" Then
        If MsgBox("本文が入力されていません。" & vbCrLf & "送信してよろしいですか?", vbQuestion Or vbOKCancel Or vbDefaultButton2) = vbCancel Then
            Exit Sub
        End If
    End If

    ' 送信
    olMi.Send
End Sub

2019年6月5日水曜日 8:09

ありがとうございます。やっぱりメールフォームだけだと無理なんですね。

object.sendの方は問題なく送信できます。

仕方がないのでoutlookはやめて、thunderbirdを使うことにします。

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


2019年6月5日水曜日 8:12

ありがとうございます。参考にさせていただきます。

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


2019年6月5日水曜日 10:48

shin_0124さん、こんばんは。

ご返事、ありがとうございました。

Outlookアプリケーションの立ち上げは必要のようですが、Mailオブジェクト.Send でメールを送信後、Outlookアプリケーション.Quit だかでOutlookを終了して閉じてしまえば、Outlookアプリケーションのウィンドウが残らないので、気にならないような気がしますが(正しいコマンドは別途調べてください。)。問題意識の所在が異なるのであれば、参考になりませんが。