dポイントプレゼントキャンペーン実施中!

前回の”教えて”で、ファイルの更新をメールで自動通知の閉じた後の処理で
解決したと思っていましたがファイルの内容が更新して無く、閉じただけでも
メール送信が処理されてしまいます。
タイトル通りの「ファイルを閉じてダイアログで保存した時だけ処理」の場合
このコード修正点を教えて頂ければと思っております。
よろしくお願いいたします。
_______________________________
Option Explicit
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Saved = True
End Sub
--
Private Sub Workbook_BeforeClose(Cancel As Boolean)  ←ここ
If Not Saved Then Exit Sub
On Error GoTo ErrorHandler
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)
With objOutlook.CreateItem(olMailItem)
.To = "メルアド"
.CC = ""
.BCC = ""
.Subject = "【テスト】(自動送信)"
.Body = "このメールはファイル更新で自動送信されています。"
.BodyFormat = olFormatPlain
.Send
End With
Finally:
Set objOutlook = Nothing
Exit Sub
ErrorHandler:
MsgBox "メールの送信に失敗しました", vbOKOnly + vbCritical
Resume Finally
End Sub
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

A 回答 (3件)

Option Explicit


Private SavedFlg As Boolean

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    SavedFlg = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Const olMailItem = 0
    Const olFormatPlain = 1
    If Not Saved Then
        Select Case MsgBox("'" & ThisWorkbook.Name & "' の変更内容を保存しますか?", vbExclamation + vbYesNoCancel)
            Case vbYes
                Application.EnableEvents = False
                ThisWorkbook.Save
                Application.EnableEvents = True
                SavedFlg = True
            Case vbNo
                ThisWorkbook.Saved = True
            Case vbCancel
                Cancel = True
                Exit Sub
        End Select
    End If
    If Not SavedFlg Then Exit Sub
    On Error GoTo ErrorHandler
    Dim objOutlook As Object
    Set objOutlook = CreateObject("Outlook.Application")
    With objOutlook.CreateItem(olMailItem)
        .To = "test@"
        .CC = ""
        .BCC = ""
        .Subject = "【テスト】自動送信"
        .Body = "このメールは自動テストメールです"
        .BodyFormat = olFormatPlain
        .Send
    End With
Finally:
    Set objOutlook = Nothing
    Exit Sub
ErrorHandler:
    MsgBox "メールの送信に失敗しました", vbOKOnly + vbCritical
    Resume Finally
End Sub
アウトルックの参照設定が要らないバージョンになってます。
    • good
    • 1
この回答へのお礼

修正コートのご提供ありがとうございました。
無事、作動を確認し感動致しました。
この度は何度もご回答、ご教授頂きありがとうございました。

お礼日時:2022/03/19 22:39

前回削除してしまった変数宣言を復活して修正してください。

    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
>前回削除してしまった変数宣言を復活して修正してください。
復活させ、Saved → SavedFlg 3か所を修正しましたが
ファイルを修正(更新)し閉じる際のダイアログでの「保存する」ボタンだけではメールが飛ばなく、上書きしてから☓で閉じるとメールが飛んできます。
修正点はございますでしょうか?
何度もお付き合いありがとうございます。

お礼日時:2022/03/19 20:50

Saved の宣言を削除してしまった為に動きが違っています。


削除ではなく、
Saved

SavedFlg
に変更してください。
3か所あります。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
矢印の2か所しか見つけれれませんでした。
この2か所ではエラーになります。
_______________________________
Option Explicit
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Saved = True  ←ここ
End Sub
--
Private Sub Workbook_BeforeClose(Cancel As Boolean)  
If Not Saved Then Exit Sub  ←ここ
On Error GoTo ErrorHandler
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)
With objOutlook.CreateItem(olMailItem)
.To = "メルアド"
.CC = ""
.BCC = ""
.Subject = "【テスト】(自動送信)"
.Body = "このメールはファイル更新で自動送信されています。"
.BodyFormat = olFormatPlain
.Send
End With
Finally:
Set objOutlook = Nothing
Exit Sub
ErrorHandler:
MsgBox "メールの送信に失敗しました", vbOKOnly + vbCritical
Resume Finally
End Sub
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

お礼日時:2022/03/19 19:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!