Excel VBAでOutlookの他人の予定表の空き時間を取得するには

f:id:ts0818:20200722222304j:plain

www.fnn.jp

22日から始まる、Go Toトラベルの対象から除外された東京都について、予約済みの旅行代金のキャンセル料を、政府が補償する方向で検討に入ったことがわかった。

政府関係者は、東京都が除外されたことについて、「われわれも努力しなければならない」と語っていて、補償を前向きに検討する考えを示している。

【独自】GoToトラベル キャンセル料 国負担を検討

⇧ いや~、結局のところ、我々が日々ストレスと格闘しながら働きに働いた末に、雀の涙ほどの給料をもらって、そこからむしり取った税金を使ってるんでしょ?

「努力」って言葉の意味わかってるのかしらね?

まったくもってモチベーションだだ下がり中、どうもボクです。

 

Outlook の他人の予定表の空き時間を取得したいこと、あるあるだよね~、え?ないですか?

まぁ、無いと話が終わっちゃうので、あるとしましょうか。

ただ、驚くほど、情報が少ないというね、需要はありそうな気もするんだけどな~。

そもそも、

qiita.com

本もあまりないし、肝心のMicrosoftの解説もバラバラだ。一度まとめておくしかない。
通常本屋に行くとEXCELのマクロで事務効率化、などという本が売ってあるが、Outlook 2010 VBA の基礎知では、結構絶望することしか書いていない。

Outlook VBA オブジェクト まとめ - Qiita

⇧ 上記サイト様にありますように、

で別物ってのが驚きなんですけど...

まさかとは思うけど「Access VBA」とかもあるのかな?

nokotopics.exblog.jp

例えば、ワードVBA、エクセルVBA、パワーポイントVBA、アクセスVBAなどというように、ソフトごとに異なるVBAが用意されています。

エクセルVBAとアクセスVBAの違いとは・・・ : nokoとpics

⇧ 絶望しかない...

つまり、

ってな具合で、Microsoftの製品ごとにVBAを習得せにゃならんってこと?

やってられんでしょ... 

ちなみに、VBAは、 

Visual Basic for Applications(ビジュアルベーシック・フォー・アプリケーションズ、VBA)は、主にマイクロソフト製のMicrosoft Officeシリーズに搭載されているプログラミング言語である。

Visual Basic for Applications - Wikipedia

⇧ 「Visual Basic for Applications」の略らしい。

そんなわけで、今回は、Excel VBAOutlook の他人の予定表の空き時間を取得するを試していきたいと。レッツトライ~。

 

Microsoft の説明だと、Outlookの予定表取得には 3つ方法が用意されてるっぽい

ザックリと調べた感じ、Outlookの予定表取得については、3つの方法が用意されているっぽい気がする。 

1つ目

docs.microsoft.com

受信者の空き時間情報を返します。

expression. FreeBusy_Start_ , _MinPerChar_ , _CompleteFormat_ )

Recipientオブジェクトを表す変数を取得します。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.recipient.freebusy

2つ目 

docs.microsoft.com

文字列 を表す ExchangeUser の 30 日間の期間の開始日から指定された日付の午前 0 時に開始を取得します。

expression. GetFreeBusy_Start_ , _MinPerChar_ , _CompleteFormat_ )

Exchangeuserオブジェクトを表す変数を取得します。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.exchangeuser.getfreebusy

3つ目 

docs.microsoft.com

EWS マネージ API または EWS でプログラムを使用して会議を作成し、会議出席依頼を送信できれば便利ですが、多くの場合、出席者全員に都合のよい時間に設定することは困難です。 全員が参加できる時間を手動で確認する必要がある場合、このタスクを自動化する目的は達成されません。 幸いなことに、EWS マネージ API メソッドの ExchangeService.GetUserAvailability および EWS 操作の GetUserAvailability でこの問題を解決できます。

https://docs.microsoft.com/ja-jp/exchange/client-developer/exchange-web-services/how-to-get-free-busy-information-by-using-ews-in-exchange

 

 

まぁ、例の如く、行間を読めを強いるドキュメントなのですが...

読み取れない部分を調査していきますか...

 

Outlook のアーキテクトってどうなってるの?

Outlook が、と言うか、Microsoft製品のややこしいところはドキュメントがカオスなところなんですよね...

まぁ、何て言うか、

qiita.com

貴重なフィードバックを放置して、何を契機にどんな改善を機械に期待しているのでしょうか。
一度飲み込んで五晩寝たものの、疑念が去らないので記事にしました。

マイクロソフト社の機械翻訳フィードバック対応はやはりおかしい - Qiita

Microsoft って、消費者を軽んじてるってことがひしひしと伝わるんですよね、哀しいことに。Microsoftの一部の人たちだけであることを信じたいけど...数々の悪行の実績があるからな~。

