連載
						
						ToDo完了後に毎回リスト更新、メール送信――VBAでその手順、削減しませんか?:働く価値を上げる“VBA/GAS”術(13)(2/4 ページ)
「この作業が終わったら報告しないと」――しかし、毎回メールで報告するのは面倒くさい作業です。今回は、ToDo完了してリストを変更したら自動でメールが送信される仕組みを紹介します。
ToDo完了メール送信マクロ
ToDoシートのステータスを「完了」に変更した際に動作するイベントプロシージャ「Sub Worksheet_Change(ByVal Target As Range)」を以下に記載します。なお、このプロシージャは標準モジュールではなく、シートモジュールに記載します。詳細は後述しますが、注意してください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Set myRange = Sheet1.ListObjects(1).ListColumns("ステータス").DataBodyRange
Dim r As Range
For Each r In Target
    If Not Intersect(myRange, r) Is Nothing And r.Value = "完了" Then
        Call ToDo完了メール送信(r.row)
    End If
Next r
End Sub
このプロシージャは、Sheet1でセルの値の変更があった際に自動で動作します。その際の処理の流れは以下になります。
- 変数myRangeにステータス欄の範囲を設定
- 変更されたセル範囲の各セルについて繰り返し
 ┗対象のセルがステータス欄の範囲に含まれており、かつその値が「完了」であれば
 ┗Subプロシージャ「ToDo完了メール送信(ByVal row As Long)」を呼び出す
また、イベントプロシージャ「Sub Worksheet_Change(ByVal Target As Range)」内で呼び出している「Sub ToDo完了メール送信(ByVal row As Long)」およびその中で使用している列挙体「e」の宣言については、以下の通り標準モジュールに記載します。
Public Enum e
    no = 1
    記入日
    タスク
    期限
    ステータス
End Enum
Sub ToDo完了メール送信(ByVal row As Long)
    
'各要素の作成
With Sheet1
    Dim myNo As Long: myNo = .Cells(row, e.no).Value
    Dim myTask As String: myTask = .Cells(row, e.タスク).Value
End With
Const MY_TO As String = "[email protected]"
Const RECIPIENT As String = "皆様"
Dim mySubject As String
mySubject = mySubject & "タスク完了メール: [" & myNo & "] " & myTask
Dim myBody As String: myBody = ""
myBody = myBody & RECIPIENT & "<br>"
myBody = myBody & "以下のタスクが完了しました<br>"
myBody = myBody & "[" & myNo & "] " & myTask
'メールの送信
Dim olApp As Outlook.Application: Set olApp = New Outlook.Application
Dim myMail As MailItem: Set myMail = olApp.CreateItem(olMailItem)
With myMail
    .To = MY_TO
    .Subject = mySubject
    .Display
    .HTMLBody = myBody & .HTMLBody
    .Send
End With
End Sub
このプロシージャの大まかな処理の流れは以下になります。
- 変更があった行のデータからNo、タスクを取得
- メールの送信先アドレス、件名、本文を文字列として生成
- 「Outlook.Application」オブジェクトの生成
- メールの作成および送信
Outlook.Applicationの操作、メールの作成は第11回、テーブルの操作や列挙体については第9回で紹介しているので、併せてご確認ください。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
 「数百のファイルを1つ1つ開くの面倒……」、複数のExcelデータを1箇所に集約するマクロ術 「数百のファイルを1つ1つ開くの面倒……」、複数のExcelデータを1箇所に集約するマクロ術
 経費精算書のように「バラバラのデータを1箇所に集約すること」は、多く発生する業務の1つです。しかし、1つ1つのファイルを開きコピー&ペーストするのは手間が掛かる業務。その業務を、マクロを使って自動化する方法を紹介します。
 「計算式エラーで残業確定……」、GASで入力データのチェックツールを作成 「計算式エラーで残業確定……」、GASで入力データのチェックツールを作成
 1つのGoogleスプレッドシートを複数人で共同編集するとき、想定していた形式とは違うデータを入力されると、不備が発生してしまう場合があります。そのような問題を、GASで解決するにはどうすればいいのでしょうか。
 プログラム自動実行で仕事を楽に! APIでSlackなどと連携できる「Google Apps Script」とは プログラム自動実行で仕事を楽に! APIでSlackなどと連携できる「Google Apps Script」とは
 日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、Googleが提供する数々のアプリケーションを操作できる「Google Apps Script」を紹介する。※ショートカットキーの解説あり
