【VBA】他人のOutlook予定表へExcelから登録、編集、代理送信する方法

Outlookの自分以外の予定表でスケジュール共有を行うことは多いかと思います。

そんな中で困ることは、

・VBAを使いOutlookの自分以外の予定表でスケジュール共有する方法がわからない
・VBAを使いOutlookの自分以外の予定表から会議出席依頼をする方法がわからない

ですね。

他人が共有している予定の一覧を取得した上、

さらにExcelの一覧表からOutlookの予定表を登録、編集できるととても便利ですよね。

今回は、

・VBAでExcelの予定表一覧から、他人のOutlook予定表へ登録、編集、会議出席依頼を送信する方法
・代理人として会議出席依頼を送信する方法

についてまとめます!

Excelへ取り込んだ予定表の一覧から、他人のOutlook予定表を登録、編集する流れ

今回のVBAの実装先は、Excelブック側となります。

前回Excelブック側に取り込んだ予定表を使いますので、
【Excel VBA】Outlookの他人の予定表をExcelワークシートへ取り込む

①②が前回分、今回は③④の部分になります。

Excelブック(VBA) → この人の予定一覧ちょうだい → Outlook
Excelブック ← 予定一覧を出すよ ← Outlook
Excelブック(VBA) → この人のこのスケジュールを更新してね → Outlook
Excelブック ← スケジュールを更新したよ ← Outlook

次ではVBAの実装方法について説明をします。

Excel VBAからOutlookを操作するための下準備

①まずExcelを起動し、「開発」タブをクリックします。

②VBEの画面が開いたら、メニューから「ツール」>「参照設定」を選択します。

③「Microsoft Outlook XX.X Object Library」を探してチェックボックスにチェックし「OK」をクリックします。

以上です。

サンプルの他人の予定一覧を準備する

続いてスケジュールの変更をしたい他人の予定一覧をExcelブック側に用意します。

前回Excelブック側に取り込んだ予定表を使いますので、以下を参照の上用意をしてください。

【Excel VBA】Outlookの他人の予定表をExcelシートへ取り込む方法

サンプルでは「hanako@extan.jp」の予定表を指定しています。

2つは単体の予定で、3つ目は週次の定期的な予定となります。

件名 場所 開始日時 定期的な予定
Test1 Microsoft Teams 会議 2020/9/1 9:30 なし
Test2 Microsoft Teams 会議 2020/9/2 10:00 なし
Test3 定例 Microsoft Teams 会議 2020/9/3 10:00 あり、週次開催

Excel側の予定表一覧です。

なお、今回は定期的な予定は仕様により処理対象から外しています。
ご了承ください。

VBAを実装する

続いてExcelのVisual Basic EditorへVBAを実装します。

今回のVBAはExcelブックへ取り込んだ他人の予定表からOutlookの予定表へ変更、新規追加できるようにしたものです。

実装にあたり、変更頂きたい箇所は2点です。

誰の予定表を取得するか、メールアドレスを指定する
対象予定表のアドレスを指定してください。

strAddress = “hanako@extan.jp”

・取得する期間を指定する
対象予定表の抽出期間を指定します。※変更する場合は以下の日付を変更してください。

strStart = Format(“2020/09/1”, “yyyy/mm/dd”) ‘抽出するスケジュールの開始日を指定
strEnd = Format(“2020/09/30”, “yyyy/mm/dd”) ‘抽出するスケジュールの終了日を指定

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 checkFlg As Long
    
    '重複チェックフラグ初期値設定
    checkFlg = 0

    '操作対象の他人のアドレスを指定
    Dim strAddress As String
    strAddress = "hanako@extan.jp"
    
    
    'Excel用の定義
    Dim wbBook As Workbook
    Dim wsSheet As Worksheet
    
    Dim lnContactCount 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 recOther = olNamespace.CreateRecipient(strAddress)
    Set olFolder = olNamespace.GetSharedDefaultFolder(recOther, olFolderCalendar)
    Set olConItems = olFolder.Items
    
    '自分自身のアイテムを更新する場合は以下をアクティブにしてください。
    '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 = olConItems.Add()


                '重複チェック&更新処理
                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 Cells(i, 10) = "False" Then
                                     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
                                
                            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 "処理を中断します"
    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を入力します。