一度失った信用を取り戻すのに必要な労力が並大抵じゃないってことが一般企業では普通だと思うんですが、大企業ともなると信用なんて無価値なんですかね?

 

ドキュメントだけじゃないと、

www.itmedia.co.jp

 ユーザーに負担を強いるアップデートって何なのでしょうか? 変更がある度に、毎回そう思います。

Microsoftは“UI音痴”なのか? (1/2) - ITmedia エンタープライズ

⇧ 同感です館長。

まぁ、そんなMicrosoft さんですから、アーキテクトの説明も期待できないですと。

まず、Outlook の全量が分かり辛い。

support.microsoft.com

⇧ 上記の説明によると、

の4つがあるらしい、って言うか正式名称が分からん... 

で、上記はあくまでクライアントソフトであるから、当然クライアントソフトからの処理(メールの送信など)を受け取るサーバ側の存在が必要になりますと。

インターネットの初期からある通信手段であり、UUCPSMTPなどのプロトコルを介して、メールを相手サーバに届けられる。電気的な信号で送受信を行うのでかかる時間は数分程度である。

電子メール - Wikipedia

無料アドレス(フリーメールサービス)の場合は、プロバイダなどのアカウントで利用する一般的な電子メールクライアントソフトではなく、ウェブブラウザを使ってウェブページ上で、送受信を行うウェブメールがほとんどである。

電子メール - Wikipedia

Gmail なんかは、「ウェブメール」ってことになるかと。 

現在、インターネットでは、メールサーバ間での通信およびクライアントからの送信には、一般にSMTPが使われる。古くは、また現在でも希に、UUCPが使われる。メールは、数々のサーバリレーのように経由して目的のメールサーバに伝えられる。

電子メール - Wikipedia

⇧ で、「電子メール」は「クライアントソフト」の他に「メールサーバ」が要りますと。

メールサーバからメールを読み出す場合には、POPIMAPなどのプロトコルが用いられる。メールの書式については、RFC 5322で規定がある。また、英字以外の文字・言語テキスト以外の情報をメールで送るなどのためにMIMEが規定されている。

電子メール - Wikipedia

⇧ いろいろ規格があるんですと。

その一方で、特に、Microsoft Windows と、その標準メールクライアントである Outlook Express(初期設定ではメールの作成時にHTML形式が選ばれる)の普及に伴って、HTML形式のメールが送受信されることも多くなった。

電子メール - Wikipedia

⇧ で、長々と脱線しましたが、「電子メール」の例として「Outlook Express」ってのが出てくるんだけど、

Microsoft ExchangeをルーツとするMicrosoft Outlookとは名前が類似しているが全く別のソフトウェアである。

Outlook Express - Wikipedia

⇧ 衝撃...まったく別物って、混乱させてくれますね。

Microsoft Exchange Server」はと言うと、

Microsoft Exchange Serverマイクロソフト エクスチェンジ サーバー) は、マイクロソフトの開発したグループウェア / 電子メール製品。Microsoft Serversの一部であり、マイクロソフト製品を採用している企業で広く使われている。Exchangeの主な機能は、電子メール / 予定表 / 連絡先などの共有と携帯機器やウェブからの情報アクセスサポート、さらにデータ格納サポートである。

Microsoft Exchange Server - Wikipedia

⇧ 「Microsoft Servers」の一部でって言ってますが、

Microsoft Servers」ってのは、

Microsoft Serversマイクロソフトサーバ製品群の商標の総称。この中にはWindowsオペレーティングシステム自体を含む。

以前、Microsoft ServersはWindows Server Systemと呼ばれていた。

Microsoft Servers - Wikipedia

WindowsのOSを含んでるサーバってことらしい。「Windows Server」なんかも「Microsoft Servers」の1つと言うことになるらしい。

つまり、

 に対応するサーバは、「Microsoft Exchange Server」ってことになるらしいんだけど、

techtarget.itmedia.co.jp

 オンプレミス環境で「Microsoft Exchange Server」(以下、Exchange Server)を使っている多くの企業も、クラウドの魅力からは逃れられない。膨大な数の企業がクラウドサービスである「Microsoft Exchange Online」(以下、Exchange Online)とオンプレミス基盤であるExchange Serverを比較検討するだろう。クラウドに移行する理由はたくさんあり、オンプレミスにこだわる理由も同じようにたくさんある。

徹底比較:「Exchange Online」と「Exchange Server」 企業が選ぶべきなのはどちらか:「常に最新機能が使える」はメリット? デメリット? - TechTargetジャパン 情報系システム

⇧ 上記サイト様で説明されてるのと、Wikipediaさんによると、

3つほどあるらしい。 

