Outlook 2010 で週報
週間報告(週報)で、タイトルに日付を入力しなきゃならないんだけれども、例によってめんどくさい。
これを自動挿入するように出来ないだろうか?
「Becky なら、シンボルを入れるだけで勝手にやってくれるのになぁ」と思いつつ、業務で指定されてる Outlook でのやり方を調べてみた。
やっぱりマクロか…
Excel ならともかく、Outlook だとマクロ使うの初めてかもしれない。
マクロがやることは、先に作りこんでおいたテンプレートを開いて、中身を書き換える…だけ。
ふむ、やってみよう。
参考サイト様へのリンク
今回の文章を作成するにあたって、参照したサイトを列記します。
テンプレートに自動で今日の日付を設定するマクロ | Outlook 研究所
新規作成のメッセージに日付を埋め込む方法 | Outlook 研究所
http://samuraishockdo.info/webmaga/16-code/58-outlook-vba.html
Office TANAKA - ファイルの操作[テキストファイルを操作する(読み込む)]
Outlookを再起動したらマクロが動かなくなったので、有効化した。 - koroharoの日記
有用な情報を頂き、大変助かりました。
ありがとうございます。
条件
(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 でそのまんま使えた…思ったより楽に変換できた!
有用な情報をありがとうございます。
次に Outlook で VBA を扱う際の、オレオレ証明書作成だね。
スタートから「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