こちらで完了です。

VBAを実行する

ExcelからOutlook予定表の単体の予定を変更する

①サンプルではExcel側の件名「Test1」の予定の開始日時を以下のように変更しました。

変更前

件名 場所 開始日時 定期的な予定
Test1 Microsoft Teams 会議 2020/9/1 9:30 FALSE

変更後

件名 場所 開始日時 定期的な予定
Test1 Microsoft Teams 会議 2020/9/1 10:00 FALSE

 

では早速VBAの実行をしてみましょう。

①「開発」タブの「VBA」をクリックし「他人のOutlookの予定表へ登録する」を選択し、「実行」をクリックします。

②「Outlook予定表の登録が完了しました!」が表示され、
Outlook予定表が変更されましたね。

変更前

変更後

ExcelからOutlook予定表へ予定を新規追加する

①サンプルではExcel側の件名「Test4」で「EntryID」がの予定を追記しました。

追加

件名 開始日時 終了日時 EntryID 定期的な予定
Test4 2020/9/4 10:00 2020/9/4 11:30 FALSE

では早速VBAの実行をしてみましょう。

②「開発」タブの「VBA」をクリックし「他人のOutlookの予定表へ登録する」を選択し、「実行」をクリックします。

③「Outlook予定表の登録が完了しました!」が表示され、
Outlook予定表が変更されました。

変更前

変更後

ExcelからOutlook予定表の複数の予定を変更する

①サンプルではExcel側の件名「Test1」、「Test2」の予定の開始日時を以下のように変更しました。

変更前

件名 開始日時 終了日時 定期的な予定
Test1 2020/9/1 10:00 2020/9/1 10:30 FALSE
Test2 2020/9/2 10:00 2020/9/1 10:30 FALSE
Test4 2020/9/4 10:00 2020/9/4 10:30 FALSE

変更後

件名 開始日時 終了日時 定期的な予定
Test1 2020/9/1 10:00 2020/9/1 11:30 FALSE
Test2 2020/9/2 10:00 2020/9/2 11:30 FALSE
Test4 2020/9/4 10:00 2020/9/4 11:30 FALSE

VBAの実行をしてみましょう。

②「開発」タブの「VBA」をクリックし「他人のOutlookの予定表へ登録する」を選択し、「実行」をクリックします。

②「Outlook予定表の登録が完了しました!」が表示され、
Outlook予定表が変更されました。

変更前

変更後

ExcelからOutlook予定表の予定の件名を変更する

①サンプルではExcel側の件名「Test1」の件名を「Test1 変更」へ変更しました。

件名 開始日時 終了日時 定期的な予定
Test1 変更 2020/9/1 10:00 2020/9/1 11:30 FALSE

VBAの実行をしてみましょう。

②「開発」タブの「VBA」をクリックし「他人のOutlookの予定表へ登録する」を選択し、「実行」をクリックします。

③「Outlook予定表の登録が完了しました!」が表示され、
Outlook予定表が変更されましたね!

 

Outlookの予定表を編集できること

Outlookの予定表を編集できることはまだあります。

会議場所の変更

サンプルでは空欄ですが、会議場所の変更が行うことができます。TeamsやSkypeなどオンライン会議の場合はOutlook側から指定をするようにお願いします。

予定の本文の変更

本文の内容を変更することができます。

ただし、注意いただきたい点はText形式になってしまうことです。
ハイパーリンクなどHTML形式で保存している場合はText形式に変更されますので、無効化をするようにお願いします。

なお、無効化する場合は以下を

.Body = Cells(i, 5)

コメントアウト

.Body = Cells(i, 5)