で、「Microsoft Exchange Server」のアーキテクチャは、

docs.microsoft.com

⇧ 上記のような感じになるらしい。

よく分からんけど、外部のSMTPサーバーとやり取りする場合は「Microsoft Exchange Online」の利用ってことになるらしい。

 

EWS(Exchange Web Services)の使用条件は?

Microsoft さんの説明によりますと、 

docs.microsoft.com

Exchange の EWS などの Web サービスを初めて使用する際に役立つ情報を紹介します。

[Exchange の Web サービス](explore-the-ews-managed-api-ews-and-web-services-in-exchange.md)により、Exchange Online、Office 365 の一部としての Exchange Online、および Exchange Server 2007 以降のオンプレミス バージョンの Exchange に保存されたメールボックスのデータにアクセスできるようになります。

Exchange で Web サービスの使用を開始する | Microsoft Docs

また、その情報を組織の要件に従って管理する際に使用できるカスタム アプリケーションの作成が可能になります。作成可能な EWS アプリケーションと Web アプリケーションの範囲に実質的な制限はありませんが、いくつかの基本的な概念があらゆる種類のアプリケーションに当てはまります。このセクションでは、Exchange の EWS などの Web サービスの使用を開始するために、十分に理解しておく必要のある基本的な概念についての情報を提供します。

Exchange で Web サービスの使用を開始する | Microsoft Docs

Web サービス アプリケーションの開発に .NET Framework とその他のプラットフォームのどちらを使用するにしても、開発プロジェクトの開始前に理解しておく必要のある重要な概念があります。

Exchange で Web サービスの使用を開始する | Microsoft Docs

⇧ 「その他のプラットフォーム」ってのが何を指すのかは全くもって不明ですが、少なくとも、EWS(Exchange Web Services)については、

の2つで利用可能ってことらしい。 

なので、何らかのMicrosoft Outlook をクライアントソフトで使っているならば、「EWS(Exchange Web Services)」も使えますと。

ただ、

docs.microsoft.com

Outlook Web App を Exchange Server にアクセスするようにセットアップするには、次の手順を実行します。

Outlook on the web をセットアップして Exchange Server にアクセスする方法 | Microsoft Docs

⇧ 諸々の手順は必要らしい。

 

今回は、FreeBusyメソッド使ってみました

前提として、

  • Outlookがインストールされてること
  • Excel VBA が使えること

は最低限、満たしている必要があるそうです。

で、Outlook がインストール済みという体でしれっと話を進めます。

Excel VBAOutlook のオブジェクトを操作したい場合は、Excel VBA 側の「参照設定」ってものを追加してあげないといけないらしい。

tonari-it.com

まず、エクセルVBAOutlookを操作する準備として、VBEでMicrosoft Outlook Object Libraryの参照設定をしましょう。

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

【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得

⇧ 上記サイト様が詳しいです。

 

で、準備は整ったわけですが、Outlook の他人の予定表を取得するには、 

docs.microsoft.com

⇧ ってメソッドでイケますと。

 

ただし、Outlook 予定表の詳細参照権っぽいものが与えられていない予定表の情報は取得できないっぽい。

このメソッドは、あるユーザーが、既定のフォルダー (共有されている 予定表フォルダーなど) について、別のユーザーに対する代理アクセス権を持っている場合に使用されます。

NameSpace. GetSharedDefaultFolder メソッド (Outlook) | Microsoft Docs

⇧ むっちゃ、ぼやかすやん...

「別のユーザーに対する代理アクセス権」ってどういうものか具体的に説明してくれんもんかね...

 とりあえず、

support.microsoft.com

⇧ 合ってる合ってないは置いといて、「代理人アクセス」==「代理アクセス権」ってことにして先に進みたいと思います。(Microsoft さん相変わらずドキュメントがカオスだな...)

つまり、アクセス権の関係で、「GetSharedDefualtFolder メソッド」が使えない場合があり、その場合は終了です。

「諦めたら、そこで試合終了」「諦めなくても、そこで試合終了」ということで、今回は、「GetSharedDefualtFolder メソッド」が使えた他人の予定表で試してみました。

 

で、空き時間を取得できるという、FreeBusyメソッドなのですが、

stackoverflow.com

I am having trouble using the FreeBusy method of the Recipient class.

The documentation states that the function parameters are:

Start which represents the start time, MinPerChar which represents the minutes per character returned, and CompleteFormat which represents whether you just want to know if the room is busy or additional details about the business.

