[[20200618104055]] 『Outlookでの自動送信マクロ エクセルでの課題管浴x(見習い) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Outlookでの自動送信マクロ エクセルでの課題管理における自動送信』(見習い)

「期限超過した課題を担当者にOutlookでメールを送る」という課題です。
エクセルに記載されている(キーID、種別、件名、状態、期限日)を抽出し、HTML表にしてメールに添付します。

悩んでいるのは以下の点です。
期限超過の課題がない担当者には、

?@メールを立ち上げない 
?A送信しない

を実行したいのですが、やり方がわかりません。

以下のマクロの状態だと
?@期限超過の課題がない担当者もメールが立ち上がる
?A表のヘッダーが作成される
?B宛先も入力され、送信される

改善したいです。
お助けくださいよろしくお願いいたします。

 Dim objOutlook As Outlook.Application
    Set objOutlook = New Outlook.Application
    Dim objMail As Outlook.MailItem
    'Set objMail = objOutlook.CreateItem(olMailItem)

    '--- Excelワークシート ---'
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("データ")
    Dim ws2 As Worksheet
    Set ws2 = ThisWorkbook.Worksheets("担当者")

    MsgBox Date

    '--- メールの内容を格納する変数 ---'
    Dim toStr As String
    Dim ccStr As String
    Dim bccStr As String
    Dim subjectStr As String
    Dim bodyStr As String
    Dim tanto_id As Long
    Dim tanto_name As String
    Dim i As Integer
    Dim j As Integer
    Dim keyID As Integer
    Dim kigenbi As Date
    Dim keyStr As String
    Dim kigenStr As String

    subjectStr = "【要確認】期限超過課題対応のお願い"
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Set objMail = objOutlook.CreateItem(olMailItem)
    tanto_id = ws2.Cells(i, 1)
    tanto_name = ws2.Cells(i, 2)
    toStr = ws2.Cells(i, 3)

     bodyStr = tanto_name & "様" & "<br>" & "<br>" & "Backlogにおけるご担当の課題の期限が超過しております。" & "<br>" & _
                    "チケットの更新、または期限の延伸をお願いいたします。"
     bodyStr = bodyStr + "<html><body><table border=1>"
     bodyStr = bodyStr + "<tr bgcolor =#191970><th>キーID</th><th>種別</th><th>件名</th><th>状態</th><th>期限日</th></tr>"
     For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                If (Cells(j, 22) = tanto_id) Then
                keyID = Cells(j, 4)
                kigenbi = Cells(j, 29)
                If kigenbi < Date Then
                keyStr = Str(keyID)
                kigenStr = Str(kigenbi)

                bodyStr = bodyStr + "<tr style=color:red><td>"
                bodyStr = bodyStr + keyStr
                bodyStr = bodyStr + "</td><td>"
                bodyStr = bodyStr + Cells(j, 7)
                bodyStr = bodyStr + "</td><td>"
                bodyStr = bodyStr + Cells(j, 12)
                bodyStr = bodyStr + "</td><td>"
                bodyStr = bodyStr + Cells(j, 15)
                bodyStr = bodyStr + "</td><td>"
                bodyStr = bodyStr + kigenStr
                bodyStr = bodyStr + "</td></tr>"
                End If

         End If
    Next j
    bodyStr = bodyStr + "</table></body></html>"

    objMail.Display
    objMail.To = toStr
    objMail.Subject = subjectStr
    objMail.HTMLBody = bodyStr
    Next i

    objMail.Send

End Sub

< 使用 Excel:unknown、使用 OS:unknown >


ExcelバージョンとOSは何なのか、明記してください。

ぱっと見、セルを参照する際にシートを明記しているところと、省略しているところがありますね。 どのシートがアクティブなのかで結果が変わってしまうので、ちゃんと全て明記しては? 手抜きのせいで不具合発生しているだけだと、格好悪過ぎますから。

そして、思った通りに動かないならば、ステップ実行して、参照している内容や変数の内容が想定通りになっているか確認し、間違い箇所を探しましょう。

なんか、要らない変数代入が多いし、プログラミング経験の無い新入社員に出された、マクロを作る練習課題なのでしょうか? 課題なら、出題した人に聞くのが適切ですよ。 第3者だと、シート上のどのセルにどんな文字列が記入されているか判らないので、デバッグは手伝えませんからね。
(???) 2020/06/18(木) 11:31


そして問題なのは、期限判定した際、期限切れはbodyStrにちょっと文字列が増えるだけで、メール送信処理まで通ってしまうからでしょうね。(送信するのが、ループを抜けた先1回だけ、というのも…)

ステップ実行すれば、自分で気付くと思います。 または、いきなりコーディングせず、フローチャートを書いてみるべきですね。

先に期限判定して、期限切れの場合のみ、メール作成し送信する、というように組み直しましょう。 無駄な変数が多い事や、インデントを雑にしている事で、可読性が悪くなって、簡単な原因でも気づかないのですよ。
(???) 2020/06/18(木) 11:49


ご丁寧にありがとうございます。

>先に期限判定して、期限切れの場合のみ、メール作成し送信する、というように組み直しましょう。 無駄な変数が多い事や、インデントを雑にしている事で、可読性が悪くなって、簡単な原因でも気づかないのですよ。

かしこまりました。
処理フローは書いているので、見直しながら丁寧に確認していきたいと思います。
(見習い) 2020/06/18(木) 12:12


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.