してください。

会議出席者の変更

必須、任意出席者の変更をすることができます。
複数入れる場合は「;」で区切るようにしてください。

今回のVBAについて説明

Outlookオブジェクトを設定し、MAPI名前空間を介してOutlookの予定表を取得します。

Set olApp = New Outlook.Application
Set olNamespace = olApp.GetNamespace(“MAPI”)

今回追加したところは、他人のオブジェクトを指定し取得する処理です。
strAddressは上記で設定した他人のアドレスが格納されています。

Set recOther = olNamespace.CreateRecipient(strAddress)

取得した他人のオブジェクトの内、予定表のみ絞り込み再取得します。
予定表のリストはolFolderCalendarというメンバーに格納されていますのでそれを指定しています。

Set olFolder = olNamespace.GetSharedDefaultFolder(recOther, olFolderCalendar)

自分自身のアイテムを更新する場合は以下をアクティブにしてください。


‘Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
‘Set olConItems = olFolder.Items

コードではolItemオブジェクトのタイプ名が”AppointmentItem”だった場合に処理を進めるようにしています。

If TypeName(olItem) = “AppointmentItem” Then

ExcelI列のEntryIDと登録されているEntryIDが一致していたら該当予定表を更新します。

If olItemBefor.EntryID = Cells(i, 9) Then

登録されている予定表の件名と開始日時及び終了日時が一致していなかった場合のみ更新します。
※更新の条件はご都合に応じて変更してください。この条件が無い場合はExcelの予定表すべて更新されますので、ご注意ください。

<strong>If olItemBefor.Subject = olItem.Subject And olItemBefor.Start = olItem.Start And olItemBefor.End = olItem.End Then</strong>

定期的な予定でない場合変更します。

<strong>If Cells(i, 10) = "False" Then</strong>

Excel側の値を読み込み、予定オブジェクトにセットします。

.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)
件名:Subject
場所:Location
開始日時:Start
終了日時:End
予定の本文:Body
予約者:Organizer
必須出席者:RequiredAttendees
任意出席者:OptionalAttendees

ここで保存されます。

.Save

ExcelI列のEntryIDと登録されているEntryIDが一致していなかったら新規登録します。

If checkFlg <> 1 Then

新規の場合は発行されたEntryIDをExcelシートのI列へ書き込みます。

Cells(i, 9) = olItem.EntryID

代理人として会議出席依頼を送信する場合の設定

現在予定表へ会議の予定アイテムを保存する設定となっています。

代理人として会議出席者へ出席依頼を送信する場合は、以下コードの

.Save

.MeetingStatus = 1
.Send

へ変更します。

タカヒロ

タカヒロ
ソースコード中の変更箇所は2か所となりますので、ご注意ください。

MeetingStatusプロパティの設定値は以下の通りです。
1及び「olMeeting」を指定すると、会議メールとして扱われます。

名前 説明
olMeeting 1 予定が組まれた状態。
olMeetingCanceled 5 予定が取り消された状態。
olMeetingReceived 3 参加要請が受信された状態。
olMeetingReceivedAndCanceled 7 予定されていた会議が取り消されたが、ユーザーの予定表にはまだ表示されている状態。
olNonMeeting 0 参加者なしで予定が組まれた状態。 予定表に休日を設定する際、この状態が生じることがあります。

参考:https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olmeetingstatus

また、代理人送信できるよう、
実行アカウントに対して編集以上のアクセス権の許可をするようにしてください。

タカヒロ
タカヒロ
実際にメールが送信されますので、十分検証を行うことを推奨します。

他人の予定表の追加した予定表を指定し登録、編集する

他人の予定表の中で追加した予定表を指定して登録、編集することもできます。

コードの、

Set olFolder = olNamespace.GetSharedDefaultFolder(recOther, olFolderCalendar)

Folders(“<追加予定表の名前を指定>”)

を追加します。

例えば、指定アカウントの追加予定表が「追加予定表1」である場合は、

