🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

2344閲覧

VBAでOutlookの予定を抽出したメールテンプレを作りたい

Jeter_dx

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/03/22 04:59

前提・実現したいこと

日々の日報テンプレートを自動作成するため、Outlook2016のアプリから当日の予定のタイトルのみを抽出し、メールテンプレートを作成するマクロを組もうとしております。

発生している問題・エラーメッセージ

下記のサイトを参考にし、テンプレートファイルのパスのみを変更したコードを実行したところ、予定の抽出自体は問題なくできているものの、抽出される予定に意図しないものが含まれておりました。
具体的には、定期的な予定として登録されているものが1週間分全て記載されてしまっております。
例えば、月曜日のみの予定を取得したいのに、火曜日や水曜日にある定期的な予定も含まれてしまう(定期的ではない予定については取得されない)、といった事象です。
http://wiki.tk2kpdn.com/outlook-get-appointments-by-macro/

該当のソースコード

VBA

1Public Sub CreateDailyMail() 2 Dim l_calendar As Outlook.Folder 3 Set l_calendar = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar) 4 5 Dim l_appointments As Outlook.Items 6 Set l_appointments = l_calendar.Items 7 8 Set l_appointments = l_appointments.Restrict( _ 9 "(([Start] = '2015/12/24 0:00') And ([AllDayEvent] = True)) Or " & _ 10 "(([Start] >= '2015/12/24 0:00') And ([End] < '2015/12/25 0:00'))") 11 12 Dim l_appointmentList As String 13 Dim l_appointment As Outlook.AppointmentItem 14 15 For Each l_appointment In l_appointments 16 l_appointmentList = l_appointmentList & l_appointment.Subject & vbCrLf 17 Next 18 19 ' テンプレート ファイルのパスの部分は、環境に応じて設定してください。 20 Dim l_mail As Outlook.MailItem 21 Set l_mail = Application.CreateItemFromTemplate("C:...\DailyReport.oft") 22 23 l_mail.Body = Replace(l_mail.Body, "<<Appointments>>", l_appointmentList) 24 25 l_mail.Display 26End Sub 27

試したこと

恐らく、l_appointments.Resctictの中の条件が上手く絞れていないことが原因かと思い、AllDayEventの条件を削除したりしたのですが、出力結果は変わらずでした。何か上記の事象が引き起こされる原因についてご助言いただけますと最愛です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Outlook で定期的な予定を展開して取得したい場合は、Items の IncludeRecurrences プロパティを True にする必要があります。
また、このプロパティを True にするには、開始日で予定をソートしておく必要もあります。
元のコードに上記の処理を追加し、余計な条件を削除すると以下のようになります。

VBA

1Public Sub CreateDailyMail() 2 Dim l_calendar As Outlook.Folder 3 Set l_calendar = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar) 4 5 Dim l_appointments As Outlook.Items 6 Set l_appointments = l_calendar.Items 7 8 l_appointments.Sort "[Start]" 9 l_appointments.IncludeRecurrences = True 10 Set l_appointments = l_appointments.Restrict( _ 11 "(([Start] >= '2015/12/24 0:00') And ([End] < '2015/12/25 0:00'))") 12 13 Dim l_appointmentList As String 14 Dim l_appointment As Outlook.AppointmentItem 15 16 For Each l_appointment In l_appointments 17 l_appointmentList = l_appointmentList & l_appointment.Subject & vbCrLf 18 Next 19 20 ' テンプレート ファイルのパスの部分は、環境に応じて設定してください。 21 Dim l_mail As Outlook.MailItem 22 Set l_mail = Application.CreateItemFromTemplate("C:...\DailyReport.oft") 23 24 l_mail.Body = Replace(l_mail.Body, "<<Appointments>>", l_appointmentList) 25 26 l_mail.Display 27End Sub

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.items.includerecurrences

投稿2021/04/02 02:28

millefeuille

総合スコア226

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FromMZ1500

2021/04/02 03:36

質問者さんは沙汰なしですが、IncludeRecurrences プロパティはたいへん参考になりました。
Jeter_dx

2021/06/10 04:36

大変失礼いたしました、確認遅くなってしまいましたがこちらで試してみた結果、無事抽出することができました。お二方ともご助言いただき、ありがとうございました!
guest

0

Start,Endともに対象日をまたいで設定された予定は入らないし、定期的な予定は無条件に含まれるようですね。
たぶんこれはこういうもので、基本その日中にStart,Endが設定されている単発予定だけを対象に考えて使うものなんでしょう。

定期的な予定を省くのは、For Eachのところで isRecurring を見てはじけばよいと思います。

定期的の条件をつぶさに見て省くのも検討したいところですが、AppointmentItem のインターフェースは定期的条件が簡単には取れないような感じです。さらには、定期的な予定の「ある日の予定」だけを切り離して個別の予定にしてしまった場合なども考慮すると、検索で対象を正確に捉えるのは データモデリング的に破綻している いろいろと難しすぎる 気がします。

投稿2021/03/24 07:09

FromMZ1500

総合スコア496

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問