Outlookの予定表で終日の予定を登録する機会は多いかと思います。
例えば休暇や外出で終日不在の場合などの都合で予定へ登録する時でしょうか。
そんな中で面倒ことことは、
・Excelでまとめた予定情報をVBAで予定登録したいが方法がわからない
ではないでしょうか?
実はOutlookとExcelのVBAを組み合わせて利用すると
Excelでまとめた予定情報から時間指定の予定や終日の予定を振り分けながら同時に登録することができるのです。
今回はそんな実用性が高い、
についてまとめます!
もくじ
Excelにまとめた予定情報からOutlookの予定出席依頼を送信する方について
今回のマクロ実行環境はスケジュール一覧があるExcel側となります。
Excelの予定情報一覧から一件づつ取り出しOutlookの予定表へ予定を登録する流れとなります。
①Excelブック(VBA) → 予定表へ予定を登録して → Outlook
②Excelブック ← 予定を登録したよ ← Outlook
次に早速実装をして動かしてみましょう!
Excel VBAからOutlookを操作するための下準備
①まずExcelを起動し、「開発」タブをクリックします。
②VBEの画面が開いたら、メニューから「ツール」>「参照設定」を選択します。
③「Microsoft Outlook XX.X Object Library」を探してチェックボックスにチェックし「OK」をクリックします。
以上です。
VBAを実装する
続いてVBAを実装します。
今回VBAは以下の通りとなります。
Sub Outlookの予定表へ終日の予定を登録する()
'Outlook用の定義
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Folder
Dim olConItems As Outlook.Items
Dim olItem As AppointmentItem
Dim olItemBefor As AppointmentItem
Dim checkFlg As Long
Dim i As Integer
'重複チェックフラグ初期値設定
checkFlg = 0
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
'抽出期間の定義
Dim strStart As String
Dim strEnd As String
Dim intKikan As Integer
'対象予定表の抽出期間を月単位で指定します。
'※抽出期間が短いと予定アイテムのチェックができず登録できない場合がありますので注意してください。
intKikan = 12 '抽出期間を12か月にしています。
strStart = Format(DateAdd("m", -intKikan, Date), "yyyy/mm/dd") '抽出するスケジュールの開始日を指定
strEnd = Format(DateAdd("m", intKikan, Date), "yyyy/mm/dd") '抽出するスケジュールの終了日を指定
'スクリーンの更新は行われません。
Application.ScreenUpdating = False
'Excelのブックとワークシートのオブジェクトを設定します。
Set wbBook = ThisWorkbook
Set wsSheet = wbBook.Worksheets(1)
wsSheet.Activate
'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
Set olApp = New Outlook.Application
Set olNamespace = olApp.GetNamespace("MAPI")
Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
Set olConItems = olFolder.Items
'Restrictメソッドで期間指定して抽出するメールアイテムを絞り込む
Set olConItems = olConItems.Restrict("[Start] >= '" & strStart & "' And [End] < '" & strEnd & "'")
'取得結果を記述する行番号を指定します。2行目のセルから開始されることになります。
lnContactCount = 2
Dim rc As Integer
rc = MsgBox("予定表へ登録しますか?", vbYesNo + vbQuestion, "確認")
If rc = vbYes Then
'予定表一覧の件数分繰り返す。
For i = lnContactCount To Cells(1, 1).End(xlDown).Row
Set olItem = olApp.CreateItem(olAppointmentItem)
'重複チェック&更新処理
For Each olItemBefor In olConItems
If TypeName(olItemBefor) = "AppointmentItem" Then
'ExcelI列のEntryIDと登録されているEntryIDが一致していたら該当予定表を更新
If olItemBefor.EntryID = Cells(i, 9) Then
'比較用に一時的に作成
With olItem
.Subject = Cells(i, 1)
.Start = Format(Cells(i, 3), "yyyy/mm/dd hh:mm:ss")
.End = Format(Cells(i, 4), "yyyy/mm/dd hh:mm:ss")
End With
'重複フラグ1をセット
checkFlg = 1
'登録されている予定表の件名と開始日時及び終了日時が一致していなかった場合のみ更新します。
'※更新の条件はご都合に応じて変更してください。この条件が無い場合はExcelの予定表すべて更新されますので、ご注意ください。
If olItemBefor.Subject = olItem.Subject And olItemBefor.Start = olItem.Start And olItemBefor.End = olItem.End Then
Else
'定期アイテムは除外します。
If Not olItemBefor.IsRecurring Then
With olItemBefor
.Subject = Cells(i, 1)
.Location = Cells(i, 2)
.Start = Format(Cells(i, 3).Value, "yyyy/mm/dd hh:mm:ss")
.End = Format(Cells(i, 4).Value, "yyyy/mm/dd hh:mm:ss")
.Body = Cells(i, 5)
.RequiredAttendees = Cells(i, 7)
.OptionalAttendees = Cells(i, 8)
'終日の予定であるか指定します。
.AllDayEvent = Cells(i, 11)
.Save
End With
End If
End If
'Null out the variables.
Set olItem = Nothing
End If
End If
Next
'EntryIDが空である場合のみ新規登録をします。
If checkFlg <> 1 And Cells(i, 9) = "" Then
With olItem
.Subject = Cells(i, 1)
.Location = Cells(i, 2)
.Start = Format(Cells(i, 3), "yyyy/mm/dd hh:mm:ss")
.End = Format(Cells(i, 4), "yyyy/mm/dd hh:mm:ss")
.Body = Cells(i, 5)
.RequiredAttendees = Cells(i, 7)
.OptionalAttendees = Cells(i, 8)
'終日の予定であるか指定します。
.AllDayEvent = Cells(i, 11)
.Save
End With
'ExcelI列へ発行されたEntryIDを書き込み
Cells(i, 9) = olItem.EntryID
'ExcelF列へ予約者を書き込み
Cells(i, 6) = olItem.Organizer
End If
'重複フラグリセット
checkFlg = 0
Next
Else
MsgBox "処理を中断します"
End If
'オブジェクトを解放します。
Set olItem = Nothing
Set olApp = Nothing
Set wbBook = Nothing
Set wsSheet = Nothing
Set olNamespace = Nothing
Set olFolder = Nothing
Set olConItems = Nothing
Set olItemBefor = Nothing
'スクリーンの更新をオンにします。
Application.ScreenUpdating = True
MsgBox "Outlook予定表の登録が完了しました!", vbInformation
End Sub
実装手順は以下の通りです。今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のマクロを入力します。
こちらで完了です。
予定出席依頼のデータを準備する
予定出席依頼のデータを準備しましょう。
1日だけ終日の予定を指定する
VBAを実装したExcelのシートへ
以下の項目に沿って記入をしていきます。
件名 | 場所 | 開始日時 | 終了日時 | 予定の本文 | 予約者 | 必須出席者 | 任意出席者 | EntryID | 定期的な予定 | 終日の予定 |
件名を入力 | 場所を入力 | 開始日時を”yyyy/mm/dd hh:mm:ss”形式で入力 | 終了日時を”yyyy/mm/dd hh:mm:ss”形式で入力 ※終日指定の場合は開始日に1日プラスしてください。 |
予定の本文を入力 | 予約者が登録後入ります。空でOKです。 | 必須出席者のアドレスを入力 | 任意出席者のアドレスを入力 | 予定識別子のEntryIDが登録後入ります。FALSEと入力してください。 | 定期的な予定のフラグが入ります。空でOKです。 | 終日の予定のフラグが入ります。終日予定はTRUE、時間指定はFALSEとしてください。 |
終日の予定(1日) | 2021/6/18 0:00 | 2021/6/19 0:00 | 本文 | FALSE | TRUE |
開始日時と終了日時は24時間あけるようお願いします。
3日間終日の予定を指定する
複数日の終日の予定を入力します。
件名 | 場所 | 開始日時 | 終了日時 | 予定の本文 | 予約者 | 必須出席者 | 任意出席者 | EntryID | 定期的な予定 | 終日の予定 |
終日の予定(3日) | 2021/6/15 0:00 | 2021/6/18 0:00 | 本文 | FALSE | TRUE |
なお時間をを入力したとしても登録時に0時へ変換されますのでご注意ください。
VBAを実行し、終日の予定を登録する
1日だけ終日の予定を指定する
①1日だけ終日の予定を指定したExcelシートを開きます。
②「開発」タブの「マクロ」をクリックします。
③「Outlookの予定表へ終日の予定を登録する」を選択し、「実行」をクリックします。
④メッセージ「Outlook予定表の登録が完了しました!」が表示されば完成です!
終日の予定が登録されましたね。
3日間終日の予定を指定する
①3日間の終日の予定を指定したExcelシートを開きます。
②「開発」タブの「マクロ」をクリックします。
③「Outlookの予定表へ終日の予定を登録する」を選択し、「実行」をクリックします。
④メッセージ「Outlook予定表の登録が完了しました!」が表示されば完成です!
3日間分の終日の予定が登録されましたね。
3日間の終日の予定を1日へ変更する
これまで新規登録の操作を行ってきましたので、次は登録した終日の予定の期間を変更したいと思います。
サンプルでは3日間の期間指定を1日へ短縮し、値を変更しています。
また、変更にあたり、EntryIDが入力されているか確認をしてください。
①予定を変更したExcelシートを開きます。
②「Outlookの予定表へ終日の予定を登録する」を選択し、「実行」をクリックします。
③メッセージ「Outlook予定表の登録が完了しました!」が表示されば完成です!
終日の予定の期間が変更されましたね!
今回のVBAについて説明
今回のVBAは「【VBA】一瞬でExcelワークシートからOutlookの予定表へスケジュールを登録する」で公開いしている「Outlookの予定表へ登録する_高速版」をもとに機能追加したものになります。
詳細は「【VBA】一瞬でExcelワークシートからOutlookの予定表へスケジュールを登録する」をご参照ください。
今回VBAを追加した箇所は、
となります。
AllDayEventプロパティはブール値となり、Trueであれば時間ではなく終日のイベント、Falseであらば時間帯指定の予定を指定することができます。
サンプルコードでは以下のように、Excelシートの11列目(K)列の値を参照し、AllDayEventプロパティへ渡しています。
追加した箇所は二か所で、
新規作成の処理と更新の処理の箇所となります。
EntryIDが空である場合のみ新規登録をします。
ExcelI列のEntryIDと登録されているEntryIDが一致していたら該当予定表を更新します。
最後にSaveメソッドで予定を登録します。
さいごに
いかがでしょうか。
今回は
についてまとめました。
Outlookの操作は手作業が多いですからなるべく自動化して効率化をしていきましょう!
タカヒロ様、早々にご返信いただきましてありがとうございます。
ご教示頂いた通りに修正したところ、無事に動作いたしました。活用させて頂きます。誠にありがとうございました。
初めまして。どうしても解決できなかった為質問させていただけますでしょうか。
本記事の「Outlookの予定表へ終日の予定を登録する」マクロを使用させて頂きまして、
うまく動作したので、これを追加予定表へ登録するようにしたく、
Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
の部分を
Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar).Folders(“追加予定表”)
に変えましたが、うまくいきませんでした。(メインの予定表に追加されてしまいます。)
他の方のコメントを参考にして下記も確認しましたが、
①プロパティで場所を確認 → \\自分のアドレス\予定表 になっている
②アカウント設定のデータファイルを確認 → 自分のアドレスが規定になっている
だったので、他に原因があるのではないかと思い、質問させて頂きました。
お手すきの際にご教示いただけますと幸いです。
恐れ入りますが、よろしくお願いいたします。
いつもご利用ありがとうございます。
フォルダ指定しても規定フォルダ直下に保存されてしまう件ですが、
こちら申し訳ありません、説明が足りておりませんでした。
CreateItemメソッドで予定アイテムを作成し、Saveメソッドで保存した場合、保存先は規定のフォルダとなりますが、
別フォルダを指定することはできないので、規定のフォルダに保存した予定アイテムを別フォルダに移す処理が必要となります。
移す処理はMoveメソッドを使用し、以下のようにMoveの引数に移動先のフォルダを指定します。
■変更前
.Save
■変更後
.Save
.Move olFolder
ご確認のほどよろしくお願いします。