However, when putting the following code, I get the same results:

 debug.print myRoom.FreeBusy(#10/18/2016 11:00:00 AM#, 30, false)

which gives:

 0000000000000000010000001......

and then:

 debug.print myRoom.FreeBusy(#10/18/2016 10:00:00 AM#, 30, false)

gives the same thing:

 0000000000000000010000001......

What am I doing wrong? I would have thought that the second call would return the first one moved to the right by 2 bits with 2 additional values, but this does not seem to be the case.

I am running Outlook 2013 on an Exchange Server.

https://stackoverflow.com/questions/40115327/using-recipient-freebusy-in-outlook

⇧ って言う問題を上げてる方がおられまして、要点としては、『「MM/DD/YYYY hh:mm:ss」で、「hh:mm:ss」に部分を変えてるけど、戻り値の変化ないやん?』

って言ってて、それについての回答が、

The problem seems to be that the Start parameter is a date parameter and not a DateTime parameter, so it will ignore the time, starting at the beginning of the day.

You just need to count the correct number of output bits to get the correct hour.

Instead of:

 debug.print myRoom.FreeBusy(#10/18/2016 11:00:00 AM#, 30, false)

Use:

 myVal = myRoom.FreeBusy(#10/18/2016#, 30, false)
 debug.print Mid(myVal, 22, len(myVal) - 22)

https://stackoverflow.com/questions/40115327/using-recipient-freebusy-in-outlook

⇧ 要するに、『「hh:mm:ss」部分は考慮してくれないメソッド』と言うことらしい。

って言うか、確かに、メソッドの引数についての説明を見ると、

docs.microsoft.com

名前 必須 / オプション データ型 説明
Start 必須 日付型 (Date) 空き時間情報の取得期間の開始日を指定します。
MinPerChar 必須 Long 取得する空き時間文字列の 1 文字で表す時間を分数で指定します。
CompleteFormat 省略可能 Variant True の 場合、返される文字列が含まれている必要がありますだけでなく空き時間情報についても、 空き時間情報 の定数によっては、各文字の値です。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.recipient.freebusy

⇧ 日付であるからして、「hh:mm:ss」はそもそも受け入れませんよと。

ただ、戻り値の説明がドイヒー...

Stringの値で、空き時間情報を表します。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.recipient.freebusy

⇧ これ、酷くないですか?

しかも、見本のソースコードは掲載されてるんですけど、実際にどういう値が返ってくるかという部分は載せてくれてないので、何が正解なのか分からんと言うね...

で、仕方ないから動かしてみたところ、戻り値は、

docs.microsoft.com

ユーザーの予定の有無を表します。

OLBUSYSTATUS 列挙 (OUTLOOK)
名前 説明
olBusy pbm-2 予定あり。
olFree .0 予定なし。
olOutOfOffice 1/3 外出中。
olTentative 1-d 仮の予定あり。
olWorkingElsewhere 2/4 ユーザーがオフィスから離れた場所で作業します。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.olbusystatus

⇧ 上記の値が羅列された文字列になるので、Stackoverflowの質問者の方が記載してらした、

000000000000000000000000000000000000000000000000110011002110...    

⇧ 上記のような戻り値の形が正しいのですと。

ですが、な、なんと!

255文字までの値しか返してくれないというね...いや~震えましたね...

しかも先頭と末尾の「”(ダブルクォーテーション)」含めてなので、実質、253文字と言うね...

つまり、FreeBusyメソッドの引数「Start」に「2020/07/01」を、引数「MinPerChar」に「15」とか設定して実行してみたところ、「2020/07/01 00:00:00」から15分間隔で、上記の「ユーザーの予定の有無」の値を返してくれるんですが、255文字までなので、「2020/07/03 15:00:00」ぐらいまでの値を中途半端に取得して終わると言うね...

実際、戻り値の255文字(ダブルコーテーション分を除いて、253)が何日分になるのか計算してみると、

253 ÷ (60 ÷ 15) = 63.25
63.25 ÷ 24 = 2.63541666667

2日と半日を少しまたいだところまでってなりますね。

なので、普通に考えたら1日毎の予定が欲しいっていうケースが一般的と思うので、そのあたりは力業で戻り値を加工するしか無さそうですかね。

何故にこんな中途半端なメソッドにしてくれてるのか謎過ぎて、Microsoft の闇を垣間見た気がしました。

引数の「MinPerChar」の値で変わってくるから致し方ないのかね?

だとしても、戻り値を、255文字で固定にしてる意味はよく分からんけど...

2020年8月7日(金)追記:↓ ここから

何か、VBAエディターの問題っだったらしい...

qa.itmedia.co.jp

⇧ どっちにしろ駄目じゃん...Microsoft

 

2020年8月7日(金)追記:↑ ここまで

 

f-journey.com

⇧ 上記サイト様のように、PowerShell でも予定表を取得できるそうな。

 

というわけで、VBAの世界は底知れぬ闇が広がっている気がした今日この頃です。

今回は、このへんで。