Set olFolder = olNamespace.GetSharedDefaultFolder(recOther, olFolderCalendar).Folders(“追加予定表1”)

となります。

また、実行アカウントに対して編集以上のアクセス権の許可をするようにしてください。

定期的な予定を変更しようとするとエラーとなる理由

定期的な予定を変更しようとすると、

オブジェクトはこのメソッドをサポートしません。

とメッセージが表示され、エラーとなります。

定期的な予定を更新するとエラーとなる理由は

定期的な予定は別のレコードで管理されているからです。

定期的でない予定は1レコードづつ開始日、終了日が登録されていますが、

〇〇日から週に1回などと指定する定期的な予定はパターン登録といい、それぞれの予定の開始日、終了日はパターンから算出したものなのです。

なので、定期的な予定を変更する場合はパターン登録側のレコードを変更する必要があるという訳です。

こちらは別記事で紹介予定ですのでしばらくお待ちください。

 

さいごに

いかがでしょうか。

今回は、

・VBAでExcelの予定表一覧から、他人のOutlook予定表へ登録、編集、会議出席依頼を送信する方法
・代理人として会議出席依頼を送信する方法

についてまとめました。

今回のVBAで他人の予定表を効率よく把握しながら編集もできるので、ぜひ活用いただければと思います。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。








