質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

Outlook

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

マクロ

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

5326閲覧

Outlook マクロでカレンダーから今日の予定を取得して日報メールにしたい

skel

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

Outlook

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

マクロ

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2021/02/17 02:53

編集2021/02/17 05:28

前提・実現したいこと

Outlook 2016において今日の予定と明日の予定を取得し
日報メールの本文に入れ込むマクロを組みたいと思っています。
下記のようなメールをotfとして保存してあり、予定一覧の部分を書き換えるコードです。

●●さん 皆様
おはようございます。
本日の業務を開始いたします。
よろしくお願いいたします。
■今日の実績
<<Todays Appointments>>
<<Todays Meetings>>
■明日の予定
<<Tomorrows Appointments>>
<<Tomorrows Meetings>>

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

単独の予定(Appointments)は取得されるのですが
会議(Meetings)が取得されません。
エラー表示は出ていません。
なにとぞ解決方法をご教示ください。

該当のソースコード

Public Sub CreateDailyMailStart() Dim l_today As Date l_today = Date Dim l_tomorrow As Date l_tomorrow = GetNextDate(l_today) ' テンプレートからメールを新規作成します。 Dim l_mail As Outlook.MailItem Set l_mail = Application.CreateItemFromTemplate("oftファイルのパス") l_mail.Subject = Replace(l_mail.Subject, "<<Date>>", Format(l_today, "yyyy/mm/dd (ddd)")) l_mail.Body = Replace(l_mail.Body, "<<Date>>", Format(l_today, "yyyy/mm/dd (ddd)")) Dim l_appointments As Outlook.Items ' 本日の予定 (会議以外) を検索し、メールの本文に埋め込みます。 Set l_appointments = FindAppointments(l_today, OlMeetingStatus.olNonMeeting) l_mail.Body = Replace(l_mail.Body, "<<Todays Appointments>>", CreateApplintmentList(l_appointments)) ' 本日の予定 (会議) を検索し、メールの本文に埋め込みます。 Set l_appointments = FindAppointments(l_today, OlMeetingStatus.olMeeting) l_mail.Body = Replace(l_mail.Body, "<<Todays Meetings>>", CreateApplintmentList(l_appointments)) ' 明日の予定 (会議以外) を検索し、メールの本文に埋め込みます。 Set l_appointments = FindAppointments(l_tomorrow, OlMeetingStatus.olNonMeeting) l_mail.Body = Replace(l_mail.Body, "<<Tomorrows Appointments>>", CreateApplintmentList(l_appointments)) ' 明日の予定 (会議) を検索し、メールの本文に埋め込みます。 Set l_appointments = FindAppointments(l_tomorrow, OlMeetingStatus.olMeeting) l_mail.Body = Replace(l_mail.Body, "<<Tomorrows Meetings>>", CreateApplintmentList(l_appointments)) ' メールを表示します。 l_mail.Display End Sub ' 予定を検索します。 ' <params> ' p_date ' 検索対象の日付。 ' p_meetingStatus ' 検索対象の会議の状態。会議の場合は olMeeting を、会議以外の場合は olNonMeeting を指定します。 ' <returns> ' p_date および p_meetingStatus で指定された条件に一致する、0 個以上の予定。 Private Function FindAppointments( _ ByVal p_date As Date, ByVal p_meetingStatus As Outlook.OlMeetingStatus) As Outlook.Items ' 予定表を取得します。 Dim l_calendar As Outlook.Folder Set l_calendar = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar) ' 予定表に登録されているすべての予定を取得します。 Dim l_appointments As Outlook.Items Set l_appointments = l_calendar.Items ' 定期的な予定を検索に含めます。 l_appointments.IncludeRecurrences = True l_appointments.Sort "[Start]" ' 終日の AppointmentItem を抽出するフィルターを作成します。 Dim l_filterDate As String l_filterDate = "([Start] = " & FormatFilterDateTime(p_date) & ") And ([AllDayEvent] = True)" ' 開始時刻、終了時刻の指定がある AppointmentItem を抽出するフィルターを作成します。 Dim l_filterDateTime As String l_filterDateTime = _ "([Start] >= " & FormatFilterDateTime(p_date) & ")" & _ " And ([End] < " & FormatFilterDateTime(GetNextDate(p_date)) & ")" ' 予定が会議か、会議以外かを区別するフィルターを作成します。 Dim l_filterMeetingStatus As String l_filterMeetingStatus = "[MeetingStatus] = " & p_meetingStatus ' フィルターを組み立てます。 Dim l_filter As String l_filter = "((" & l_filterDate & ") Or (" & l_filterDateTime & ")) And (" & l_filterMeetingStatus & ")" ' 予定表に登録されているすべての予定に対して、フィルターを適用します。 Set l_appointments = l_appointments.Restrict(l_filter) Set FindAppointments = l_appointments End Function ' 0 個以上の予定の内容が改行で結合された文字列を作成します。 ' <params> ' p_appointments ' 予定のコレクション。 ' <returns> ' p_appointmentItems の各項目の内容が改行で結合された文字列。 Private Function CreateApplintmentList(ByVal p_appointments As Items) As String Dim l_count As Integer l_count = GetItemCount(p_appointments) Dim l_appointmentList As String Dim i As Integer For i = 1 To l_count l_appointmentList = l_appointmentList & "・" & p_appointments(i).Subject If i < l_count Then l_appointmentList = l_appointmentList & vbCrLf End If Next CreateApplintmentList = l_appointmentList End Function ' Outlook.Items オブジェクト内の項目の数を取得します。 ' <params> ' p_items ' 項目の数を取得する対象のコレクション。 ' <returns> ' p_items に含まれる項目の数。 ' <remarks> ' コレクション内に定期的な予定が存在する場合は、Items.Count の値は Long 型の最大値になるようです。 ' (たとえば、実際の予定は 3 件でも、Items.Count の値は 2,147,483,647 になっています。) ' そのため、実際の項目数を調べるためのこのメソッドを用意しました。 Private Function GetItemCount(ByVal p_items As Outlook.Items) As Long Dim l_item As Object Dim l_count As Integer l_count = 0 ' p_items の実際の項目数を調べます。 For Each l_item In p_items l_count = l_count + 1 Next GetItemCount = l_count End Function ' フィルターに適した日時の書式を適用します。 ' たとえば、指定した日時が #2015/5/1 5:06:07# であれば、2015/05/01 5:06" という文字列になります。 ' <params> ' p_date ' フィルターに適した日時の書式を適用する対象の日時。 ' <returns> ' p_date に書式が設定された文字列。 Private Function FormatFilterDateTime(ByVal p_date As Date) As String FormatFilterDateTime = "'" & Format(p_date, "yyyy/mm/dd h:nn") & "'" End Function ' 指定した日の翌日の日付を取得します。 ' <params> ' p_date ' 翌日の日付を取得する対象の日時。 ' <returns> ' p_date の翌日の日付。 Private Function GetNextDate(ByVal p_date As Date) As Date GetNextDate = DateAdd("d", 1, p_date) End Function

