【会員アンケートご協力のお願い】抽選で計5名様に役立つ書籍をプレゼント!

Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11全般 : Microsoft 365)
期日が近づいたら自動でメール送信
投稿日時: 24/11/01 22:26:23
投稿者: あこりこ

サイト内を調べてみたのですが、類似案件が見当たりませんでしたので
ご相談させてください。
※私の検索の仕方が悪い場合は何卒ご容赦願います。
 
実行したいことは、
とあるタスクに以下のような期日と対応済かを管理するリストがあったとします。
 
   A列    B列   C列    D列    E列
  案件名   期日   対応  担当者Mail 上長Mail
1 ●●契約 2024/11/10  済   a@a.com  z@a.com
2 ××契約 2024/11/15      b@a.com  z@a.com
3 △△契約 2024/11/25  済   c@a.com  z@a.com


 
もし期日の1か月前の時点で対応が「済」でなかった場合は
担当者と上長に自動でアラートメールが送信される仕組みは可能でしょうか?
 
また、対応が可能な場合、当該EXCELは日々手動で立ち上げるなどの
手動作業は必要となりますでしょうか?
できれば必要な情報さえ入力されていればユーザ側は何もしなくても
アラートメールが自動送信されるような仕様が理想です。
 
お手数をお掛けしますが、何卒ご指南願います。
 
 

回答
投稿日時: 24/11/02 08:21:18
投稿者: simple

こんにちは。
 
ご自分ではどこまで検討されていますか?
できているところまでを示して、詰まっているところを具体的に質問するようにしてください。(*)
 
(1)まずは該当の案件の有無を調べる部分から始めてください。
 
(2)メール作成、送信については、Outlookオブジェクトを操作するのが一般的です。
   (簡単なものであれば、他にmailto:プロトコルを使ったWorkbookのFollowHyperlinkメソッドを
    使う方法もあります。この方法ではファイル添付はできません。)
   ネットで検索すると記事がたくさんあると思います。お調べください。
   
   該当一件ごとに送るのですか?
   それとも、内容はまとめて添付ファイルで送り、
   本文は、処理未済のものがあります程度のメッセージでよいのですか?
   そのあたりも明確にされたほうがよさそうです。
    
(3)定期的実行については、Windowsのタスクスケジューラーを使います。
   ・起動自動マクロに上記を設定したブックを作成します。
   ・Excel.exe を 対象Bookを引数にした形で、タスクに登録します。
   詳細は下記を参考に。
   https://website-note.net/windows/how-to-open-an-excel-file-from-task/
 
方針を決める一助になれば幸いです。
 
(*)
こちらの掲示板の「Q&A掲示板ご利用上のお願い」に以下の記載があります。
こうした指摘を受けないような形で質問して下さい。
https://www.moug.net/faq/kiyaku.html#link4
>禁止事項
> コード制作依頼
>「●●●を実行するようなマクロを作りたいのですが」「●●●をする方法を教えてください」といった、
> コード制作依頼ともとれるような質問はおやめください。

投稿日時: 24/11/02 10:58:31
投稿者: あこりこ

simpleさん
 
種々ご教示くださり、誠にありがとうございます。
とても助かります。
 
また、以下の点、説明が不足しており申し訳ございませんでした。
 
該当1件ごとに担当者と上長にメール送信することを想定しており、
ファイル添付はせずメール本文に「案件名」「期日」を加えて
「期日が迫ってますよ」といった内容で自動送信を行いたいです。
 
>該当一件ごとに送るのですか?
>それとも、内容はまとめて添付ファイルで送り、
>本文は、処理未済のものがあります程度のメッセージでよいのですか?
>そのあたりも明確にされたほうがよさそうです。
 
この点を踏まえて、アドバイスいただけますと幸いです。
どうぞ宜しくお願いいたします。

回答
投稿日時: 24/11/02 16:20:22
投稿者: simple

追加説明ご苦労さまでした。
お尋ねしたのは私がコードを書くためではありませんでした。質問として不備だと感じたからでした。
 
繰返しになりますが、
> ご自分ではどこまで検討されていますか?
> できているところまでを示して、詰まっているところを具体的に質問するようにしてください

回答
投稿日時: 24/11/02 16:41:27
投稿者: WinArrow

コードの作成依頼には、対応できませんが、
問題を大きく2つに分けて考えましょう。
A.対象データを検索と抽出する方法を考える
   ➡これは、VBAを使わなくても、例えば、オートフィルタを使うことで可能です。
