Outlook 2010 で週報

週間報告(週報)で、タイトルに日付を入力しなきゃならないんだけれども、例によってめんどくさい。
これを自動挿入するように出来ないだろうか?


「Becky なら、シンボルを入れるだけで勝手にやってくれるのになぁ」と思いつつ、業務で指定されてる Outlook でのやり方を調べてみた。


やっぱりマクロか…
Excel ならともかく、Outlook だとマクロ使うの初めてかもしれない。


マクロがやることは、先に作りこんでおいたテンプレートを開いて、中身を書き換える…だけ。
ふむ、やってみよう。

条件

(1) 期間が先週木曜日から今週水曜日までの週報(Ym/Yd(木)〜Tm/Td(水) 週報-NAME)。
(2) 本文はテキストファイルからのコピペ
(3) Outlook でテンプレートを開いたら、もう送付できる状態だとうれしい
(4) バージョンは Outlook 2010 で検証する

概要

考えなきゃいけない処理。
・先週木曜日の日付を算出する
・今週水曜日の日付を算出する
・テキストファイルの中身をメールに追記する

作業中の感想

まずは、日付算出処理か…。
ん〜、先週の木曜日を割り出す方法が、ぱっと思いつかない。
なら、とりあえず now 関数でシリアル値から、今日の曜日をだしてみる。
そこから今週水曜日に日付を微調整すれば、今週水曜日の日付を出せるだろう。
効率がいいかどうかはともかく、わかりやすい。


ということで Weekday と Now で今日の曜日を出力し、そのまま Select case 文で調整する日付を変数へ。
シリアル値で日付を扱っているので、先週木曜日は、その 6 日前。
置換するときは Format で表示形式を整形して…と。


おぉ!
思った通りに変換できた〜。


次は、テキスト内容を読み込む処理…。
1行ずつ読み込んでは、変数に追加してくループ処理が必要?
思ったより大変そう…と思ったけど、データを一気に読み込む処理が FileSystemObject で出来るようだ。
参照先では「けっこう面倒くさいでしょ。だから、基本通りに、Line Inputステートメントで1行ずつ読み込むのが得策です。」って書いてあるけど、これは Excel での話。
Outlook では、その「改行ごとに分割して代入」という作業が必要なく、変数にまとめて入れてしまうので、むしろ「それがイイ」状態。
なんと、Replace でそのまんま使えた…思ったより楽に変換できた!
有用な情報をありがとうございます。


次に OutlookVBA を扱う際の、オレオレ証明書作成だね。
スタートから「VBAプロジェクトのデジタル証明」をクリックして、証明書には適当な名前を入力。
OKボタンを押すと「○○ に対する新しい証明書が作成できました。」と表示されるので、これもOKボタンを押す。
次は VBA から署名を読み込んで、適切に配置したら完了。
使う人はこの証明書を有効にしない限り、正しく使えないことに注意してもらわないと…だね。

Outlook テンプレート

送るメールのテンプレートは、とりあえずこんな内容にしてみた。

宛先アドレス :固定
件名:Ymm/Ydd(木)〜Tmm/Tdd(水) 週報-NAME
本文:
○○様
今週の報告です。

(テキスト貼り付け)

以上

これを普通にメール作成したら、ファイルタブから「名前をつけて保存」を選び、ファイルの種類で「Outlook テンプレート(*.oft)」で保存する。
ファイル名は"週報.oft"で保存した。
マクロを修正できるなら、自分がわかりやすいものに変更しておく。
ちなみに、ファイルの種類を選択した瞬間に「C:\Users\(ユーザ名)\AppData\Roaming\Microsoft\Templates」が保存先フォルダとして指定されるので、あまり保存先は意識しなくてもいい感じ。
ユーザ名だけ、正しいことをチェックしないといけないかな。


あと、前述したとおりメール内容はテキストエディタで書き換えて使いたいので、それもフォルダのパスをチェックしないといけないね。
複数行にタブを入れるとか、矩形選択をしたいときにできないとイライラするんだよね。
テキストファイルの内容を丸ごと変数に入れるとか、ちょっと心配になったので最大文字数を調べたけど、20億文字とか平気で入るらしいので大丈夫だろう。
ちなみに文庫本1冊が10万文字程度とのことなので、20億文字を使い切る週報って、どんだけだよって話になる。
提出する方も大変だけど、報告を受け取った方も、読むの大変じゃない?

VBA マクロ

Option Explicit
Public Sub 週報()
	' ### 定数/変数 定義 #####################################
	' メールテンプレート定数
	Const pTemplateFile = "C:\Users\(ユーザ名)\AppData\Roaming\Microsoft\Templates\週報.oft"
	' 週報内容定数
	Const pTextFile = "C:\Users\(ユーザ名)\Desktop\スケジュール.text"
	' 週報用変数
	Dim pWeeklyReport   As MailItem ' メールアイテム
	Dim pOwnerName      As String   ' 送信者名
	Dim pLastWeek       As Date     ' 先週木曜日のシリアル値
	Dim pThisWeek       As Date     ' 今週水曜日のシリアル値
	Dim pWeekShift      As Integer  ' シリアル値をシフトする日数
	Dim pText           As String   ' 週報の内容

	' ### 定数/変数 設定 #####################################
	pOwnerName = "(ユーザ名)"

	' 今週の水曜日までにシフトが必要な日数
	Select Case Weekday(Now)
	    Case vbSunday    ' 1
	        pWeekShift = 3
	    Case vbMonday    ' 2
	        pWeekShift = 2
	    Case vbTuesday   ' 3
	        pWeekShift = 1
	    Case vbWednesday ' 4
	        pWeekShift = 0
	    Case vbThursday  ' 5
	        pWeekShift = -1
	    Case vbFriday    ' 6
	        pWeekShift = -2
	    Case vbSaturday  ' 7
	        pWeekShift = -3
	End Select
	pThisWeek = Now + pWeekShift
	pLastWeek = pThisWeek - 6

	' ### メイン #############################################
	' テキスト内容を読み込んでおく
	With CreateObject("Scripting.FileSystemObject")
	    With .GetFile(pTextFile).OpenAsTextStream
	        pText = .ReadAll
	        .Close
	    End With
	End With

	Set pWeeklyReport = Application.CreateItemFromTemplate(pTemplateFile)

	' 件名での日付置換
	pWeeklyReport.Subject = Replace(pWeeklyReport.Subject, "TWmm/TWdd", Format(pThisWeek, "m/d"))
	pWeeklyReport.Subject = Replace(pWeeklyReport.Subject, "LWmm/LWdd", Format(pLastWeek, "m/d"))

	' 件名での名前置換
	pWeeklyReport.Subject = Replace(pWeeklyReport.Subject, "ThisNAME", pOwnerName)

	' 本文でのテキスト置換
	pWeeklyReport.Body = Replace(pWeeklyReport.Body, "(テキスト貼り付け)", pText)

	' メールアイテムの表示
	pWeeklyReport.Display

End Sub