15 件のコメント

  • 初めまして。
    今回、こちらのサイトをとても参考にさせていただいてるのですが、質問があります。
    予定内容に分類項目を選択する事と資料の添付は可能でしょうか。
    分類項目は指定したアドレスで使用している初期の名称ではなく「会議」などの場合の対応をお聞きしたいです。

  • いつも大変ありがたく拝見しております。
    こちらのVBAを利用した予定の登録について、最初から「仮の予定」として登録させるにはどうすればいいでしょうか?よろしくお願いします

  • 別のページにコメントしてしまったので再掲載させていただきます。

    便利なものを公開して下さりありがとうございます。

    他人のOutlookの予定表への登録を行いたいのですが、
    同じ予定でも例えば 1/5はAさん、1/10はBさんというように登録したい場合、操作対象の他人のアドレス指定を該当者分全て登録すればいいのでしょうか?
    また、アドレスの区切り方法などがあれば教えて頂けると幸いです。

    • いつもご利用ありがとうございます。

      複数ユーザーへ同じ予定を登録する方法につきまして、公開しているVBAでは1ユーザーごとの登録処理となっておりますので、
      アドレス登録と登録処理を該当者分繰り返す形となります。

      具体的には以下の通りとなります。

      1.登録したい予定をExcelへ記述する。(ユーザーごとに日付を変更する)
      2.以下アドレス部を登録したいユーザーのものへ変更する。
      strAddress = “hanako@extan.jp”
      3.VBAを実行し、予定を登録する。
      これを該当者分繰り返します。

      登録対象者が多く1ユーザーごとに手動でVBA実行、登録する部分を自動的に処理したい場合は、
      やはり作り込みが必要になります。
      イメージとしては
      Excel側の予定一覧へ予定登録者欄を追加「;」区切りなどでアドレスを入力し、VBA側でその欄を参照、区切り文字で分割し、
      アドレス件数分上記1~3をForEachなどで繰り返す内容になるかと存じます。
      ※ご希望の場合はサンプルのVBAコードを用意いたします。

      別の方法としましては、少々体裁が変わりますが、会議出席依頼を送信する方法もおすすめです。
      Aさん、Bさんのアドレスを必須出席者へ「;」区切りで記載し、実行後、予定が送信/登録されます。
      詳細は以下をご参照ください。
      https://extan.jp/?p=3636#VBA%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%80%81%E4%BC%9A%E8%AD%B0%E5%87%BA%E5%B8%AD%E4%BE%9D%E9%A0%BC%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B

      よろしくお願いいたします。

  • 早速のご回答ありがとうございます。
    追加した予定表は対象外でしたか…残念です。

    一旦 既定の予定表へ取込んだ後に、
    手動で追加した予定表へ移動させる方法で対処いたします。

    また、記事に追加されていないか、寄らせて頂きます。

    開始日時と終了日時を
    日と時に分けて エクスポートやインポートさせたいのですが
    可能でしょうか?
    可能な場合
    記述をどのようにしたらよいのでしょうか?
    よろしくお願いいたします。

    • 開始日時と終了日時を日と時に分ける件ですが、可能となります。

      開始日時と終了日時の形式は“yyyy/mm/dd hh:mm:ss”ですので、エクスポートの時に
      日のみであれば“dd”、時であれば”hh”と形式を指定してあげるだけです。
      例:
      Format(.Start, “dd”)
      Format(.Start, “hh:mm”)

      日と時を分けたいということですので、それぞれの値を別々のセルへ代入していきます。
      例:
      Cells(行番号, 列番号).Value = Format(.Start, “dd”)
      Cells(行番号, 列番号).Value = Format(.Start, “hh:mm”)

      なお、インポート(登録、編集)時には開始日時と終了日時を“yyyy/mm/dd hh:mm:ss”の形式にする必要がありますので、
      分けた日付の値を合成し上記形式に変換するようにお願いします。

  • 始めまして、よろしくお願いいたします。

    @outlook.comに各自アカウント作成しています。
    例えば  hanako@outlook.com とします。

    Office365 のデスクトップアプリ Outlookに設定しております。

    個人用の予定表
    予定表_ hanako@outlook.comに追加ではなく
    予定表_ hanako@outlook.comで右クリックして作成した
    新しい予定表 花子 への追加をしたいのですが
    可能でしょうか?

    strAddress = “hanako@extan.jp”

    strAddress = “花子”
    に修正してみましたが、下記のエラーがでました。

    ***********************************
    実行時エラー ‘-2147352567 (80020009)’:
    Outlook で認識できない名前があります。
    ***********************************

    アドバイス頂ければ幸いです。
    よろしくお願いいたします。

  • こちらのVBAを一部利用して他人の予定表へ予定が入ってない状態から新規に入力しようとしているのですが、実行すると自分の予定表に反映されてしまいます。原因として考えられることは何がありますでしょうか。
    Dim strAddress As String
    strAddress = “参照したい先のアドレス”

    Set olApp = New Outlook.Application
    Set olNamespace = olApp.GetNamespace(“MAPI”)

    Set recOther = olNamespace.CreateRecipient(strAddress)
    Set olFolder = olNamespace.GetSharedDefaultFolder(recOther, olFolderCalendar)
    Set olConItems = olFolder.Items
    ここは入力しており、動作自体は問題なくできております。
    ご教示いただけましたら幸いです。

    • いつもご利用ありがとうございます。

      対象者の既に入っている予定の変更はできるが、新規の場合は自分の予定表へ更新されてしまうという状況でよろしいでしょうか。

      確認頂きたいことは、以下の通りです。
      ・strAddress = “参照したい先のアドレス”
       こちらに予定表を変更したいアドレスが入力されているか確認をお願いします。
      ・貴殿のアカウントに対し、他人の予定表への書き込み権限が付与されているか確認をお願いします。

      ・以下のコメントが外れていないか、また一旦行ごと削除して確認をお願いします。
      ‘自分自身のアイテムを更新する場合は以下をアクティブにしてください。
      ‘Set olFolder = olNamespace.GetDefaultFolder(olFolderCalendar)
      ‘Set olConItems = olFolder.Items

      よろしくお願いいたします。

      • お世話になっております。
        あれから試行錯誤した結果、権限の問題で書き込みができなかったことが判明しました。
        これで作業が非常に楽になりました。ありがとうございました。

        • いつもご利用ありがとうございます。

          使えるようになったようでよかったです。
          #私も以前、同様の権限の問題でつまづいていました…

          今後ともよろしくお願いいたします。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です