B.メールについてです。
  例えば、Aで検索した内容をメールに貼付けて、送信する
  オートフィルタで対象データだけが表示されるので、
  そのまま、メール文面にコピペできますよ。
  件数にもよりますが、手作業でできますよね?
 
この2つを検討してみませんか?
 

回答
投稿日時: 24/11/02 16:44:04
投稿者: WinArrow

追加レス
検索方法としてオートフィルタを紹介したが、
フィルタオプションの方がよいかも・・・・

回答
投稿日時: 24/11/02 17:00:50
投稿者: mattuwan44
投稿日時: 24/11/02 20:38:05
投稿者: あこりこ

WinArrowさん
mattuwan44さん
 
ご教示くださり、誠にありがとうございます。
頂いた情報を踏まえて対応してみます!
まずはお礼までに。

回答
投稿日時: 24/11/05 15:12:14
投稿者: Suzu

私なら こうするかなという話で。
 
多分、この Excelリストは
 ネットワークやクラウド上に存在する 不特定多数の利用者により更新されるファイル
 
そうなると、そのファイルにマクロ(VBA)を含めるのは回避したい。
(開いた際に、既に送信済みにも関わらず 再び送信されてしまう)
 
であるなら、そのファイルとは別に、VBAを含んだ xlsm を用意し そのリストを読ませても良いけど
質問者さんが気にする様に、実行するのに、xlsm ファイルを開かないといけない。
 
定期的に実行するには 私もタスクスケジュラーを使います。
起動し続ける PCに 定時に マクロが 実装された Excelファイル ではなく
VBS ファイルを 実行する様にします。
 
そのVBS では
・ADO を使い Excelファイル Sheet1 内の
   対応 が 空白
    かつ
   期日が 1か月 以内
  のレコードセットを取得
 その複数レコード内容を以て メール送信を実施
 
・メール 送信だけなら CDO の機能を使いメール送信が可能
 コード内に、
  メール情報 (SMTPサーバー情報、SMTP承認情報、メールアドレス情報(From))
 をハードコーディングする様になるので一長一短ですが・・
 
上記なら、起動し続ける(或いは 動作 発動時には 起動している事が担保されているマシン)
に、Office (Excel/OutLook)は不要です。
 
 
前者は 下記を参考に
 

  DBFile = "C:\〜〜フルパス.xlsx"

  Set cn = CreateObject("ADODB.Connection")
  With cn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .Properties("Extended Properties") = "Excel 12.0"
    .Open DBFile
  End With

  strSQL = "SELECT * FROM [Sheet1$] WHERE ISNULL(対応) AND 期日 < " & Format(DateAdd("m", 1, Now()), "\#yyyy/mm/dd\#") & ";"

  Set Rs = CreateObject("ADODB.Recordset")
  Rs.Open strSQL, cn, 0, 1, 1  'adOpenForwardOnly, adLockReadOnly, adCmdText
  Do While Not Rs.EOF
    MsgBox Rs![案件名] & vbTab & Rs![期日] & vbTab & Rs![対応] & vbTab & Rs![担当者Mail] & vbTab & Rs![上長Mail]
    Rs.MoveNext
  Loop
  Rs.Close
  Set Rs = Nothing

  cn.Close
  Set cn = Nothing

 
後者は、WEB検索で 「CDO VBS」を キーワードにすれば 参考コードは見つかるでしょう。

投稿日時: 24/11/06 11:01:04
投稿者: あこりこ

Suzuさん
 
詳細にアドバイスを下さり誠にありがとうございます。
またご返信が遅くなってしまい申し訳ございませんでした。
 
まさに頂いたアドバイスがやりたくことに
マッチしていると思いますので、試してみます。
どうもありがとうございました。

回答
投稿日時: 24/11/08 12:19:46
投稿者: Suzu

すみません。
VBS で使用できない記述がありました。
 

DBFile = "C:\〜〜フルパス.xlsx"

Set cn = CreateObject("ADODB.Connection")
With cn
	.Provider = "Microsoft.ACE.OLEDB.12.0"
	.Properties("Extended Properties") = "Excel 12.0"
	.Open DBFile
End With

eDate = DateAdd("m", 1, Now())
strWhere = "#" & YEAR(eDate) & "/" & RIGHT("0" & MONTH(eDate), 2) & "/" & RIGHT("0" & DAY(eDate), 2) & "#"
strSQL = "SELECT * FROM [Sheet1$] WHERE ISNull(対応) AND 期日 < " & strWhere & ";"

