複数ユーザのOutlookの予定表に登録されている予定をExcelシートへ取り込んで一覧表にしたいことはないでしょうか。
そんな中で悩むことは、
・Excelにメンバの予定をまとめたいのだけど、Outlookからの一括取得の方法はなに?
ではないでしょうか?
今回は、
・オプションで期間指定や抽出文字条件を設定をする方法
についてまとめます!
もくじ
複数ユーザのOutlook予定表を一瞬でExcelへ取り込む方法について
前回、「【Excel VBA】一瞬でExcelワークシートへOutlookの予定表を取り込む」をご紹介しましたが、
読者の方から複数ユーザのOutlook予定情報をまとめて取得できないかと
ご要望がありましたので、その操作ができるように機能を変更してみました。
利用ケースとしては、
中間管理職層の方やチームリーダが所属メンバのスケジュールを確認すること
が想定されます。
このツールを使えば、メンバが数十名だろうがワンクリックで対象者のスケジュールが一覧化できますし、
いわゆる業務の見える化や可視化といわれるものに貢献できるかなと思っています。
では機能の説明をしたいと思います。
今回のVBAの実装先は、これまでと同様Excelブック側となります。
Excel側に取得したいメンバリスト(メールアドレス)シートと予定表が入る空のシートを用意し、
メンバリストに記載されているメールアドレスをキーにしてOutlook側の予定表を検索、取得し、Excelの空シートへ予定表が入力されるといった流れとなります。
②Excelブック(VBA) → このメアドの人の予定一覧ちょうだい → Outlook
③Excelブック ← メアドの予定一覧を出すよ ← Outlook
④①に戻りメンバリスト件数分処理を繰り返す
では早速実装をして動かしてみましょう!
Excel VBAからOutlookを操作するための下準備
①まずExcelを起動し、「開発」タブをクリックします。
②VBEの画面が開いたら、メニューから「ツール」>「参照設定」を選択します。
③「Microsoft Outlook XX.X Object Library」を探してチェックボックスにチェックし「OK」をクリックします。
以上です。
VBAを実装する
続いてVBAを実装します。
今回VBAは以下の通りとなります。
VBAは前回の「【Excel VBA】一瞬でExcelワークシートへOutlookの予定表を取り込む」をベースに、
複数ユーザ分処理を繰り返すよう機能を追加・変更したものとなります。
Sub 複数の他人のOutlook予定表をExcelへ取り込む()
Dim strAddress As String
Dim strStart As String
Dim strEnd As String
Dim n As Integer
'Excelのブックとワークシートのオブジェクトを設定します。
Set wbBook = ThisWorkbook
Set wsSheet1 = wbBook.Worksheets(1)
Set wsSheet2 = wbBook.Worksheets(2)
'対象予定表の抽出期間を指定します。※変更する場合は以下の日付を変更してください。
strStart = Format("2020/09/1", "yyyy/mm/dd") '抽出するスケジュールの開始日を指定
strEnd = Format("2020/09/1", "yyyy/mm/dd") '抽出するスケジュールの終了日を指定
'1番目のシートの1行目にタイトルを記述します。
With wsSheet1
.Range("A1").CurrentRegion.Clear
.Cells(1, 1).Value = "件名"
.Cells(1, 2).Value = "場所"
.Cells(1, 3).Value = "開始日時"
.Cells(1, 4).Value = "終了日時"
.Cells(1, 5).Value = "予定の本文"
.Cells(1, 6).Value = "予約者"
.Cells(1, 7).Value = "必須出席者"
.Cells(1, 8).Value = "任意出席者"
.Cells(1, 9).Value = "EntryID" '予定のID※編集時にキーとして使用します。
.Cells(1, 10).Value = "定期的な予定" '定期的な予定であるかのフラグ。定期的な予定はTrue。
.Cells(1, 11).Value = "対象者(メアド)"
With .Range("A1:Z1")
.Font.Bold = True
.Font.ColorIndex = 10
.Font.Size = 11
End With
End With
strEnd = DateAdd("d", 1, strEnd) ' 1日追加
'対象ユーザが記載されているメアド分予定表取り込み処理を繰り返します。
For n = 2 To wsSheet2.Cells(1048576, 1).End(xlUp).Row
With wsSheet2
Call 他人のOutlook予定表予定をExcelへ取り込む(.Cells(n, 1).Value, strStart, strEnd)
End With
Next
MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
'Null out the variables.
Set wbBook = Nothing
Set wsSheet1 = Nothing
Set wsSheet2 = Nothing
End Sub
Sub 他人のOutlook予定表予定をExcelへ取り込む(strAddress As String, strStart As String, strEnd As String)
'Outlook用の定義
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Folder
Dim olConItems As Outlook.Items
Dim olItem As AppointmentItem
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
'他人予定表の定義
Dim recOther As Recipient
Dim objAppt As AppointmentItem
Dim strDummy As String
'処理速度優先のためスクリーンの更新は行われません。
Application.ScreenUpdating = False
'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
'ブックおよび、1番目のシート情報を取得します。
Set wbBook = ThisWorkbook
Set wsSheet1 = wbBook.Worksheets(1)
'取得結果を記述する行番号を指定します。
lnContactCount = wsSheet1.Cells(1048576, 1).End(xlUp).Row + 1
'開始日でソートします。
olConItems.Sort "[Start]"
'Trueで定期的な予定を含むようにします。※Falseであると定期的な予定は含まれません。
olConItems.IncludeRecurrences = True
'Findメソッドで期間指定して抽出するスケジュールを絞り込みます。
Set olItem = olConItems.Find("[End] < """ & strEnd & """ AND [Start] >= """ & strStart & """")
While TypeName(olItem) = "AppointmentItem"
'Findで検索すると期間範囲外の余計なものまでヒットしてしまうので、再度フィルタリングします。
If olItem.Start >= strStart And olItem.End < strEnd Then
With olItem
wsSheet1.Cells(lnContactCount, 1).Value = .Subject
wsSheet1.Cells(lnContactCount, 2).Value = .Location
wsSheet1.Cells(lnContactCount, 3).Value = .Start
wsSheet1.Cells(lnContactCount, 4).Value = .End
wsSheet1.Cells(lnContactCount, 5).Value = .Body
wsSheet1.Cells(lnContactCount, 6).Value = .Organizer
wsSheet1.Cells(lnContactCount, 7).Value = .RequiredAttendees
wsSheet1.Cells(lnContactCount, 8).Value = .OptionalAttendees
wsSheet1.Cells(lnContactCount, 9).Value = .EntryID
wsSheet1.Cells(lnContactCount, 10).Value = .IsRecurring
wsSheet1.Cells(lnContactCount, 11).Value = strAddress
End With
lnContactCount = lnContactCount + 1
End If
Set olItem = olConItems.FindNext
Wend
'Null out the variables.
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
Set wbBook = Nothing
Set wsSheet1 = Nothing
'Turn screen updating back on.
Application.ScreenUpdating = True
End Sub
実装手順は以下の通りです。
今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のVBAを入力します。
こちらで完了です。
テストデータを準備する
予定表取得対象者のメールアドレスをExcelへまとめる
今回のマクロはExcel側にまとめた予定表取得対象者のメールアドレスを読み込み、予定表を取得する処理となるため、
Excel側に予定表取得対象者のメールアドレスをまとめる必要があります。
まず、Excelに2つのシートを用意します。
シート名は何でもよいですが、必ず2つ目のシートにメールアドレスを入力してください。
入力開始位置はA2セルとなります。
なお、予定表取得対象者のメールアドレスですが、同じドメインに参加しているユーザのメールアドレスで
マクロを実行する人は対象者の予定が参照できる権限を保持している必要がありますので、ご注意ください。
取得したい予定の期間を指定する
次に取得したい予定の期間を指定します。
サンプルでは開始日、終了日ともに2020/09/1となっていますので、
こちらを変更するようにお願いします。
strStart = Format(“2020/09/1“, “yyyy/mm/dd”) ‘抽出するスケジュールの開始日を指定
strEnd = Format(“2020/09/1“, “yyyy/mm/dd”) ‘抽出するスケジュールの終了日を指定
こちらで、テストデータの準備は完了です。
VBAを実行する
ExcelからOutlook予定表の単体の予定を変更する
では早速VBAの実行をしてみましょう。
①「開発」タブの「VBA」をクリックし「複数の他人のOutlook予定表をExcelへ取り込む」を選択し、「実行」をクリックします。
②「Outlook予定表の取り込みが完了しました!」が表示されたら完了です。
Outlook予定表がExcelへ取り込まれていることが確認できましたね!
<追記>複数の他人のOutlook予定表をExcelへ取り込むVBA–時間指定バージョン
上記のVBAでは、期間指定の際、日付までの指定しかできない仕様であるので、
0時開始の“終日イベント”が抜け落ちてしまう場合がありました。
予定表の上部にでるアイテムが終日イベントとなります。
そこで、期間指定の日付に時間を加えて、終日イベントの抜け落ちを防ぎ、より詳細な期間指定ができるよう改良したものを公開したいと思います。
ありがとうございます。
Sub 複数の他人のOutlook予定表をExcelへ取り込む_時間指定追加版()
Dim strAddress As String
Dim strStart As String
Dim strEnd As String
Dim n As Integer
'Excelのブックとワークシートのオブジェクトを設定します。
Set wbBook = ThisWorkbook
Set wsSheet1 = wbBook.Worksheets(1)
Set wsSheet2 = wbBook.Worksheets(2)
'対象予定表の抽出期間を指定します。※変更する場合は以下の日付を変更してください。
strStart = Format("2021/1/1 00:00", "yyyy/mm/dd hh:nn") '抽出するスケジュールの開始日+時刻を指定
strEnd = Format("2021/1/25 10:30", "yyyy/mm/dd hh:nn") '抽出するスケジュールの終了日+時刻を指定
'1番目のシートの1行目にタイトルを記述します。
With wsSheet1
.Range("A1").CurrentRegion.Clear
.Cells(1, 1).Value = "件名"
.Cells(1, 2).Value = "場所"
.Cells(1, 3).Value = "開始日時"
.Cells(1, 4).Value = "終了日時"
.Cells(1, 5).Value = "予定の本文"
.Cells(1, 6).Value = "予約者"
.Cells(1, 7).Value = "必須出席者"
.Cells(1, 8).Value = "任意出席者"
.Cells(1, 9).Value = "EntryID" '予定のID※編集時にキーとして使用します。
.Cells(1, 10).Value = "定期的な予定" '定期的な予定であるかのフラグ。定期的な予定はTrue。
.Cells(1, 11).Value = "対象者(メアド)"
.Cells(1, 12).Value = "終日イベント"
With .Range("A1:Z1")
.Font.Bold = True
.Font.ColorIndex = 10
.Font.Size = 11
End With
End With
'対象ユーザが記載されているメアド分予定表取り込み処理を繰り返します。
For n = 2 To wsSheet2.Cells(1048576, 1).End(xlUp).Row
With wsSheet2
Call 他人のOutlook予定表予定をExcelへ取り込む(.Cells(n, 1).Value, strStart, strEnd)
End With
Next
MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
'Null out the variables.
Set wbBook = Nothing
Set wsSheet1 = Nothing
Set wsSheet2 = Nothing
End Sub
Sub 他人のOutlook予定表予定をExcelへ取り込む(strAddress As String, strStart As String, strEnd As String)
'Outlook用の定義
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Folder
Dim olConItems As Outlook.Items
Dim olItem As AppointmentItem
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
'他人予定表の定義
Dim recOther As Recipient
Dim objAppt As AppointmentItem
Dim strDummy As String
'処理速度優先のためスクリーンの更新は行われません。
Application.ScreenUpdating = False
'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
'ブックおよび、1番目のシート情報を取得します。
Set wbBook = ThisWorkbook
Set wsSheet1 = wbBook.Worksheets(1)
'取得結果を記述する行番号を指定します。
lnContactCount = wsSheet1.Cells(1048576, 1).End(xlUp).Row + 1
'開始日でソートします。
olConItems.Sort "[Start]"
'Trueで定期的な予定を含むようにします。※Falseであると定期的な予定は含まれません。
olConItems.IncludeRecurrences = True
'Findメソッドで期間指定して抽出するスケジュールを絞り込みます。
Set olItem = olConItems.Find("[End] <= """ & strEnd & """ AND [Start] >= """ & strStart & """")
While TypeName(olItem) = "AppointmentItem"
'Findで検索すると期間範囲外の余計なものまでヒットしてしまうので、再度フィルタリングします。
If olItem.Start >= strStart And olItem.End <= strEnd Then
With olItem
wsSheet1.Cells(lnContactCount, 1).Value = .Subject
wsSheet1.Cells(lnContactCount, 2).Value = .Location
wsSheet1.Cells(lnContactCount, 3).Value = .Start
wsSheet1.Cells(lnContactCount, 4).Value = .End
wsSheet1.Cells(lnContactCount, 5).Value = .Body
wsSheet1.Cells(lnContactCount, 6).Value = .Organizer
wsSheet1.Cells(lnContactCount, 7).Value = .RequiredAttendees
wsSheet1.Cells(lnContactCount, 8).Value = .OptionalAttendees
wsSheet1.Cells(lnContactCount, 9).Value = .EntryID
wsSheet1.Cells(lnContactCount, 10).Value = .IsRecurring
wsSheet1.Cells(lnContactCount, 11).Value = strAddress
wsSheet1.Cells(lnContactCount, 12).Value = .AllDayEvent
End With
lnContactCount = lnContactCount + 1
End If
Set olItem = olConItems.FindNext
Wend
'Null out the variables.
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
Set wbBook = Nothing
Set wsSheet1 = Nothing
'Turn screen updating back on.
Application.ScreenUpdating = True
End Sub
変更した箇所は以下の通りです。
対象予定表の抽出期間の指定を日にちのみから日時へ変更するため、”yyyy/mm/dd hh:nn“のフォーマットとしました。
ですので、期間指定の際は”2021/1/1 00:00″のように時間を含むようにお願いします。
strStart = Format(“2021/1/1 00:00”, “yyyy/mm/dd hh:nn“) ‘抽出するスケジュールの開始日+時刻を指定
strEnd = Format(“2021/1/25 10:30”, “yyyy/mm/dd hh:nn“) ‘抽出するスケジュールの終了日+時刻を指定
また、終日イベントは0時始まりですので、抽出開始日に終日のイベントがある場合は「strStart」を0時から指定するようお願いします。
サンプルは、Outlookの予定表へ2021/1/1に終日のイベントをいれており、
前バージョンですと終日のイベントは抜け落ちますが、
このバージョンを実行すると、終日イベントが含まれていることが確認できました。
なお、終日のイベントであるかどうかを判断するために、
AllDayEventプロパティを取得するように追加をしています。
wsSheet1.Cells(lnContactCount, 12).Value = .AllDayEvent
AllDayEventプロパティが「True」の場合、終日イベントであるという判定となります。
取得した値を確認してみると、
「True」になっていることが確認できましたね!
<追加>複数の他人のOutlook予定表を取り込む際に、特定の文字を含む件名のみに絞り込む方法
読者の方よりOutlook予定表を取り込む際に特定の文字を含む件名に絞り込む方法について質問がありましたので、
対応方法について追記いたします。
サンプルコードの以下箇所を変更します。
変更前
変更後
Like演算子と半角ワイルドカード「*」を使う方法です。
例えば「【重要】〇〇〇検討のこと」など「重要」を含む件名のみ抽出したい場合は、
のようにします。
<追加>複数の他人のOutlook予定表を大量に取り込む際に、高速に処理する方法
Outlook予定表を大量に取り込む際にFindメソッドで失敗する例がありますので、その対処法について説明をします。
MSのリファレンスでは、Findメソッドはアイテム数が少ない場合処理は早いが、
アイテム数が多い場合はRestrictメソッドのほうが早くなると記載があります。
https://docs.microsoft.com/ja-jp/office/vba/api/outlook.items.restrict
ですので、Findメソッドで処理落ちする事象を解決する方法はRestrictメソッドに置き換えることで解消される可能性があります。
以下サンプルコードです。
Sub 複数の他人のOutlook予定表をExcelへ取り込む_時間指定追加版_大量アイテム処理高速版()
Dim strAddress As String
Dim strStart As String
Dim strEnd As String
Dim n As Integer
'Excelのブックとワークシートのオブジェクトを設定します。
Set wbBook = ThisWorkbook
Set wsSheet1 = wbBook.Worksheets(1)
Set wsSheet2 = wbBook.Worksheets(2)
'対象予定表の抽出期間を指定します。※変更する場合は以下の日付を変更してください。
strStart = Format("2021/1/1 00:00", "yyyy/mm/dd hh:nn") '抽出するスケジュールの開始日+時刻を指定
strEnd = Format("2022/6/25 10:30", "yyyy/mm/dd hh:nn") '抽出するスケジュールの終了日+時刻を指定
'1番目のシートの1行目にタイトルを記述します。
With wsSheet1
.Range("A1").CurrentRegion.Clear
.Cells(1, 1).Value = "件名"
.Cells(1, 2).Value = "場所"
.Cells(1, 3).Value = "開始日時"
.Cells(1, 4).Value = "終了日時"
.Cells(1, 5).Value = "予定の本文"
.Cells(1, 6).Value = "予約者"
.Cells(1, 7).Value = "必須出席者"
.Cells(1, 8).Value = "任意出席者"
.Cells(1, 9).Value = "EntryID" '予定のID※編集時にキーとして使用します。
.Cells(1, 10).Value = "定期的な予定" '定期的な予定であるかのフラグ。定期的な予定はTrue。
.Cells(1, 11).Value = "対象者(メアド)"
.Cells(1, 12).Value = "終日イベント"
With .Range("A1:Z1")
.Font.Bold = True
.Font.ColorIndex = 10
.Font.Size = 11
End With
End With
'対象ユーザが記載されているメアド分予定表取り込み処理を繰り返します。
For n = 2 To wsSheet2.Cells(1048576, 1).End(xlUp).Row
With wsSheet2
Call 他人のOutlook予定表予定をExcelへ取り込む(.Cells(n, 1).Value, strStart, strEnd)
End With
Next
MsgBox "Outlook予定表の取り込みが完了しました!", vbInformation
'Null out the variables.
Set wbBook = Nothing
Set wsSheet1 = Nothing
Set wsSheet2 = Nothing
End Sub
Sub 他人のOutlook予定表予定をExcelへ取り込む(strAddress As String, strStart As String, strEnd As String)
'Outlook用の定義
Dim olApp As Outlook.Application
Dim olNamespace As Outlook.Namespace
Dim olFolder As Folder
Dim olConItems As Outlook.Items
Dim olItem As AppointmentItem
'Excel用の定義
Dim wbBook As Workbook
Dim wsSheet As Worksheet
Dim lnContactCount As Long
'他人予定表の定義
Dim recOther As Recipient
Dim objAppt As AppointmentItem
'処理速度優先のためスクリーンの更新は行われません。
Application.ScreenUpdating = False
'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
'ブックおよび、1番目のシート情報を取得します。
Set wbBook = ThisWorkbook
Set wsSheet1 = wbBook.Worksheets(1)
'取得結果を記述する行番号を指定します。
lnContactCount = wsSheet1.Cells(1048576, 1).End(xlUp).Row + 1
'開始日でソートします。
olConItems.Sort "[Start]"
'Trueで定期的な予定を含むようにします。※Falseであると定期的な予定は含まれません。
olConItems.IncludeRecurrences = True
'Restrictソッドで期間指定して抽出するスケジュールを絞り込みます。
Set olConItems = olConItems.Restrict("[End] <= """ & strEnd & """ AND [Start] >= """ & strStart & """")
For Each olItem In olConItems
'Findで検索すると期間範囲外の余計なものまでヒットしてしまうので、再度フィルタリングします。
If TypeName(olItem) = "AppointmentItem" Then
With olItem
wsSheet1.Cells(lnContactCount, 1).Value = .Subject
wsSheet1.Cells(lnContactCount, 2).Value = .Location
wsSheet1.Cells(lnContactCount, 3).Value = .Start
wsSheet1.Cells(lnContactCount, 4).Value = .End
wsSheet1.Cells(lnContactCount, 5).Value = .Body
wsSheet1.Cells(lnContactCount, 6).Value = .Organizer
wsSheet1.Cells(lnContactCount, 7).Value = .RequiredAttendees
wsSheet1.Cells(lnContactCount, 8).Value = .OptionalAttendees
wsSheet1.Cells(lnContactCount, 9).Value = .EntryID
wsSheet1.Cells(lnContactCount, 10).Value = .IsRecurring
wsSheet1.Cells(lnContactCount, 11).Value = strAddress
wsSheet1.Cells(lnContactCount, 12).Value = .AllDayEvent
End With
lnContactCount = lnContactCount + 1
End If
Set olItem = olConItems.FindNext
Next
'Null out the variables.
Set olItem = Nothing
Set olConItems = Nothing
Set olFolder = Nothing
Set olNamespace = Nothing
Set olApp = Nothing
Set wbBook = Nothing
Set wsSheet1 = Nothing
'Turn screen updating back on.
Application.ScreenUpdating = True
End Sub
変更箇所は以下となります。
'Restrictソッドで期間指定して抽出するスケジュールを絞り込みます。
Set olConItems = olConItems.Restrict("[End] <= """ & strEnd & """ AND [Start] >= """ & strStart & """")
For Each olItem In olConItems
・・・
Next
FindメソッドとWhile処理のところををRestrictソッドとFor Each処理へ置き換えています。
さいごに
いかがでしょうか。
今回は
・オプションで期間指定や抽出文字条件を設定をする方法
についてまとめました。
まだまだ便利な方法がりますので、よろしければご参照頂ければと思います。
初めまして。
こちらのサイトのコードを参照にさせて頂きたいのですが、
wsSheet1.Cells(lnContactCount, 6).Value = .Organizer
の出力内容が、予約者の氏名(例:山田 太郎)で出力されてしまいます。
出力サンプルの画像のように、予約者のメールアドレスを取得するにはどのように記載すればよろしいでしょうか。
ご教示いただけますと幸いです。
いつもご利用ありがとうございます。
予約者のメールアドレスを取得する方法ですが、
organizerの仕様上、表示名のみの出力となっており、メールアドレスは未対応となっております。
https://learn.microsoft.com/ja-jp/office/vba/api/outlook.appointmentitem.organizer
※サンプルはActiveDirectoryにあるアカウントの表示名もメールアドレスにしているためアドレスが出力されています。
他のアイデアとしては、一度取得した表示名をキーにしてADへメールアドレスを問合せ、エクセルに出力する方法が考えられます。
ただ、LDAPのクエリ操作をVBAで行うなど難易度が高く検証が必要であるため、サンプルコードをご提示することが難しい状況です。
明確な回答ができず恐縮です。
よろしくお願いいたします。
会議室の予約をOutlookで管理しています。
会議の参加者の出欠も併せて一覧表にて表示する方法はありますでしょうか?
(会議個々の表示の仕方は拝見したのですが、一括で出す方法があるとありがたいです。。。)
また、出来たら個別で誰が出席で誰が欠席かも分かると嬉しいです。
よろしくお願い申し上げます。
いつもご利用ありがとうございます。
会議の参加者の出欠も併せて一覧表にて表示する方法につきまして、以下の記事が該当するかと存じますので、ご参考いただければと思います。
https://extan.jp/?p=421#Outlook_VBA%E3%81%A7%E4%BC%9A%E8%AD%B0%E3%81%AE%E5%87%BA%E6%AC%A0%E7%A2%BA%E8%AA%8D%E3%82%92%E9%9B%86%E8%A8%88%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
タカヒロ様
いつもお世話になっております。
”終日予定”のみを抽出する方法について質問させて頂いた者です。
早々のご回答ありがとうございます。
みごとに終日イベントのみを抽出することが出来ました。あとは、エクセル上で料理(取捨選択、並び替え、見える化)をしたいと思います。大変助かりました。
重ねて感謝申し上げます。ありがとうございました。
お世話になっております。
”<追加>複数の他人のOutlook予定表を大量に取り込む際に、高速に処理する方法”を活用させて頂いております。
予定を参照したい人が80名くらいおります。
長期出張等が多く、Outlookのスケジュールへは”終日予定”として数か月に亘って入力してもらっている場合もあります。
検索日程の範囲が狭いと「開始日時プロパティ」が拾えずエラーとなってしまう人もおります。範囲を広げればよいのですが、人数も多い為、処理に時間が掛かることを危惧しております。
取り込みたいのは終日予定のみです。Outlookから取り込む際(or 後)にAllDayEventのみに限定できれば、処理の負担が減るのかと思います。
もし、”終日予定”のみを抽出する方法等がございましたら、ご教示頂けますようにお願い申し上げます。
いつもご利用ありがとうございます。
”終日予定”のみを抽出する方法につきまして、高速版のご利用でしたら、以下の箇所に終日の予定である条件を加えれば対応可能かと存じます。
■変更前
‘Restrictソッドで期間指定して抽出するスケジュールを絞り込みます。
Set olConItems = olConItems.Restrict(“[End] <= “”” & strEnd & “”” AND [Start] >= “”” & strStart & “”””)
■変更後
‘Restrictソッドで期間指定して抽出するスケジュールを絞り込みます。
Set olConItems = olConItems.Restrict(“([End] <= “”” & strEnd & “””) AND ([Start] >= “”” & strStart & “””) AND ([AllDayEvent] = “”True””)”)
他の人のOutlook予定表をエクスポートするマクロを調べていてこちらに来ました。活用させていただきたいのですが、olConItems.Sort “[Start]”がエラーが出て「不明なプロパティです」となります。エラーを回避する方法をネットで調べていますが私の知識では見つけられませんでした。回避してマクロを実行する方法がわかりましたら、教えていただけますと幸いです。
いつもご利用ありがとうございます。
olConItems.Sort “[Start]”で「不明なプロパティです」とエラーが出てしまう件ですが、
取得したアイテムの中で開始日時プロパティが存在しないアイテムがある可能性がありますので、
まずは、Sortメソッド、Restrictメソッド(Findメソッド)を無効化して全件取り込めるかどうか
ご確認いただき、開始日時プロパティがないアイテムがあれば除外するようお願いします。
いつも勉強させていただいております。
複数ユーザーはありますが、自分の複数の予定表への登録が見つけられませんでしたので、ご教授いただきたくお願いいたします。
やりたいこと:自分の別の名前の予定表(複数)予定表の名前ごとに一つのエクセルから登録すること
例
登録用エクセル
(下記Outlook予定表1~3のすべての予定を一つにまとめたエクセル)
Outlook予定表
予定表1,予定表2,予定表3(30個くらいあります)
それぞれエクセルに保存されている予定表の名前から一括でそれぞれに保存したい
※更新に時間がかかっても構いません。
※表示したいものは、件名と予約時間と登録者
※終日や繰り返し設定のものもあります。
ややこしいご相談で申し訳ありませんが、何卒よろしくお願い申し上げます。
いつもご利用ありがとうございます。
自分の別の名前の予定表の名前ごとにエクセルから登録する件につきまして、
類似の内容を別の記事にまとめておりますので、こちらをご参考の上検証いただけますでしょうか。
https://extan.jp/?p=3341
追加予定表の情報をエクセルに取り込む場合はこちらの記事をご参考ください。
https://extan.jp/?p=3370
とっても便利で利用したいのですが…
他の人のOutlook 予定表の読み取りの参照権限を
「全詳細情報」から「空き時間情報、件名、場所」に変更すると予定が抽出できなくなってしまいました。
読み取りの参照権限を「空き時間情報、件名、場所」のままで抽出するにはどうすればいいでしょうか?
いつもご利用ありがとうございます。
「全詳細情報」から「空き時間情報、件名、場所」に変更すると予定が抽出できなくなってしまう件ですが、
GetSharedDefaultFolderメソッドの仕様上、一度すべてのプロパティを取得しようとするので、
アクセス権が限定的で参照できないプロパティが含まれているとエラーとなります。
対応としては「全詳細情報」の設定にいただくしかない状況で、ご了承のほどお願いいたします。
丁寧なご回答をありがとうございました。
原因は、私の早とちりで「Microsoft Office XX.X Object Library」にチェックが入っているので安心してしまったことでした。明確にご指示頂いている通りに「Microsoft Outlook XX.X Object Library」を探してチェックを入れれば、解決できました。末尾に「Object Library」と付いている選択肢がたくさんあるので、早とちりは禁物と肝に銘じた次第です。
これがやりたい!っていうマクロをご紹介頂きありがとうございます。
実装してみたのですが、
” Dim olApp As Outlook.Application”で「コンパイルエラー:ユーザ定義型は定義されていません。」というエラーメッセージが小窓表示されて止まってしまいます。
なお、メンバーのメルアドのドメインは同じです。彼らは私に予定表の共有権限を”代理人”で与えてくれています。
対処法を教えて頂ければ幸いです。
いつもご利用ありがとうございます。
「ユーザ定義型は定義されていません。」となる要因につきまして、
おそらくOutlookアプリケーションの参照設定がまだされていない状態かと思われますのでご確認ください。
また、同エラーの原因と対処法については以下記事にまとめておりますので
こちらもご参考いただければと存じます。
https://extan.jp/?p=10645
タカヒロさん
ありがとうございます。大変勉強になります。挑戦してみたいと思います。
今後もご教示、宜しくお願い致します。
こんにちは。個人の予定表ではなく、パブリックフォルダ内の予定表をEXCELにエクスポート。また、EXCELからパブリックフォルダ内の予定表に一括で書き込むことはできますでしょうか。よろしくお願いします。
いつもご利用ありがとうございます。
パブリックフォルダを対象に予定表情報を取得する件につきまして、
GetSharedDefaultFolderメソッドで定数olFolderCalendarを指定した場合は規定の個人の予定表フォルダ/サブフォルダが対象となり、
外部にあるパブリックフォルダは対象外になります。
方法としまして、当方でまだ検証はできておりませんが、定数olPublicFoldersAllPublicFoldersを使用する方法が考えられます。
この場合、すべてのパブリックフォルダが対象になりますので、予定表情報がどこにあるか探る必要があります。
https://extan.jp/?p=2620#GetDefaultFolder%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E6%93%8D%E4%BD%9C%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%E5%BC%95%E6%95%B0%E3%81%AF%E3%81%AA%E3%81%AB%EF%BC%9F
また、こちらも検証段階でございますが、当方の裏技で紹介している同期先のローカルフォルダのデータを参照する方法で取得できる可能性がありますので
併せてご検討の上、検証いただきたくお願いいたします。
https://extan.jp/?p=2620#GetDefaultFolder%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B%E6%96%B9%E6%B3%95
たいへん有益なツールを公開してくださってありがとうございます
わたしが実行すると問題なくデータ抽出できるのですが、ほかのメンバーが実行した際に、
実行時エラー2147221219(8004011d)
レジストリまたはインストールに問題があるため、操作は失敗しました。
のエラーが出ます
こちらはどのように乗り越えればよいでしょうか?
いつもご利用ありがとうございます。
VBAの操作が失敗する件ですが、
VBA実行アカウントが取得対象アドレスと異なるドメインであったり、Windowsのローカル環境にログインしている場合に発生しますので、
取得対象アドレスと同じドメインに参加(ログイン)した上で実行頂きたくお願いいたします。
タカヒロさん
こちらこそいつも勉強させて(という名のコピペ)させていただき大変助かっています。
ありがとうございます。
そうだったのですね。
会社の規定の都合上、アクセス許可が難しそうなので
こちらの予定表抽出はできなさそうです。。
ご回答いただきありがとうございました!
私のExcelだけおかしいのかな。。?と思っていたので理由がわかってすっきりしました!
すみません。
誰もここで引っかかっていないようなので、私のExcelの問題かもしれませんが伺わせてください。
マクロをコピペしたのち、再生すると
”Startは不明なプロパティです”
とエラーが出てきて下記記述が黄色に表示されます。
「 ‘開始日でソートします。
olConItems.Sort “[Start]”」
使用しているExcelは2016なのですが、バージョンが古いのでしょうか。
私のやり方が悪いのかもしれませんが、どなたか知っていたら教えてください。
いつもご利用ありがとうございます。
エラーの件ですが、GetSharedDefaultFolderメソッドの仕様上、指定アドレスの予定表をまるごと取得しますので、アクセス権が限定的で参照できないプロパティが含まれているとエラーとなります。
対応としましては、対象者の予定表へ、実行アカウントに対し「すべての詳細を表示可能」以上のアクセス許可をするようお願いいたします。