Outlookの予定表で予定を登録する機会は多いかと思います。
そんな中であったらいいなと思うことは、
・ExcelにまとめたスケジュールをOutlookへ一括登録する方法はなに?
ではないでしょうか?
今回は、あると便利な
・ExcelからOutlook予定表のスケジュールを変更する方法
・ExcelからOutlook予定表へ終日の予定を登録する方法
についてまとめます!
もくじ
Excelにまとめたスケジュール一覧をOutlook予定表へ一括登録する処理の方法について
Excelにまとめたスケジュール一覧をOutlook予定表へ一括登録する処理の方法について説明をします。
Excelにまとめたスケジュール一覧は以下のようにします。
件名 | 場所 | 開始日時 | 終了日時 | 予定の本文 | 必須出席者 | 任意出席者 |
件名を入力 | 場所を入力 | 開始日時を”yyyy/mm/dd hh:mm:ss”形式で入力 | 終了日時を”yyyy/mm/dd hh:mm:ss”形式で入力 | 予定の本文を入力 | 必須出席者のアドレスを入力 | 任意出席者のアドレスを入力 |
マクロを実行すると、
Outlookの予定表へExcelにまとめたスケジュールが登録されます!
今回のマクロ実行環境はスケジュール一覧があるExcel側となります。
実行することで、Excelのスケジュールデータを一件づつ取り出しOutlookの予定表へ登録する流れとなります。
①Excelブック(VBA) → 予定表へスケジュールを登録して → Outlook
②Excelブック ← スケジュールを登録したよ ← Outlook
まとめてスケジュールを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 olItem As AppointmentItem
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
Dim i As Long
'スクリーンの更新は行われません。
Application.ScreenUpdating = False
'Excelのブックとワークシートのオブジェクトを設定します。
Set wbBook = ThisWorkbook
Set wsSheet = wbBook.Worksheets(1)
wsSheet.Activate
'Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。
Set olApp = New Outlook.Application
'取得結果を記述する行番号を指定します。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)
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, 6)
.OptionalAttendees = Cells(i, 7)
End With
'ここで保存
olItem.Save
Next
Else
MsgBox "処理を中断します"
Exit Sub
End If
'Null out the variables.
Set olItem = Nothing
Set olApp = Nothing
'Turn screen updating back on.
Application.ScreenUpdating = True
MsgBox "Outlook予定表の登録が完了しました!", vbInformation
End Sub
実装手順は以下の通りです。今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のマクロを入力します。
こちらで完了です。
VBAを実行する
①データを準備します。
サンプルでは前回取得したデータを元に、「開始日時」と「終了日時」に変更を加えています。
手動で入力する際には以下の項目に沿って記入をしてください。
件名 | 場所 | 開始日時 | 終了日時 | 予定の本文 | 必須出席者 | 任意出席者 |
件名を入力 | 場所を入力 | 開始日時を”yyyy/mm/dd hh:mm:ss”形式で入力 | 終了日時を”yyyy/mm/dd hh:mm:ss”形式で入力 | 予定の本文を入力 | 必須出席者のアドレスを入力 | 任意出席者のアドレスを入力 |
②「開発」タブの「マクロ」をクリックし「Outlookの予定表へ登録する」を選択し、「実行」をクリックします。
③Outlookの予定表へ登録されたら完成です!
念のためスケジュール表の中身も見てみましょう。
スケジュールの各項目も反映されていますね。
なお、今回は仕様上会議出席者を指定しても出席者へ連絡がされません。
また、2回同じ情報で登録した場合は、既存のスケジュールを変更するのではなく追加となりますのでご注意ください。
2回実施した場合はこうなります。
会議出席依頼の送信をする場合
【追加】予定アイテム重複スキップ版追加
予定表の中で、これから登録する件名と開始日時が登録済み予定アイテムと一致していたら
処理をスキップする処理を追加しました。
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
'重複チェックフラグ初期値設定
checkFlg = 0
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
Dim i As Long
'スクリーンの更新は行われません。
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
'取得結果を記述する行番号を指定します。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)
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, 6)
.OptionalAttendees = Cells(i, 7)
'重複チェック
For Each olItemBefor In olConItems
If TypeName(olItemBefor) = "AppointmentItem" Then
'登録されている予定表の件名と開始日時が一致していたらフラグを1にする
If olItemBefor.Subject = .Subject And olItemBefor.Start = .Start Then
checkFlg = 1
End If
End If
Next
If checkFlg <> 1 Then
'ここで保存
olItem.Save
End If
End With
'重複フラグリセット
checkFlg = 0
Next
Else
MsgBox "処理を中断します"
Exit Sub
End If
'Null out the variables.
Set olItem = Nothing
Set olApp = Nothing
'Turn screen updating back on.
Application.ScreenUpdating = True
MsgBox "Outlook予定表の登録が完了しました!", vbInformation
End Sub
【追加】予定アイテム重複スキップ&既存予定アイテム更新機能追加
予定表の更新をExcelからできるようにしました。
新規登録の場合はOutlook予定表に登録され、ExcelのI列に予定アイテムのIDが登録されます。
<tr”>件名を入力場所を入力開始日時を”yyyy/mm/dd hh:mm:ss”形式で入力終了日時を”yyyy/mm/dd hh:mm:ss”形式で入力予定の本文を入力必須出席者のアドレスを入力任意出席者のアドレスを入力空欄EntryIDが自動で入ります。
件名 | 場所 | 開始日時 | 終了日時 | 予定の本文 | 必須出席者 | 任意出席者 | 空欄 | EntryID |
更新の場合はその予定アイテムのIDと一致した場合に実施されるようにしました。
なお、タイトル、開始日、終了日が変更された場合のみ更新という条件となっていますので、
出席者や本文など変更した場合も更新したい場合は
If olItemBefor.Subject = olItem.Subject And olItemBefor.Start = olItem.Start And olItemBefor.End = olItem.End Then
こちらのif文の条件を緩和してください。
なお、if文を外すと問答無用にExcelリスト分の予定アイテムが更新されますのでご注意ください。
VBAは以下の通りとなります。
Sub Outlookの予定表へ登録する_重複スキップ_Excelリストから変更できる版()
'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
'重複チェックフラグ初期値設定
checkFlg = 0
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
Dim i As Long
'スクリーンの更新は行われません。
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
'取得結果を記述する行番号を指定します。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
With olItemBefor
.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, 6)
.OptionalAttendees = Cells(i, 7)
.Save
End With
End If
'Null out the variables.
Set olItem = Nothing
End If
End If
Next
If checkFlg <> 1 Then
'ExcelI列のEntryIDと登録されているEntryIDが一致していなかったら新規登録
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, 6)
.OptionalAttendees = Cells(i, 7)
.Save
End With
'ExcelI列へ発行されたEntryIDを書き込み
Cells(i, 9) = olItem.EntryID
End If
'重複フラグリセット
checkFlg = 0
Next
Else
MsgBox "処理を中断します"
Exit Sub
End If
'Null out the variables.
Set olItem = Nothing
Set olApp = Nothing
'Turn screen updating back on.
Application.ScreenUpdating = True
MsgBox "Outlook予定表の登録が完了しました!", vbInformation
End Sub
複数ユーザで登録する場合は予定ID(EntryID)が重複したり更新されますので、1ユーザのみで利用するようお願いします。
>>続いて、予定登録処理の高速版、終日予定の登録方法について説明します!
- 1
- 2
予定表をデフォルトの予定表ではなく、新しく作成した別の予定表に入れることはできますか?
いつもご利用ありがとうございます。
予定表をデフォルトの予定表ではなく、新しく作成した別の予定表を指定し登録する方法について
以下の記事にまとめておりますので、ご参考いただきたくお願いいたします。
https://extan.jp/?p=3341
olItemBeforは宣言しなくていいのでしょうか?
ご指摘ありがとうございます。
olItemBeforの宣言は入れるべきでした。大変失礼いたしました。
掲載のコードも修正させていただきました。
よろしくお願いいたします。