Set Rs = CreateObject("ADODB.Recordset")
Rs.Open strSQL, cn, 0, 1, 1  'adOpenForwardOnly, adLockReadOnly, adCmdText

Do While Not Rs.EOF
	WScript.Echo Rs.Fields("案件名") & vbTab & Rs.Fields("期日") & vbTab & Rs.Fields("対応") & vbTab & Rs.Fields("担当者Mail") & vbTab & Rs.Fields("上長Mail")
	Rs.MoveNext
Loop
Rs.Close
Set Rs = Nothing

cn.Close
Set cn = Nothing

 
 
Format関数と、コレクションの既定アイテム参照の「!」は使えませんでした。

投稿日時: 24/11/10 23:30:09
投稿者: あこりこ

Suzuさん
追加のご情報有難うございます。
そこが原因だと分かり助かりました。
再度試してみようと思います。

回答
投稿日時: 24/11/15 22:02:12
投稿者: simple

投稿日時: 24/11/02 08:21:18で方針を書きましたが、その後のそちらの進捗も不明で、残念です。
 

(1)期限確認用のブックとは別に、ブックを作成します(以下、自動実行用ブック)。
(2)自動実行用ブックのOpenイベントプロシージャに、以下の動作を実行するコードを
  書いておく。
    ・期限確認用ブックを開き、
    ・期日の1か月前の時点で対応が「済」でなかった契約について、
    ・関係者にメールを送信する
(3)自動実行用ブックの定期実行については、Windowsのタスクスケジューラーを使います。
    ・Excel.exe を (2)で作成したBookを引数に指定する形式で、タスクに登録します。
    ・詳細は下記を参考に。
     https://website-note.net/windows/how-to-open-an-excel-file-from-task/    

 
以下、(2)の部分の参考コードをメモしておきます。
これをテスト確認したうえで、問題なければ、
    ・Openイベントプロシージャにコピーペイストするか、
    (または
    ・標準モジュールにそのままコピーして、Openイベントプロシージャから Callします。)
 
Rem https://life-is-simple.blog/vba-outlook-mail-to/#google_vignette
Rem  ■のある箇所は特にしっかり確認してください。

Sub 処理未済報告メール送信()
    'Outlookの参照設定必要■
    Dim MyOutlook As Outlook.Application
    Dim Mailitem As Outlook.Mailitem
    Dim k       As Long
    Dim wb      As Workbook
    Dim ws      As Worksheet

    Set MyOutlook = New Outlook.Application
    Set wb = Workbooks.Open("期限確認.xlsm")   '■パス名を確認して修正してください。
    Set ws = wb.Worksheets(1)

    For k = 2 To ws.Cells(Rows.Count, "A").End(xlUp).Row
        If ws.Cells(k, "C") = "" Then
            If ws.Cells(k, "B") <= Application.EDate(Date, 1) Then
                Set Mailitem = MyOutlook.CreateItem(olMailItem)
                With Mailitem
                    .To = ws.Cells(k, "D")    '宛先
                    .CC = ws.Cells(k, "E")    'Cc
                    .Subject = "処理未済お知らせ"
                    .Body = "案件名:" & ws.Cells(k, "A") & vbCrLf _
                            & "期日:" & ws.Cells(k, "B")
                    'メールの表示
                    .Display  '■■デバッグのときに、表示させてメール内容を確認
                    '.Send    '■■動作確認後は、単に送信だけでよいと思う
                End With
            End If
        End If
    Next
    wb.Close
    Application.Quit
End Sub

ちなみに、自動実行ファイルの修正する際に、
・Explorerからではなく、
・ファイルの「開く」から、シフトキーを押したままで、「開く」をクリックして開くと、
自動実行を起動せずに開くことができます。(老婆心ながら)

回答
投稿日時: 24/11/18 14:37:34
投稿者: simple

既に用がなくなったのでしたら放置せずに閉じて下さい。

投稿日時: 24/11/20 22:41:51
投稿者: あこりこ

simpleさん
PCを修理に出した関係で確認が遅れてしまい、大変失礼いたしました。
試行錯誤途中でしたので追加でご教示頂いた内容を踏まえやってみます。
投稿は一先ずクローズさせて頂きます。
大変失礼致しました。

投稿日時: 24/11/20 22:43:02
投稿者: あこりこ

閉じ漏れのため閉鎖いたします。