補足情報(FW/ツールのバージョンなど)

Windows10, outlook2016

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

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

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

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

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

jinoji

2021/02/17 03:33

MeetingStatusの条件をなくした場合は予定と会議のどちらも取得できますか?
jinoji

2021/02/17 03:48

動作の可否とは関係ないですが・・・ ・CreateApplintmentListのスペルミスがモヤモヤする。 ・GetItemCountしなくてもCreateApplintmentListの中でForEachすればいいのでは。
skel

2021/02/17 12:43

MeetingStatusの条件をなくした場合は予定と会議のどちらも取得できますか? →はい、この場合はどちらも取得できます。もうこれでもいいような気がしてきました。
jinoji

2021/02/17 12:59

CreateApplintmentList の中でp_appointments(i).MeetingStatus をチェックするという手もあるのかな、と思いました。 本当にOlMeetingStatus.olMeeting が入っているかどうかも気になりますし。
skel

2021/02/22 06:01

原因はよくわかりませんが、やはりOlMeetingStatus.olMeetingが検知されないようです。 Outlook2016の問題のような気もしてきました。 とりあえず予定を抽出して日報のメールを組み立てる部分はできたので、 とりあえずは完了とさせていただきます。 アドバイスいただき誠にありがとうございます。
guest

回答1

0

自己解決

アドバイスの通り、会議と予定のフィルター(下記のコードをコメントアウト)したら
会議も取得できるようになりました。
ありがとうございました。

Set l_appointments = FindAppointments(l_today, OlMeetingStatus.olMeeting) l_mail.Body = Replace(l_mail.Body, "<<Todays Meetings>>", CreateAppointmentList(l_appointments))

投稿2021/02/17 12:48

skel

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問