142
183

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Outlook VBA オブジェクト まとめ

Last updated at Posted at 2017-03-31

OUTLOOK VBA の解説がなさすぎる

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

  • VBA プログラミングは強力なソリューションですが、常に最適なアプローチであるとは限りません。目的によっては、別の手段を選択するほうが適切な場合もあります。
  • まず、もっと簡単な方法がないかを確認します。 <ありえない...
  • プログラミングを始める前に、まず、Outlook 2010 の機能を十分確認してください。
  • VBA プロジェクトを開始する前に、VBA の作業に必要な時間を確保してください。
  • Outlook の Visual Basic for Applications コードは、個人用のマクロ開発環境として開発されたものであり、展開や配布を行うことを前提としていません。なのでExportする方法しかない。Excelなどのようにマクロ付きのファイルを配布することができない。2002のころは不具合まであった。(補足参照)

マクロソフト自体がOUTLOOOKのVBAにネガティブすぎるのでは。

事前準備

1.[開発] タブを表示する (特に変化はないが表示すると開発者モードになる。)
2.クィックアクセスツールバーに「マクロの実行」を表示する
  • EXCELのALT+F8のように一覧が表示される。
  • アイテムを選択して起動するマクロはVBEを開くことなくこれで起動できる。
  • リボンのあたりを右クリックしてリボンのユーザー設定>クィックアクセスツールバー すべてのコマンドから選択する。
3.マクロのセキュリティの設定を変更する
  • ファイル→オプション→セキュリティセンター→セキュリティセンターの設定→すべてのマクロに警告を表示するまたはすべてのマクロを有効にする
  • このように設定している場合でもOUTLOOKがクラッシュするとMicrosoft VBA Add-in for Outlookが使用できないアイテムになり、VBEが起動しなくなる場合がある。リンク先を参照して有効にすると復旧する。OUTLOOKのマクロはExcelのアドインと同じ扱い。
4.英語で2013までだが、オフラインのVBAのヘルプファイルを入手する日本語のヘルプサイトを参照する。2010と2007はオフラインに移行している。ただし現在のところ、日本語のヘルプはところどころリンク切れしており、英語のヘルプがやっぱり必要な状態となっている。
現在のヘルプファイルのリンク

さらに2018年10月、いったん日本語のヘルプが消えたあと3つのヘルプが存在し、カオスとなっている
Doc版Office VBA リファレンス以前のリンクはvba/apiがvba/vbaとなっており間違っていたらしい
MSDN版:デベロッパーセンター Office VBA リファレンス
Docs ドキュメント/Office クライアントの開発/Outlook
Officeから右の三角矢印を展開し、Outlookのリファレンスを出す。
直接リンクするとなぜか英語版になる。そもそも2つ存在するというわけのわからない状態です。

VBA用語集
VBAを編集するVisual Basic Editorの用語集VBE用語集
Office の以前のバージョンに関するドキュメント
Docs版は開発者向けとOfficeクライアントの開発の2つがある
Outlook 開発者向けドキュメント
これはVBAではなくアドイン等の開発
Outlook.com のヘルプ
Outlook ヘルプ センター
Exchange Support Team Japan(情報発信専用フォーラム)Outlook Support Team Blog JAPAN(消滅)
バグだらけだ。。。あまりにバグを明らかにしたせいか、突然消滅したMicrosoft TechNet/MSDNブログ(日本語)の捜索のとおり、blogs.technet.microsoft.com/officesupportjp/として一時復活するも抹消。現在は一部の記事が「Exchange Support Team」に残る
Windows 版 Outlook 2016 の新機能
オフライン版のOffice 2016 VBAリファレンスが公開されました。- 初心者備忘録
https://github.com/OfficeDev/VBA-content/
リンク先の下の方のchmファイル
Office 2013 リソース キット
上記のリソースキットを含む一覧はOffice の以前のバージョンに関するドキュメントにある。最古のものはOffice2010で2020年10月13日まで。

以前
2007はページはあってもリンクが死んでいる。以前のバージョンごとの一覧はTechNet https://technet.microsoft.com/ja-jp/library/hh220610%28v=office.14%29.aspx?f=255&MSPPError=-2147217396) だったが変更されている。また、現在のOffice365はリソースキットではなくDeploy Tools 展開ツールとなっており、Officeの展開から入る。この中にはヘルプファイルは入っていない。2004年 Windows OS向けリソースキット・ツールを入手するのリソースキットの解説でも展開のためのツールと資料と説明されている。以前はここにヘルプファイルがあったが、現在は展開(法人などで設定をして一気に大量にインストールする)ためのツールや資料のみとなっている。

[MSDN のトラブルシューティングとサポート](https://msdn.microsoft.com/hh361695) [MSDN コミュニティ(WebArchive)](https://web.archive.org/web/20180327051216/https://msdn.microsoft.com/ja-jp/aa497440) 様々なBLOGの紹介
補足 WebArciveの方が、日本専用でhttps://msdn.microsoft.com/ja-jp/aa497440があり[マイナビ](https://news.mynavi.jp/article/msdn-22/)でも紹介されていた。しかし、[現在はブログを検索する](https://mvp.microsoft.com/ja-jp/MvpSearch)のみで大半は英語で英語のみでOffice-ONLYOffice Development-Japanで[検索](https://mvp.microsoft.com/ja-jp/MvpSearch?ex=Office+Development&lo=Japan&kw=Office&sc=e)すると4名しかHitしない。 あまりにひどい上に、Azureを使えだのジェンダーギャップだのなどもはやOutlookを使うためになんの意味もない。前の方がマシである。みんなが使えるようにする。しかしそのための障害が相変わらずゴロゴロと転がっている。石ころをどける地味な作業こそジェンダーギャップ解消だ。あと3年でつかえなくするのやめて日本語ソースを消すのをやめよう。
---
2018年10月19日以前 [オブジェクト モデル (Outlook VBA リファレンス)2016用最新](https://msdn.microsoft.com/ja-jp/vba/outlook-vba/articles/object-model-outlook-vba-reference) [Office 2013 Technical Library in Compiled Help ](https://www.microsoft.com/en-us/download/details.aspx?id=30389) [Office 2013 VBA Documentation](https://www.microsoft.com/en-us/download/details.aspx?id=40326) [ヘルプファイル版のOffice 2013開発者用リファレンスが公開されました。- Ka-net](https://www.ka-net.org/blog/?p=3674) [Office クライアントの開発 - Office 2013 Laterのオンラインヘルプのトップはこちらから](https://msdn.microsoft.com/ja-jp/library/office/jj162978.aspx) [Office 2010: Developer References ](https://www.microsoft.com/en-us/download/details.aspx?id=2451) [(Outlook2010だが共通)Officeのヘルプを単独で開く。- ka-net](https://www.ka-net.org/blog/?p=2271) [※Office 2007 と Office 2010 の開発者向けヘルプはオンラインで利用できなくなりました](https://support.office.com/ja-jp/article/Office-2007-%25E3%2581%25A8-Office-2010-%25E3%2581%25AE%25E9%2596%258B%25E7%2599%25BA%25E8%2580%2585%25E5%2590%2591%25E3%2581%2591%25E3%2583%2598%25E3%2583%25AB%25E3%2583%2597-f98e4639-ea88-4ea2-8f4d-4b95f6cdf067?ui=ja-JP&rs=ja-JP&ad=JP&fromAR=1) [オフラインの Office 開発者用ヘルプへの接続(2014/4/4更新)](https://msdn.microsoft.com/ja-jp/library/office/dn499822.aspx)

Office 2010 または Office 2007 のコンテキストに依存する (F1) 開発者用ヘルプの場合、オフライン時のヘルプを利用するには以下の手順に従ってヘルプ ウィンドウの既定のヘルプの検索設定を変更してください。


OUTLOOKのオブジェクトはOUTLOOK以外でも操作できる

  • OUTLOOKが他のオフィスのVBA、VBSで操作できることを知っておくといろいろ便利
    • EXCELでメールアドレスを指定して、メールを作成して送信する
    • 通常、OUTLOOK本体のINSPECTORでメール、予定表、アドレス帳で作成するアイテムを、VBAで作成できる
    • 仕訳ルールを確かめることができる
    • メールのリストのEXCEL、ACCESSのテーブルを作成する(前回参照)
    • メールを印刷する際、ある程度内容を選択した印刷をすることができる(以後紹介予定)
  • 特にVBSCRIPTでメール、予定表、アドレスが作成できるのは便利。Windows Powershellも可能
  • VBScriptはテキストメールで送信して、受信者がVBSCRIPTとして保存すると可能になる。
    • 実は便利なだけではなく、少なくともメールは送信済みのmsgファイルをテンプレートとすることが非推奨なので、OUTLOOKを使わずにテンプレートを作ることができる。補足その8参照。
  • Outlook本体ではOutlook オブジェクト ライブラリへの参照が既定で設定
  • またOUTLOOK本体ではOUTLOOK VIEW Controlも併せて参照設定することで細かい検索、VIEWの設定ができるので必須
  • OUTLOOK以外のVBAでも、下記のパターンを使うほか、Outlook Object Library を参照設定することでもOutlookを操作できる。(下記の例では、参照設定後、下記の 'ASのところにあるアポストロフを外す)
  • ExcelでOutlookのアドレス帳を会社名で検索して、メールアドレスを抜き出すこともできる
  • Vbscript 三流君 Outlook Appointment 予定表を操作する より代表的なパターン
'以下がVBSの代表的なパターン
'OUTLOOK以外のVBAでも使用できる
'OUTLOOK以外のVBAではOutlook Object Library を参照設定するとASの前のアポストロフを外すことができる

    Dim oApp        'As NEW Outlook.Application OutlookのApplication
    Dim myNameSpace 'As Outlook.NameSpace
    Dim myFolder 
    Set oApp = CreateObject("Outlook.Application") 'VBAで参照設定をした場合は不要
    Set myNameSpace = oApp.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(9) 
  • OUTLOOKのVBA(VBS)でも重要なことはAPPLICATION - Namespace から始まって、自分が操作したいアイテムのフォルダ、オブジェクトのレベルにたどり着くこと。ここからオブジェクトの作成変更削除、プロパティの操作につながる。このためNameSpaceがすべての入り口になる。

本論

Namespaceがすべての入り口

Application(OUTLOOK) - NameSpace オブジェクト

  • NameSpace オブジェクトを、すべての既存の Outlook フォルダへのゲートウェイと考えることができます。
  • このためすべてのコードの記述の最初は以下のようになる

OUTLOOK以外(Outlookに参照設定済)

Dim olApp As Outlook.Application
Dim gnspNameSpace as Outlook.Namespace
Set gnspNameSpace = olApp.GetNameSpace("MAPI")

OUTLOOK

Dim gnspNameSpace as Outlook.Namespace
Set gnspNameSpace = Application.GetNamespace("MAPI")
  • VBA を使用する場合は、オートメーションを使用してほかのアプリケーションから Outlook で作業する場合、そのアプリケーションの [参照設定] ダイアログ ボックスを使用し、まず Microsoft Outlook XX.0 Object Library への参照を設定する必要がある。
  • Microsoft Outlook XX.0 Object Library への参照が設定されている場合、次のように New キーワードを使用して、Outlook の Application オブジェクトの新しいインスタンスを作成する。
Sub OutlookInstance()
Dim olApp As Outlook.Application: Set olApp = New Outlook.Application
Dim NS As Outlook.Namespace: Set NS = olApp.GetNamespace("MAPI")
Dim olDfolder As Outlook.Folder
Set olDfolder = NS.GetDefaultFolder(Outlook.olFolderInbox)
End Sub
  • Microsoft Outlook XX.0 Object Library への参照を設定していない場合は、CreateObject 関数を使用する必要がある。
  • 一度に使用可能な Outlook のインスタンスは 1 つ。
  • Outlook が起動していない場合に、New キーワードまたは CreateObject 関数によって Outlook の新しい非表示インスタンスが 1 つ作成される。
  • Outlook のインスタンスが既に実行されている場合に New キーワードまたは CreateObject 関数を使用すると、実行中のインスタンスへの参照が返される。(なのでVBAを稼働させている間にOUTLOOKを手動で操作してはいけない)

Objectの指定の順番(優劣)

上記の getdefaultfalderは受信メールフォルダ、予定表などのアイテムのある場所(フォルダ)が直接アクセス可能になる。しかし、OUTLOOKのオブジェクトは順番がある。それぞれのItemに到達するには順番に指定しなければならない。

Outlook プロジェクト内のオブジェクトへのアクセス

Outlook では、多くのオブジェクトが操作対象になります。 オブジェクト モデルを効果的に使用するには、次の最上位レベルのオブジェクトについて理解する必要がある。

MAPIFolder インターフェイス (Microsoft.Office.Interop.Outlook)

このMAPIインターフェイスは(使用が)推奨されていません。このインターフェイスは使用しないでください。 代わりに、インターフェイス Folder を使用して、COM オブジェクト Folder のすべてのメソッド、プロパティ、およびイベント メンバにアクセスします。
 COM オブジェクトのメソッドおよびプロパティ メンバについては、このトピックを参照してください。COM オブジェクトのイベント メンバについては、「MAPIFolderEvents_12_Event インタフェース」を参照すること。
Office 2013以降の解説は英語版のみでOffice2007版とコードが異なる

Office 2007
'宣言
Public Interface MAPIFolderEvents_12
'使用
Dim instance As MAPIFolderEvents_12
Office 2013
'Declaration
<GuidAttribute("000630F7-0000-0000-C000-000000000046")> _
<TypeLibTypeAttribute()> _
<InterfaceTypeAttribute()> _
Public Interface MAPIFolderEvents_12
'Usage
Dim instance As MAPIFolderEvents_12

T:Microsoft.Office.Interop.Outlook.Application

T:Microsoft.Office.Interop.Outlook.Explorer

T:Microsoft.Office.Interop.Outlook.Inspector

ここから下が代表的なアイテム

T:Microsoft.Office.Interop.Outlook.MailItem メール

T:Microsoft.Office.Interop.Outlook.AppointmentItem 予定表

T:Microsoft.Office.Interop.Outlook.TaskItem タスク(仕事)

olFolderTasks と olFolderTodoの違い

olFolderToDoはOutlook2016では外見上は明確で
Todoバーに登録したTaskはTodo
そうでないものはolfolderTasks
である。
_NameSpace.GetSharedDefaultFolder メソッド(Microsoft.Office.Interop.Outlook)
FolderType は、次のいずれかの OlDefaultFolders 定数に指定できます。 olFolderTasks (定数 olFolderToDoこの引数には指定できません)。
olFolderTod にTaskを作ると共有ができない。このため、一般的なサンプルコードではtodoに入れるものを作らない方がよい。

自分のタスクを表示する

Outlookの 3 つの場所にタスクが表示されます: to do バー、タスク、および予定表の日毎のタスクリストにします。SharePointタスク リストを購読している場合、自分に割り当てられているすべてのタスクはすべての 3 つの場所でも表示されます。

タスクと To Do アイテムを作成する
VBScriptのTaskの操作例とBodyプロパティの取り扱い

Office Space: Outlook の仕事を操作する
このサンプル


Const olTaskItem = 3

Set objOutlook = CreateObject("Outlook.Application")
Set objTask = objOutlook.CreateItem(olTaskItem)
(省略) 
objTask.Save

Outlook のすべての仕事の一覧を返すスクリプトは


Const olFolderTasks = 13

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderTasks)

つまりTaskを作成するとolFolderTasksに作成され、olFolderTodoには作成されない。
また

Body プロパティを取得すると Outlook のセキュリティ警告がトリガされ、メッセージ ボックスに応答してスクリプトが取得対象の仕事にアクセスできるようにしなければならなくなるためです。Body プロパティの値を取得しないようにすることで、セキュリティ警告を回避し、スクリプトがユーザーの介入を必要とせずに実行できるようにしています。

この記述は2005年のため、現在でもそうなのかは不明だが、とりあえず項目だけ取得した方が安全だ。
なお、TaskItemのBodyプロパティは現在はメールが入る場所である。

受信したメールからタスクを作成する(リンク先のタイトルはこういう意味)

「メッセージからタスクを作成する」というリンク先のタイトルのメッセージとは受信した電子メールのこと。(送信でもできるけど)

これと同様に受信したメールから予定表に追加できる

 航空会社、レンタカー会社などのサポートされた送信者からのメールは、メールから予定表にイベントを自動的に追加ができるようになっているが当然のことながら日本の業者はいないようだ。
 しかしicalender機能を使うことで会議を電子メール メッセージに [予定表に追加] を作成するを使って登録できる。また法人用としては自動処理オプションを使用する方法がある。
しかし一番簡単な方法はVBAとかを使わず、受信したメールをイベントのある日にドラッグするである。

T:Microsoft.Office.Interop.Outlook.ContactItem 住所録(アドレス帳)

  • Outlook において "アイテム" とは、ほかのアプリケーションにおけるファイルのように、情報を保持するオブジェクトです。アイテムにはメール メッセージ、予定、連絡先、仕事、履歴項目、およびメモが含まれます

Explorer および Inspector オブジェクト

メール メッセージまたは連絡先など、Outlook の特定のアイテムを含むウィンドウは Outlook の **Inspector **オブジェクトです。
メールをダブルクリックで開いた画面がINSPECTOR
https://msdn.microsoft.com/ja-jp/library/cc344584.aspx

 このExplorer(s)とInspector(s)の4つは例外のオブジェクトである。とくに Application.ActiveExplorerメソッドApplication.ActiveInspectorメソッドはMAPIを介さずExplorerオブジェクトとInspectorオブジェクトを取得できる。

オブジェクト、UIとの関係

Applicaiotion - Namespace Mapi
Explorers - Explorer - Panes - Pane
- Navigation Pane
Navigation Groups
Navigation Group
Navigation Modules
Navigation Module
Navigation Folders
Navigation Folder --Views - View -ViewFields ViewField
Applicaiotion - Namespace Mapi - Inspector
そしてInspector,ExploreからCommandBarsへ行く
Storeは後述

Explorers オブジェクト (Outlook)

  • エクスプローラー のセットが含まれています すべてのエクスプ ローラーを表すオブジェクト。
  • エクスプローラーをコレクションに含まれる表示する必要はありません。(STORE オブジェクトとの相違点)
  • ***これを使わずに、エクスプローラーオブジェクトを使用します。***エクスプローラーオブジェクトをアプリケーションから取得するプロパティオブジェクトです。

Explorer オブジェクト (Outlook)

  • フォルダーの内容が表示されるウィンドウを表します。
  • 特定のエクスプローラーを表す オブジェクトを取得するには、Explorers オブジェクト の Item メソッドを使用します。
  • 現在アクティブなエクスプローラーを 表すオブジェクトを取得するには、ActiveExplorer メソッドを使用します。
  • フォルダーに関連する Explorer オブジェクトを取得するには、 GetExplorer メソッドを使用します。
  • 関連するファイル フォルダーを表示するには、 Folder オブジェクト の Display メソッドを使用します。

Inspectors オブジェクト (Outlook)

  • すべてのインスペクターを表すInspectorオブジェクトのセットが含まれています。
  • インスペクターは非表示の場合もこのコレクションに含まれます。
  • Application.Inspectors のプロパティを使用して、アプリケーションオブジェクトからInspectorsを取得します。
  • メール等の閲覧画面を開くとInspectors.NewInspectorイベントが発生する。

アプリケーションオブジェクトからInspectorsを取得するのはこういう意味


Set myInspectors = Application.Inspectors

Inspector オブジェクト (Outlook)

Stores オブジェクト

  • 現在のプロファイルで利用できるすべてのストアを表す Store オブジェクトの集合です。

  • ストアのオブジェクトを使用するにはすべてのフォルダーを列挙し、現在のセッションですべてのストアのフォルダーを検索します。 (Explorerとの相違)
    Stores オブジェクト
    The Folder object has replaced the MAPIFolder object that existed in Microsoft Office Outlook 2003 and earlier versions of Outlook. New solutions should only use Folder.
    フォルダーオブジェクトは、Microsoft Office Outlook 2003年および Outlook の以前のバージョンに存在していたMAPIFolderオブジェクトに置き換えられました。新しいソリューションには、フォルダーのみを使用する必要があります。
    ※この辺がMAPIフォルダーオブジェクトがない、推奨が使用されない原因かもしれない。

  • ストアのフォルダーツリーの1つのレベルですべてのフォルダーオブジェクトを表すフォルダーのコレクションです。Foldersコレクションでは、検索フォルダーのコレクションを表すこともできます。

  • ストア オブジェクト、ローカル コンピューターまたは電子メール メッセージやその他のアイテムが格納されているネットワーク ドライブ上のファイルを表します。

  • Stores コレクション。現在の Outlook プロファイルに含まれているすべてのストアを表します。1 つのプロファイルには 1 つ以上の電子メール アカウントを定義し、それぞれの電子メール アカウントは特定の種類のサーバーに関連付けられます。

    • サーバーの種類によって、ストアの種類と、電子メールやその他のアイテムの配信方法および格納方法が決まります。
    • たとえば、Exchange Server では、ローカル コンピューターまたはマップされたネットワーク ドライブ上の .pst ファイルまたは .ost ファイルに、電子メールやその他のアイテムが格納されます。
    • Hotmail などの HTTP サーバーでは、ローカル コンピューターの .pst ファイルにアイテムが格納されます。
  • Store オブジェクトおよび Stores オブジェクトは、次の機能をサポートしています

    • Store.GetRootFolder に続いて Folder.Folders を使用するストア内のフォルダーの列挙
    • Store.GetSearchFolders によるストア内の検索フォルダーの列挙。この場合、Stor.Isopen - Store.GetSearchFoldersを使用すること。
    • Better performance with enumerating folders. Because getting the root folder or search folders in a store requires the store to be open and opening a store imposes an overhead on performance, you can check the Store.IsOpen property before you decide to pursue the operation.
    • フォルダーの列挙におけるパフォーマンスの向上。ストア内のルート フォルダーまたは検索フォルダーを取得するためには、そのストアが開かれている必要がありますが、ストアを開く操作によってパフォーマンス上のオーバーヘッドが発生します。そこで、操作を続行する前に Store.IsOpen プロパティをチェックすることができます。
    • Store.FilePath プロパティを使用した、Exchange Server 用のローカルのストア (.pst または .ost)、または POP3 電子メール サーバー、IMAP 電子メール サーバー、HTTP 電子メール サーバー用のストア (.pst) の配置。
    • Store.ExchangeStoreType プロパティによる Exchange ストアの種類の検出および異なる種類の Exchange ストアの識別。
    • Store.IsCachedExchange プロパティおよび Store.IsDataFileStore による Exchange Server に関する追加情報の取得。
    • Store.PropertyAccessor プロパティによる PropertyAccessor オブジェクトの取得により、ストアのプロパティが明示的に組み込まれているプロパティとして Outlook オブジェクトモデルで公開されていなくても、そのプロパティにアクセスすることができます。
    • Store.GetRulsで現在のセッションに定義されている Rule オブジェクトを含む Rules コレクション オブジェクトを返します。つまり仕訳ルールはStoreからアクセスできる。

Outlook のアイテムを保存する
Store.GetRules メソッド (Outlook)(機械翻訳)
No.775 仕訳ルールの一覧を取得する(Outlook.Store.GetRulesメソッド) - VBAサンプルコード[リンク切れのためArchive]

Store オブジェクト

現在のプロファイルのアカウントの電子メール メッセージやその他のアイテムが保存される、ローカル コンピューターまたはネットワーク ドライブ上のファイルを表します。
下記のサンプルで
oRoot というのがあるが、これが実はMAPIFolder
そしてこの時点ではFolder 単数だが
EnumerateFolders oRoot
でユーザー定義関数に入り、
Set folders = oFolder.folders
というのが出てくる。
この行に注目してほしい。せっかくFolderだったものが、またFoldersになる。
つまりoStore.getrootFolderで取得するフォルダーとは、複数のFolderの入った一つのFolderで、上記の「ストアのフォルダーツリーの1つのレベルですべてのフォルダーオブジェクトを表すフォルダーのコレクションです。」とはこのことを表している。

EnumerateFoldersInStores.BAS
Sub EnumerateFoldersInStores() 
 Dim colStores As Outlook.Stores 
 Dim oStore As Outlook.Store 
 Dim oRoot As Outlook.Folder 
 On Error Resume Next 
 Set colStores = Application.Session.Stores 
 For Each oStore In colStores 
  Set oRoot = oStore.GetRootFolder '<<
  Debug.Print ('oRoot.FolderPath') 
  EnumerateFolders oRoot 
Next 
End Sub 

Private Sub EnumerateFolders(ByVal oFolder As Outlook.Folder) 
  Dim folders As Outlook.folders 
  Dim Folder As Outlook.Folder 
  Dim foldercount As Integer 
  On Error Resume Next 
  Set folders = oFolder.folders '<<
  foldercount = folders.Count 
 'Check if there are any folders below oFolder 
 If foldercount Then 
 For Each Folder In folders 
 Debug.Print (Folder.FolderPath) 
 EnumerateFolders Folder 
 Next 
 End If 
End Sub

Session と NameSapce Mapi

OUTLOOKのVBAでは
Dim oFolder
Dim NS as Namespace: Set Namespace=Application.Getnamespace("MAPI")として
Set oFolder = NS.GetDefaultFolder(olFolderInbox)
として受信フォルダを指定できる。
これは
Set oFolder = Application.Getnamespace("MAPI").GetDefaultfolder(olFolderInbox)
と書くことができる。
これをさらに
Set oFolder = Application.Session.GetDefaultFolder(olFolderInbox)
と書くことができる。
以上から
Application.Getnamespace("MAPI") は Application.Session に置き換えることができる。

代表的なオブジェクトの次はユーザーインタフェースについて

ナビゲーション ウィンドウとは

Outlook ウィンドウの左側に表示され、[メール]、[予定表]、[連絡先]、[タスク]、[メモ] など Outlook の領域間を切り替えることができる。また、ビュー内で作業しているときは、そのビュー内のフォルダーがナビゲーション ウィンドウに表示される。
https://support.office.com/ja-jp/article/ナビゲーション-ウィンドウとは-24fcad76-7604-4ab0-80ed-18d65fcc9dc3
https://msdn.microsoft.com/ja-jp/library/cc344368.aspx

まとめ Outlookは4系統の指定の流れがある

1. Explorer FolderからさらにViewとItemがある

Applicaiotion  - Namespace Mapi
- Namespace Mapi - Explorers - Explorer - Panes - Navigation Pane - Navigation Groups - Navigation Group

  • Navigation Modules - Navigation Module - Navigation Folders -
    Navigation Folder -Views - View -ViewFields - ViewField
    Navigation Folder - Items - Item

2.Inspector これはメールなどを開いた画面

Applicaiotion - Namespace Mapi - Inspectors - Inspector

3.Stores

Application - Namespace Mapi - Stores - Store - Store.oRootFolder - Folders - Folder - Items - Item
                                                                              Folder - Views - View

保存先などのデータフォルダー、複数アカウント、検索フォルダにすべてアクセスできる。
さらに仕訳ルール(メールの振り分けルール)にもアクセスできる(ただし低速)
あまり知られていないが、実は一番強力なのはこれかもしれない。
StoreにPropertyAccssesorを使うとプロパティを見ることができる。
これは直接メール等のアイテムにアクセスするのには便利だが、視覚的にはExploreよりわかりづらい

4.Account

Applicaiotion - Namespace Mapi - Accounts - Account
Applicaiotion - Namespace Mapi - Outlook Data Folders(保存先) - Folder - Views -ViewApplicaiotion - Namespace Mapi - Outlook Data Folders(保存先) - Folder - Itemes - Item
Application.Session.folders(olAccount.DisplayName).folders(olFolderInbox).Items
とこのような指定方法になる。しかしこれでは保存先が指定できない。この方法は複数のメールアドレスを管理しているときはあまり必要がない。

サンプルコード

以下のコードで上記の4つの系統にアクセスしている。
Microsoft Outlook View Control を参照設定してください。

testgetting.BAS
Sub testgetting()
'[《OutLook VBA》特定フォルダ内のメールを保存するマクロ - 不連続日記](http://nostressman1q86.hatenablog.com/entry/2013/05/02/225742)
'[Outlook VBA change Send using account when item load - StackOverFlow - ](http://stackoverflow.com/questions/18342667/outlook-vba-change-send-using-account-when-item-load)
'[Outlook Object Model で既定のフォルダ以外のフォルダを取得する方法 - OUTLOOK研究所 - ](https://outlooklab.wordpress.com/2008/03/29/outlook-object-model-%E3%81%A7%E6%97%A2%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E4%BB%A5%E5%A4%96%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99/)
'[step1.5 受信トレイ以外のフォルダを指定 ](http://outlookvba.blogspot.jp/2011/11/step15.html)
Dim olApp As Outlook.Application
Dim NS As Outlook.NameSpace: Set NS = Application.GetNamespace("MAPI")
Dim olPanes As Outlook.Panes
Dim olNavP As Outlook.NavigationPane
Dim olNavMs As NavigationModules, olNavM As NavigationModule
Dim olNagGs As NavigationGroups, olNavG As NavigationGroup
Dim olNaVFs As NavigationFolders, olNavF As NavigationFolder
'Dim olMods As Modules, olMod As Module
Dim olViews As Outlook.Views, olView As Outlook.View
'Dim olViewFs As Outlook.ViewFields
Dim olViewF As Outlook.ViewField
Dim olTView As Outlook.TableView
Dim olMapiFolder '使用が推奨されない
Dim Aex As Explorer, Aexs As Explorers, Ains As Inspectors, Ain As Inspector
Dim olCurrentView, olCurrentModule, olCurrentFolder
Dim GetCurrentItem
Dim olStores As Outlook.Stores
Dim olStore As Outlook.Store
Dim oRoot As Folder, oFolders As Outlook.folders, oFolder As Outlook.Folder, oSCFolders As Outlook.folders, oSCFolder As Outlook.Folder, olSPFolder
Dim olRules As Outlook.Rules, olRule As Outlook.Rule
'----Seach Account
Dim olAccount As Outlook.Account, olAccounts As Accounts: Set olAccounts = Application.Session.Accounts
Dim olAccountCurrentUser As Recipient, strEntryId As String, olRcp As Recipient
For Each olAccount In olAccounts
With olAccount
Debug.Print .AccountType, .CurrentUser.Address, .DisplayName
Debug.Print Application.Session.folders(.DisplayName).folders(olFolderInbox).Items.Count
End With
Next
Set olAccountCurrentUser = Application.Session.CurrentUser
strEntryId = olAccountCurrentUser.EntryID
'----
'----Store
Set olStores = Application.Session.Stores
For Each olStore In olStores
Set oRoot = olStore.GetRootFolder
Debug.Print (oRoot.FolderPath)
Set oFolders = oRoot.folders
 For Each oFolder In oFolders
 Debug.Print (oFolder.FolderPath)
 Debug.Print oFolder.Items.Count
If olStore.IsOpen = True Then
Set oSCFolders = olStore.GetSearchFolders
  If oSCFolders.Count > 0 Then
    For Each oSCFolder In oSCFolders
    Debug.Print oSCFolder.Name
    Next
  End If
Set olSPFolder = olStore.GetSpecialFolder(olSpecialFolderReminders)
On Error Resume Next
Set olRules = olStore.GetRules
On Error GoTo 0
End If
 
Next
Next

On Error Resume Next
Select Case TypeName(Application.ActiveWindow)
Case "Explorer"
Set Aex = ActiveExplorer
Set olCurrentView = Aex.CurrentView
Set olCurrentFolder = Aex.CurrentFolder
Set olPanes = Aex.Panes
Set olNavP = Aex.NavigationPane
Set olNavMs = olNavP.Modules
Set olNavM = olNavMs.Item(1)
Set olNavG = olNavM.NavigationGroups.Item(1)
Set olNaVFs = olNavG.NavigationFolders
Set olNavF = olNaVFs.Item(1)
If Application.ActiveExplorer.CurrentView.ViewType = _
olTableView Then Set olTView = Aex.CurrentView
For Each olViewF In olTView.ViewFields
With olViewF
Debug.Print .ColumnFormat.Label & _
" (" & .ViewXMLSchemaName & ")" & vbCrLf
End With
Next
Case "Inspector"
Set Ains = Application.Inspectors
Set Ain = Application.ActiveInspector
Set GetCurrentItem = ActiveInspector.CurrentItem
Debug.Print "Type:" & Ain.Session.Type, "Offline:" & Ain.Session.Offline,
End Select
On Error GoTo 0
End Sub

プロパティの取得と設定に関するヒント集(2018/7/10追加)

プロパティの値の取得と設定に関しては、以下のヒントを参考にしてください。
という記事ができていた

  • オブジェクトのプロパティを読み書きするには、 MailItem.Subject のように親オブジェクトから直接参照する。
    • ※VBAで一般的なもので、とくにOUTLOOK特有ではありません
  • DocumenteItemオブジェクトを除いて、Itemproperties-Itempropatyで組み込み及びユーザー設定のプロパティ(カスタムプロパティ)を列挙できる。
      - ※ここからめちゃくちゃ記述が難しくなります。
  • DocumentItemにはPropertyAccesorを使う。
    • Returns a PropertyAccessor object that supports creating, getting, setting, and deleting properties of the parent DocumentItem object. Read-only.
  • PropertyAccessorを使用して取得し、 DocumentItemオブジェクト、Outlook オブジェクト モデルで公開する組み込みのアイテム レベルのプロパティまたはプロパティに次のオブジェクトのカスタム プロパティを設定します。AddressEntry、Addresslist オブジェクトを見つける、添付ファイル、 ExchangeDistributionList、 ExchangeUser、フォルダー、受信者、およびストアです。
  • 複数のカスタム プロパティの設定を取得または、 [ユーザー プロパティ]のオブジェクトではなくPropertyAccessorオブジェクトを使用して、パフォーマンスを向上させる。
  • 名前空間によるプロパティの参照をする場合、このような参照は、***大文字小文字を区別します。***たとえば、有効な名前空間urn: スキーマ: 連絡先: 一定ですが、 urn: スキーマ: 連絡先: 名はありません。
  • アイテム オブジェクトの現在のフォルダーにアイテムを保存するのには、アイテムのSaveメソッドを呼び出すプロパティが保存されます項目。
  • AddressList、フォルダー、受信者、およびストア) は、 Saveメソッドを持たないオブジェクトをアイテム レベルではない、 PropertyAccessor.DeleteProperty、 PropertyAccessor.DeletePropertiesを呼び出すこと。 SetProperty、またはSetPropertiesでは、オブジェクトのプロパティを保存は暗黙的にします。

PropertyAccessor

このセクションでは、 PropertyAccessorを使用して取得し、プロパティを設定するときに型の変換をシンプルに保つためのベスト プラクティスについて説明します。PT_SYSTIMEなどの MAPI プロパティの種類の定義、プロパティの型を参照してください。

  • ほとんどの Outlook の日付と時刻の値は世界協定時刻 (UTC) 形式で格納されますが、存在は保証されません、 PT_SYSTIMEの MAPI の種類のすべてのプロパティが常に UTC を返します。PT_SYSTIMEのプロパティを取得すると、 VT_DATE値を返します。
  • PT_SYSTIMEのプロパティを設定する場合は、ローカルの日付と時刻の値ではなく、UTC 値としてプロパティを設定することを確認します。GetProperty、 SetProperty、 GetProperties、およびSetPropertiesメソッドでは、タイム ゾーンの変換は実行されません。
  • タイム ゾーンを明示的な変換を実行するのにには、ヘルパー メソッドPropertyAccessor.LocalTimeToUTCおよびPropertyAccessor.UTCToLocalTimeを使用します。
  • 複数値を持つプロパティ (Microsoft Visual Basic のVT_ARRAY型目) は、同じ数の要素は、プロパティに値があるとを含む 2 次元配列として格納されます。複数値を持つプロパティを取得すると、 VT_ARRAY値を返します。複数値を持つプロパティを設定する場合は、プロパティに設定する値ごとに 1 つの要素を持つ 2 次元配列 ( VT_ARRAY) を渡します。
  • バイナリ プロパティ (MAPI のPT_BINARY型目) は、文字列ではなく、バイトの配列として格納されます。バイナリ プロパティを取得すると、 VT_ARRAY型の値を返します。GetProperty、 SetProperty、 GetProperties、およびSetPropertiesメソッドでは、バイナリ配列と文字列間の変換は実行されません。明示的に変換を実行するのにヘルパー メソッドのPropertyAccessor.BinaryToStringおよびPropertyAccessor.StringToBinaryを使用します。
  • PT_OBJECTなど、特定の MAPI プロパティ種類は、 PropertyAccessorでサポートされていません。取得またはこのようなプロパティを設定しようとしています。「プロパティの操作がサポートされていません」エラーになります。
  • MAPI proptag 名前空間で参照を使用してプロパティの設定を取得またはとき、は、proptag で指定された型が、プロパティの基になる型と一致していることを確認してください。VT_BSTRとして取得またはプロパティのために proptag で一種 001E または 001F のいずれかを指定できるPT_STRING8プロパティの場合を除いてを取得または設定プロパティを伴わない任意の型の強制変換し、場合、エラーが返されますが 型の不一致です。
  • プロパティを設定する場合は、MAPI proptag 名前空間ではなく MAPI 文字列名前空間でプロパティ参照を使用するのには制限が少ない場合があります。MAPI 文字列名前空間でプロパティを指定しても、プロパティの基になる型と一致する値が厳密に必要はありません。たとえば、 PT_SYSTIMEなどの日付と時刻のプロパティを設定するのにはVT_BSTRのような文字列値を渡すことができますし、 VT_BSTRをされると、値の型がプロパティの型になります。

VBScriptでできる主な操作

実際のサンプルコード Outlookサポートナビ! ≫≫≫ 事例で探す Q&A編 ≫≫≫ Outlookフォーム作成/VBSプログラミング
ここで開発環境がOutlookとExchangeserverと書いてある。

Outlookのフォームとテンプレート

Outlookのフォームとテンプレートは3種類ある

1.新しいメールを起動してそれをoftとして保存する方法
ちょっと面白いやり方として、メール本文をExcelでテンプレートを作るという発想。すごく日本人っぽい。
ただ、この方法は3.のカスタムフォームを作成しなくてもテンプレートである程度できるという例です。
Create a Form in Excel 2010
https://www.youtube.com/watch?v=Vewg_mxnBMw

oftを利用する例の注意点

ただしこの場合、メールはHTML形式になります。
次に、以下の公式のサイトは、メールのテンプレートの場所の解説がおかしい。
CreateItemFromTemplate メソッド (Outlook)
ここの例ではいかにもテンプレートの場所が自由なように記載していますが、
Create an email message template
Send an email message based on a template

The default templates folder is opened. The folder location (in Windows 7 and later operating systems) is c:\users\username\appdata\roaming\microsoft\templates. If your template is saved in a different folder, click Browse, and then select the template.

Windows7から標準のテンプレートフォルダは、環境変数を用いた方がいいので

%APPDATA%\Microsoft\Templates\

ということになります。公式が使わないのが謎です。

次に公式のこれを環境変数を用いて書いてますが、公式が省略できるDefaultFolderを使うことを書いているのかというと、Outlookに複数のメールアドレスを設定した時を想定していると考えられます。

Sub CreateFromTemplate2Dash() 
 Dim MyItem As Outlook.MailItem 
 
 Set MyItem = Application.CreateItemFromTemplate("%APPDATA%\Microsoft\Templates\statusrep.oft", _ 
 Application.Session.GetDefaultFolder(olFolderDrafts)) 
 MyItem.Save 
End Sub

2.VBAのユーザーフォームを使用する方法
Outlook Userform and Combo boxes
https://www.youtube.com/watch?v=QV54mj43mzA
Slipsticcomが実例を示している。
というかコードをコピペしているので早すぎて見えない。
しかし、この動画のコードは次で確認できます。
https://www.slipstick.com/developer/code-samples/vba-userform-sample-select-list-templates/
これは1.で作ったテンプレートを使い分けることを念頭にユーザーフォームを作成し、その中に切り替えるためのComboBoxを作成するというもの。

3.開発タブから呼び出すカスタムフォーム
ここが2とかぶってややこしいが、個人用フォームライブラリ、Outlookフォルダー等に保存する。
VBScriptを使用するのはこの3のフォーム。

Outlook オブジェクト モデルにおけるセキュリティ動作

Outlook が構成されている方法の対象となる特定のデータにアクセスしたり、特定のアクションを実行する Outlook オブジェクト モデルを使用するアプリケーションのクライアント コンピューターの信頼されたアプリケーションは、セキュリティの警告を呼び出すことができます。
  • 「アドレス帳」警告:この警告は、信頼できないアプリケーションが Outlook データにアクセスするときに呼び出される最も一般的なセキュリティの警告です。
  • 「メッセージ送信」警告:この警告は、信頼できないソリューションからアイテムが送信しようとするときに発生します。このダイアログ ボックスは、信頼されていないアドインが迅速かつ自動的にメッセージを送信することを防止するタイマーが組み込まれています。
  • 「アクション実行」警告:この警告は、信頼できないソリューションが、 [Actionsコレクション](https://docs.microsoft.com/ja-jp/office/vba/api/outlook.actions)からカスタム アクションを実行するときに発生します。

アドレス帳にアクセスするときの補足

電子メール アドレスの情報にアクセスしようとしているか、自分の代わりに電子メールを送信しようとしているプログラムに関する警告が表示される

現象 次のいずれかのセキュリティ警告が表示されます。
  • Outlook 内に保存されている電子メール アドレス情報がプログラムによってアクセスされようとしています。 これが予期しない動作である場合は [拒否] をクリックして、ウイルス対策ソフトウェアが最新の状態であることを確認してください。
  • プログラムによって電子メール メッセージが送信されようとしています。 これが予期しない動作である場合は [拒否] をクリックして、ウイルス対策ソフトウェアが最新の状態であることを確認してください。
  • 電子メール メッセージを送信する可能性のある処理が、プログラムによって実行されようとしています。 これが予期しない動作である場合は [拒否] をクリックして、ウイルス対策ソフトウェアが最新の状態であることを確認してください。
原因 ***プログラムが Outlook アドレス帳の連絡先情報にアクセスしようとしたり、ユーザーの代わりにメールを送信しようとしたりする***と、これらのセキュリティ警告が表示されます。 既定では、信頼できるプログラムは COM アドインのみです。 メール管理者が、特定のアドインを "信頼できるアドイン" リストに追加して許可している場合があります。 その他のプログラムは信頼されていないので、セキュリティ警告が表示される理由は、プログラムが悪意のあるリスクであり、Outlook を使用してウイルスを拡散するように設計されたためです。 この安全対策が確立される前は、連絡先にリストされているユーザーにメッセージを送信することで、ウイルスが Outlook にアクセスし、拡散する可能性がありました。 自動的に起動するプログラム 自動的に起動したプログラムが原因の可能性があります。 たとえば、プログラムが Outlook オブジェクト モデルの Item.Send メソッドを使用して、電子メール メッセージを自動的に送信しようとする場合です。 ユーザーが起動するプログラム ユーザーが起動したプログラムが原因のこともあります。 たとえば、Outlook のデータを PDA またはモバイル デバイスと同期するプログラムを使用している場合などです。

2019相当から、Excelなど、OUTLOOK以外からGAL(法人用のアウトルックにあるグローバルアドレス帳)などにアクセスすると、この警告にかかりやすくなっているらしい。また、自動的に起動するプログラムというのはExcelからOutlookを参照設定して、ExcelのVBAでItem.sendをしたときを指している。なお、ユーザーが起動するプログラムというのは、かつて、電子手帳、Palm、HndSpring Visor、Sony Clieというデバイスがあった。これらはPCのOutlookと同期することによりアドレス帳をわざわざ一から入力することなく、電話をかけることができた。この発展形がGoogleのAndroidでPCでGmailを使い、アドレス帳を作成すると、ネットを介してAndroid端末が同期する。しかし、PDA、PIAというデバイスはネットにつなげる能力はほぼなかったので、USB等を介して専用の同期ソフトを介してOutlookと同期していたのである。PalmとPC間のデータ同期技術を知る。しかし2021年にPDAを使っている人はいないので、この警告を見ることはできない。このため、アドレス帳を参照するか、ExcelからVBAでOutlookをバインディングして、メールを送信するときに警告が出るということになる。

なお、ウィルスソフトを更新しても効かないことがほとんどだろう。とくにGALに関するアクセスの場合、管理者設定がからむので、[Grop Policy HOME Microsoft Office 365 ProPlus, Office 2019, Office 2016](https://admx.help/?Category=Office2016&Language=ja-jp](https://admx.help/?Category=Office2016&Language=ja-jp)等の知識が必要となる場合もある。

###Outlook オブジェクト モデルにおけるセキュリティ動作

- OUTLOOK 2007 以前のシステムはオブジェクトもデルガードを使っていた。オブジェクト モデル ガードは、信頼されていないアプリケーションが、OUTLOKのオブジェクトモデルを使用して、電子メール アドレスの情報を取得し、Outlookの外部にデータをストアする、特定のアクションを実行する電子メール メッセージを送信するときにユーザーに警告し、ユーザーに確認メッセージが表示されます。 - オブジェクト モデル ガードは、識別し、これらのエントリ ポイントを保護することに成功しますが、2 つの主な問題の存在はなくしてしまうのではなく、オブジェクト モデル ガードをレンダリングします。 - これは過警告したり、ユーザーが安心してオブジェクトにアクセスすることを妨げていた - Office2007以降は引き続きオブジェクトガードを使用しつつ、オブジェクト モデル ガードが警告を生成する場合には新しい既定の状況を定義し、Outlook クライアントに対して適度なセキュリティ レベルを維持しつつ、適切な条件下における過度のセキュリティ警告を低減させます。

Commandbarを使った以前のマクロは動かないこともない

現在はこの方法は

  1. マクロを作成する
  2. クィックアクセスツールバーに適当なアイコンで登録する
  3. 必要ならばモジュールとクィックアクセスツールバーのユーザー設定をエクスポートする。
  4. Commandbarを使う方法のマクロは違うものに変える

とすべきである。しかし、以前のマクロがあるのと上記でもCommandbarに触れているので、ここで述べる。

Microsoft Office コマンド バーを使用したプログラミング
ここのコードを改造した下記のマクロは、現在でも動く

Public Sub ListOutlookExplorerCmdBarNamesPlus()
    ' 目的 : 現在表示しているエクスプローラ(メール、連絡先など)のコマンド バー名をすべて表示します。
    ' 注 : このコードは Outlook のみで機能します。
    ' 注 : OUTLOOK 2010からCommandBarは廃止されているので、OUTLOOK2010のタブとは一致しません。
    MSの公式コードからさらにCommandbarControlsを抜き出して表示しています。
    Dim objCommandBar As Office.CommandBar
    Dim objCmdBarCtrl As CommandBarControl, objCmdBarControls As CommandBarControls
    For Each objCommandBar In Application.ActiveExplorer.CommandBars
    On Error Resume Next
        Set objCmdBarControls = objCommandBar.Controls
        For Each objCmdBarCtrl In objCmdBarControls
        With objCmdBarCtrl
        Debug.Print objCommandBar.Name, objCommandBar.Protection, objCommandBar.Visible, .Caption, .Enabled, .TooltipText
        End With
        Next objCmdBarCtrl
     If Err.Number <> 0 Then Debug.Print "Error occur,Number and Discripttion is ", Err.Number, Err.Description: Err.Clear
     On Error GoTo 0
      Next objCommandBar    
End Sub

コマンドバーッて何?

コマンドバーは現在のリボンにあたる。
Commandbarというのは裏技で、簡単にいうとツールバーのキーボード操作をVBAで直接やるもので、メソッドを知らない、あるいはメソッドがないものをこれで実現するという使い方をする。
CommandBar ID 一覧(Office 2007)

コマンドバーのコントロールIDが分かれば、下記コードのようにOfficeソフトの様々なコマンドを実行することができます。(Excel)

Findconorl.(ID:=xxx).Executeがその例である。ID番号さえわかればVBAの命令を知らなくてもよいのである。

 また、マクロを登録した場合、独自にメニューを作るという方法があった。

リボンのカスタマイズなど誰がやるのか…

現在はコマンドバーはリボンとなり以下のような手順でOUTLOOKもカスタマイズする。
VBAをリボンUIに追加する(インストーラー付き)
この記事の筆者も書いているが、こんなことは絶対にやらない。みずほ銀行のメインフレームより難しく、まったくメリットがない。仮に成功しても次の人がカスタマイズすることが難しい。この記事を書いた人は天才なのではないだろうか。しかしそのすごさはこれをやる人がいないため認識されない。Extending the User Interface in Outlook 2010のような記事は読む時間が30分に設定されC#ばかり使っている。検索しても、VBAのサンプルはほとんどない。前述のQiitaの記事を書いた人はよく見つけてきたものである。
CommandBars オブジェクト (Office)

メモ 一部の Microsoft Office アプリケーションにおける OUTLOOKのCommandBars の使用方法が、Microsoft Office Fluent ユーザー インターフェイスの新しいリボン コンポーネントによって置き換えられました。

ショートカット メニューのカスタマイズ

CommandBarオブジェクトが Outlook から使用されなくなったため、 CommandBarオブジェクトに依存するアプリケーションオブジェクトのショートカット メニューのイベントは同様に、推奨されているし、期待どおりに機能しません。これらのイベントを以下に示します。
AttachmentContextMenuDisplayイベント
ContextMenuCloseイベント
FolderContextMenuDisplayイベント
ItemContextMenuDisplayイベント
ShortcutContextMenuDisplayイベント
StoreContextMenuDisplayイベント
ViewContextMenuDisplayイベント

 これが何を言いたいかというと、Findcontrol(ID:=)でズルをしようとしてもダメですよ。ということのようだ。
 またクィックアクセスツールバー(QAT)もCustomizing the Quick Access Toolbar in the 2007 Office Fluent User Interface同様だ。

それでは完全に死んだのか?

OUTLOOKで予定表を表示させているところで、次のStackOverFlowのVBAを使うとOutlook2016でも使える。

Private Sub NewCustomAppt_ExecuteMso()

    'objects
    Dim objExpl As Outlook.Explorer
    Dim objFolder As Outlook.Folder

    'appointment
    Dim objAppt As Outlook.AppointmentItem
    Dim objOutlookAttach As Outlook.Attachment ’たぶん拡張性を考えた宣言

    Dim objNS
    Set objNS = Application.GetNamespace("MAPI")

    Set objExpl = Application.ActiveExplorer ’予定表のExplorerを見ている状態を取得

    If Not objExpl Is Nothing Then
        Set objFolder = objExpl.CurrentFolder
        If objFolder.DefaultItemType = olAppointmentItem Then
            objExpl.CommandBars.ExecuteMso ("NewAppointment") ' <----
            Set objAppt = Application.ActiveInspector.CurrentItem
            objAppt.Location = "Careers Service, Level 6 Livingstone Tower"
            objAppt.ReminderSet = True
            objAppt.ReminderMinutesBeforeStart = 4320
            objAppt.Body = "If you wish to cancel or re-schedule this "
        End If
    End If
End Sub

CommandBars.ExecuteMsoはFlagの付与、クリアという重要な裏技がある

CommandBars.ExecuteMso メソッド (Office)

パラメーター

名前 必須 / 省略可能 データ型
idMso 必須 文字列型 (String)

説明

コントロールの識別子。編注:つまり名前で指定する。なおこの場合の名前は英語。コピーではなくCopyになる。

注釈

*****このメソッドは、あるコマンドに対するオブジェクト モデルがない場合に有用です。*****コントロールが組み込みのボタン、トグル ボタン、分割ボタンの場合に使えます。 IdMso が無効であれば E_InvalidArg を返し、コントロールが有効になっていない場合や表示されていない場合は E_Fail を返します。

 例えば仕事(タスク)を表示させた状態で次の命令は有効である。
objExpl.CommandBars.ExecuteMso ("NewTask") 新しいタスクを作る
objExpl.CommandBars.ExecuteMso ("Foward") タスクを転送する
objExpl.CommandBars.ExecuteMso ("Delete") (現在エクスプローラー上でカーソルがあっている)タスクを削除
objExpl.CommandBars.ExecuteMso ("MarkTaskComplete")
objExpl.CommandBars.ExecuteMso ("FlagCustom") FlagThisweekは有効ではないが、これは有効で、日付を設定するポップアップウィンドウが立ち上がる
名前を調べる方法はこちら(.ka-net)のExcelの場合と同様にQATに追加して真の名前を得るのが有効である。もっともFlagTodayのように効かないものもある。しかしFlag自体がVBAでコントロールできないので、やはり裏技としてのコマンドバーは死んでいないのだった。
 コマンドバーの裏技は今まではFindcontorol(ID).Executeが主流だったが、今後はExecuteMso(名前)が主流になるだろう。

参考リンク

《OutLook VBA》特定フォルダ内のメールを保存するマクロ - 不連続日記
Outlook VBA change Send using account when item load - StackOverFlow -
Outlook Object Model で既定のフォルダ以外のフォルダを取得する方法 - OUTLOOK研究所 -

Outlook 2003

全部ではないのかもしれないが、英語版のHelpが存在する
Outlook 2003 英語版 ここからDocsに飛ぶ
Docs
DocsのルートはOffice 2003

2003のヘルプはVisualBasicのオブジェクトリファレンスは独立せず、各章のなかでVBAについて取り扱われる。

Forms Help

Intergration API Reference

Technical Ariticles

Book Excerpts

Microsoft Office Outlook 2003 Inside Out

OUTLOOK 2007

Outlook 2007 を計画する

\Outlook 2007への移行

Outlook 2007 へのアップグレードを計画する

Office Outlook 2007 での FAX サポートを選択する

Office Outlook 2007 では、統合 FAX サポートは提供されていません。ただし、サードパーティの MAPI FAX プロバイダまたは Microsoft Windows FAX サポートを使用で来ます。
Outlook に統合された以前の FAX プログラムである WinFax は、Office Outlook 2007 によってアンインストールされます。ビューアが現在ユーザーのコンピュータに存在する場合は、アップグレード プロセスの途中アンインストールされます。

Office Outlook 2007 でフォームをサポートする

電子フォーム デザイナーを使用するカスタム ソリューションがある場合は、電子フォーム デザイナーは Office Outlook 2007 ではサポートされていないことに注意してください。

ファックスと電子フォームデザイナはOL2007で死亡した。
2007 Office Resource Kit

2007 Microsoft Office システムの展開に必要な主要管理ツールは製品に同梱されており、前のバージョンの Office のようにダウンロードとして提供されることはなくなりました。

Outlook 2007 へのアップグレードを計画する
Outlook 2007 での移行に関する考慮事項
いつ Outlook 2007 をインストールするかを決定する
へんなタイトルだが、下記のようにOUTLOOK2007がWord2007の機能を流用していることを考えると、オフィス2007をインストールしてからOL2007をインストールすべきである
Outlook 2007 のセキュリティと保護を計画する
Word 2007 なしで Outlook 2007 を展開する影響
このことからOUTLOOKがWordの機能を流用していると考えられる。
この他日本語で読める資料は次のとおり。なぜか2010は英語しかないが2007は日本語版がある。
マネージド アドインを使用した Outlook 2007 フォーム領域の構築
Outlook 2007 でのコード セキュリティの変更点
<開発者向け> Microsoft Office Outlook 2007 の新機能 (1/2)
<開発者向け> Microsoft Office Outlook 2007 の新機能 (2/2)

Outlook 2010

Office 2010 リソース キットのダウンロード可能なコンテンツ
2007 以前はなくなっているので入手はお早めに
Outlook 2010 VBA の基礎知識
Writing VBA code for Microsoft Outlook
Welcome to the Outlook 2010 Developer Reference ja-jpでも英語版のみ。

OutLookまとめの続き

OUTLOOK VBA 検索に関するリンクのまとめ
検索に関しては無駄に知識が多いのでMicrosoftの関連先を一覧にしてみました。

OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足 StoreオブジェクトはVBSで使用できる
OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足2 未完のSearchFolder
OUTLOOK VBA オブジェクトまとめ Store オブジェクト補足3 SearchFolderを別角度から

(付録)新機能

Outlookのオブジェクトの構成は主要なオブジェクトについては、メソッド、プロパティとも2007以降はあまり変更がない。さらにOUTLOOK2019VBAの新機能は存在しない。したがって、上記の記述は2007以降2019まで有効である。

Outlook 2010 以前はオフラインヘルプを参照することとされている。しかし、現在も技術文書等は残っている
Outlook 2010
Outlook ヘルプ - Microsoft サポート
初心者向けだが、意外な操作方法もある。
Outlook 2010 VBA の基礎知識
ビデオ: Outlook 2013 の新機能
[OUTLOOK 2013 SP1]
Outlook 2013 での変更点 - technet
Office 2013 Service Pack 1 (SP1) での Outlook の新機能 resouce kit版Outlook 2013 SP1 での変更点 - technet
PeopleView オブジェクト (Outlook)

現在の連絡先フォルダーに含まれるすべての連絡先のリスト、および選択された連絡先の詳細を表示します。
バージョン情報
追加バージョン: Outlook 2013

Office 2016 の VBA 向け新機能 -OutLook
PreviewPane オブジェクト (Outlook)

プレビュー ウィンドウのビューのみで表示することにより、"単一ウィンドウ モード" でコンテンツを表示します。
Microsoft Outlook PreviewPane オブジェクトを使用してこの自動サイズ変更機能を有効にすることで、応答性の高いデザインを利用しています。 これは、ユーザーがウィンドウウィンドウのサイズOutlook、1 つのウィンドウのみを表示する領域がある場合に発生します。 ユーザーがタブレットや電話などの小さなデバイスを持ち、デバイスが Outlook ウィンドウを回転して縦モードで表示する場合は、PreviewPane オブジェクトを使用します。 Office 2016 に導入されました。

Windows 版 Outlook 2019 の新機能
Outlook アドイン ドキュメント
VBAではなくJavaScripttouwo

Store.CreateUnifiedGroup

https://msdn.microsoft.com/ja-jp/library/office/ff867275.aspx
にも説明がない。ではgroupオブジェクトやUnitedGroupオブジェクトがあるかといえばそうでもない。
PaneにPreviewPaneが加わった

名前 説明
ExchangeDistributionList.GetUnifiedGroup メソッド (Outlook) IsUnifiedGroup の呼び出しによって、オブジェクトが統合グループであるかどうかを判別します。
ExchangeDistributionList.GetUnifiedGroupFromStore メソッド (Outlook) IsUnifiedGroup の呼び出しによって、オブジェクトが統合グループであるかどうかを判別し、GetUnifiedGroup メソッドと GetUnifiedGroupFromStore メソッドを使用して、このグループに関連付けられている Outlook.Folder オブジェクトを返します。
ExchangeDistributionList.IsUnifiedGroup メソッド (Outlook) オブジェクトが統合グループであるかどうかを判別します。
ExchangeUser.GetUnifiedGroup メソッド (Outlook) IsUnifiedGroup の呼び出しによって、オブジェクトが統合グループであるかどうかを判別します。
ExchangeUser.GetUnifiedGroupFromStore メソッド (Outlook) IsUnifiedGroup の呼び出しによって、オブジェクトが統合グループであるかどうかを判別します。
ExchangeUser.IsUnifiedGroup メソッド (Outlook) オブジェクトが統合グループであるかどうかを判別します。
Explorer.DisplayMode プロパティ (Outlook) 次のいずれの表示モードであるかを示します。標準、縦表示、または縦閲覧ウィンドウ。
Explorer.DisplayModeChange イベント (Outlook) ユーザーが表示モードを変更するアクションを実行したときに発生します。使用可能なモードは、通常、縦表示、および縦閲覧ウィンドウです。
Explorer.PreviewPane プロパティ (Outlook) PreviewPane オブジェクトは、プレビュー ウィンドウのビューのみで表示することにより、"単一ウィンドウ モード" でコンテンツを表示します。
ExplorerEvents_10.DisplayModeChange メソッド (Outlook) ユーザーが表示モードを変更するアクションを実行したときに発生します。使用可能なモードは、通常、縦表示、および縦閲覧ウィンドウです。
OlDisplayMode 列挙 (Outlook) 表示モードの性質を記述します。使用可能なモードは、通常、縦表示、および縦閲覧ウィンドウです。
OlUnifiedGroupFolderType 列挙 (Outlook) 統合グループを取得するフォルダーを指定します。グループにはメールと予定表の両方のフォルダーがあるため、olGroupMailFolder または olGroupCalendarFolder のいずれかを指定できます。
OlUnifiedGroupType 列挙 (Outlook) CreateUnifiedGroup メソッドのグループの種類をパブリックまたはプライベートとして指定します。
PreviewPane メンバー (Outlook) プレビュー ウィンドウのビューのみで表示することにより、"単一ウィンドウ モード" でコンテンツを表示します。
PreviewPane オブジェクト (Outlook) PreviewPane オブジェクトのコレクションが含まれます。
PreviewPane.Application プロパティ (Outlook) PreviewPane オブジェクトの親のアプリケーション (Outlook) を表す Application オブジェクトを返します。値の取得のみ可能です。
PreviewPane.Class プロパティ (Outlook) PreviewPane オブジェクトのクラスを示す OlObjectClass 列挙の定数を返します。値の取得のみ可能です。
PreviewPane.Parent プロパティ (Outlook) PreviewPane オブジェクトの親プロパティを返します。値の取得のみ可能です。
PreviewPane.Session プロパティ (Outlook) 現在のセッションの NameSpace を返します。値の取得のみ可能です。
PreviewPane.WordEditor プロパティ (Outlook) 表示されているメッセージの Word ドキュメント オブジェクト モデルを取得します。値の取得のみ可能です。
Store.CreateUnifiedGroup メソッド (Outlook) 統合グループの作成を有効にします。
Store.DeleteUnifiedGroup メソッド (Outlook) 統合グループの削除を有効にします。

補足 OUTLOOK VBAは2002のころは不具合すらあったこととプロジェクトの移行方法

[OL2002] Outlook VBA プロジェクトの管理と配布

  • Outlook は、ほかの Microsoft Office プログラムとは異なり、Project1というVBAプロジェクトのみ使用可能で、プログラムには常にこのプロジェクトが関連付けられている。Visual Basic Editor で別のプロジェクトを追加することはできない
  • Project1 は、ハードディスクの以下のフォルダに VbaProject.OTM という名前で格納される。<ドライブ>:\Windows\Application Data\Microsoft\Outlook
  • Outlook では、OTM ファイルを直接管理する手段を提供していない。Outlook の VBA コードは、展開または配布するためのものではなく、あくまで個人的なマクロ開発環境として設計されている。
  • 新しい VBA プロジェクトを開始する場合、理論的には既存のモジュールおよびフォームをすべてエクスポートするという方法も考えられるが、これは通常現実的な手段ではない。この方法の代わりに、次の手順を実行する。(編注:この方法は現在でもプロジェクトを移動させるときは有効と考えられる。)

1.Outlook が起動している場合は、Outlook を終了。
2.前述の方法で、VbaProject.OTM ファイルを検索。
3.このファイルの名前を、分かりやすい別の名前 (VbaProject-testing1.OTM など) に変更。

  1. Outlook を起動。VBE起動>新しいVbaProject.OTMが再作成。
    プロジェクトを切り替えたい場合は、前述の方法に手順を 1 つ追加。
    3-1.使用するファイルの名前を VbaProject.OTM に戻す。

VBA プロジェクトをコンピュータ間で移動する場合は、まずそれぞれのコンピュータで VbaProject.OTM ファイルが格納されている場所を確認した後、コンピュータ間で OTM ファイルをコピーして、正しいフォルダに配置する。Outlook を再起動すると、VbaProject.OTM ファイルが認識され、使用される。

重要 : 上記の手順は、マイクロソフトでは、この方法によるソリューションの展開をサポートしていない。この方法には既知の問題もあり、Outlook はこの機能をサポートするように設計されていない。
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
290780 OL2002: Code Does Not Work After You Distribute a VBA Project (リンク切れ)
文書番号:290779 - 最終更新日: 2003/02/16 - リビジョン: 1

補足2 OUTLOOK 2007の開発者タブの表示方法

Visual Basic Editor の使用に関するヘルプを見つける

1.[開発] タブの [Visual Basic] をクリックします。
[開発] タブが表示されません。
a.[ツール] メニューの [オプション] をクリックします。
b.[その他] タブで [詳細オプション] をクリックし、[[開発] タブをリボンに表示する] チェック ボックスをオンにします。
2.[ヘルプ] メニューの [Microsoft Visual Basic ヘルプ] をクリックします。
3.[検索語句を入力してください] ボックスに、ヘルプを必要とするメソッド、プロパティ、関数、ステートメント、オブジェクトを入力します。または、クエリを入力します。

補足その3

キーボードショートカット- OUTLOOK
VBAと直接関係ないが特にジャーナルなどのフォルダは見えなくなっているので、Ctrl+6が重要

  • [予定表] ビューに切り替える Ctrl + 2
  • [連絡先] ビューに切り替える Ctrl + 3
  • [タスク] ビューに切り替える Ctrl + 4
  • [メモ] に切り替える Ctrl + 5
  • [フォルダー] ウィンドウの [フォルダー] 一覧に切り替える Ctrl + 6
  • そしてもちろんALT+F8とALT+F11

補足その4 VBEの設定とショートカット

お勧めの初期設定 Excelでお仕事魚拓
デフォルトのショートカットキー
カスタマイズ- VBEのコードを簡単にコメントブロックする
リスト
ExcelとなっているがOUTLOOKでも使える

補足その5 OUTLOOK View Contorol

OUTLOOK View Contorol

ViewCtlオブジェクトは、Outlook では、ホストされている HTML フォルダーのホーム ページ、または Outlook のアドインによって表示されるカスタム Outlook フォームで、Outlook 内でのみ作動する。Outlook プロセス外ではHTMLページはブラウザーが起動するなど、Outlookの外では使用できない。
コントロールのプロパティを設定して、表示されるビューとフォルダーをカスタマイズできます。
たとえば、複数のビュー コントロールを 1 つの HTML ページに配置すると、ユーザーは複数のフォルダーの内容を 1 つのウィンドウに表示できる。これは、複数のユーザーの予定表情報を同時に表示させることができる。(Outlook Todayのカスタマイズ)

ViewCtlオブジェクトを使用して、コード内で、ビュー コントロールのタイプ ライブラリへの参照を設定する必要がある。
ビュー コントロールのタイプ ライブラリへの参照を設定するには

  1. Visual Basic for Applications のコード エディターで、[ツール] メニューの [参照設定] をクリック
  2. Outlook ビュー コントロールのチェック ボックスを選択

補足その6 CDOとNetMeetingの変遷

 CDOがWindows2000とともに出てかなり有名になった。
CDO Library オブジェクトの設計 では、MAPI関数を備えたMAPIの簡略版として位置づけられている。
 メールを送信するときに、OUTLOOKを使用せずCDOを使う方法があった。
 しかしOUTLOOKのVBAが安定してきているので、OUTLOOKがあるのにCDOを使う機会は減少している。
 CDOの概要はまだ日本語で読める
MSDN ライブラリ >Windows 開発 > Windows 2000 メッセージおよびコラボレーション
 こちらはチューニングが必要であるため、かつて多くの天才たちがその才能を競った。
 送信をOUTLOOKによるのはとても面倒であり、また最初にMSの公式が述べているようにOUTLOOKでVBAを使うことが一般的でなかったためである。またExcelでお仕事 VBA 応用 CDOでメール送信によるとCDOは当初なぜか受信ができなかったのにたいしてVBS+BASP21だと送受信に対応できたので、そちらが優位であり、普及しなかった。2007年までBASP21は更新されており、みなEXCELやAccessでメールの送受信をするときはBASP21を使用していた。
Windows標準機能とWSHを使ってメールを送信する- atmarkit 2004/05/22
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)

 VBAでメール送信する方法はいろいろありますが、ここでは、CDO(Microsoft Collaboration Data Objects)を使っての送信方法を解説します。
 メール送信は、メーラーを使う方法や、フリーのDLLを使う方法等もありますが、
まずは、Windowsに標準であるCDOを使ってみましょう。

Cdosys.dll ライブラリを使用して、Visual C# を使用してファイルが添付された電子メール メッセージを送信する方法
MSが提唱しているCDOを使ってメールの送信を行なってみます。- Excelで
ただし2010からCDO1.21はサポートされていない。Outlook 2010 Developer ReferenceWhat's NewDeveloper Issues When Upgrading Solutions to Outlook 2010 (Outlook)

補足その7 Microsoft Shcedule+

タスクのフォームの「詳細」を見るとSchedule+の優先度という欄が存在している。このスケジュールプラスは仕事、連絡先、予定表とOUTLOOKのようなアプリ。マイクロソフトは以下の移行に関する記事でこの辺が違う!と言っているが、普通は使わない機能ばかりなので、移行するメリットはあまりなかった。今では知る人も少ないが、実はまだOUTLOOK2016にもその痕跡が残っているのである。
image.png

Microsoft Schedule Plus英語版Wikipediaから
 Microsoft Schedule +は、 マイクロソフトが開発したスケジュールソフト。 開発中止後、その機能のほとんどはOutlook 97に組み込まれました。 もともとはMicrosoft Mailの仲間として意図されていましたが、後でExchange Server 5.0 、Microsoft Office 95 、Exchange ClientおよびWindows Messagingに同梱されました。Outlook for Windows 3.1とMacintoshバージョンの9.0以前の「Outlook予定表」は、実際にはSchedule +の新しいバージョンでした。 開発中止後は、 Microsoft OfficeのすべてのバージョンでMicrosoft Office 2003まで使用できましたが、Schedule + 1.xからの変換をサポートするだけです。
 Schedule +の最初のバージョンは、 Windows 3.1と従来のMac OS用に1992年にリリースされました。 バージョン2〜6はスキップされ、次のバージョンは1995年にWindows 95とMac OS用にリリースされたバージョン7になりました。 バージョン7.5はMicrosoft Office 97以降に含まれていました 。
Outlook 2002 へのアップグレード>Schedule+ からのアップグレード

Office XP リソース キット/メッセージング/Outlook 2002 へのアップグレード
 Outlook 2002 にアップグレードしてスケジュール機能を使用すれば、Microsoft Schedule+ アプリケーションの基本機能と同様の機能を引き続き利用できます。さらに、改良された機能も活用できます。
 Outlook 2002 には、Schedule+ 7.x と Schedule+ 1.0 のすべての機能が含まれています。 その中には、予定、イベント、連絡先、および仕事が含まれます。加えて、Outlook には Schedule+ では利用できない次の機能も含まれています。

  • 履歴およびメモの各アイテムと統合された電子メール機能
  • 予定表、連絡先、および仕事の情報の追加ビュー
  • 詳細なカスタム ビュー機能
  • 仕事の依頼

 ユーザー インターフェイスやその他の機能に違いはありますが、Outlook でも Schedule+ と同じ方法で予定表、連絡先、および仕事情報を処理できます。Schedule+ ユーザーと空き時間情報を自由にやり取りすることもできます (Outlook 2002 と Schedule+ 1.0 で情報を共有する場合、Outlook で Schedule+ 1.0 データを読んで変換するために Schedule+ 7.x が使用されます)。しかし、Outlook 2002 の電子メールなどの機能を使用しながら、Schedule+ を通常使用する予定表ツールとして継続して使用することはできません。
注 Outlook は、Schedule+ 7.x アプリケーションを使用して、Schedule+ 1.0 の CAL ファイルをインポートします。コンピュータに Schedule+ 7.x がインストールされていない場合、Schedule+ 1.0 の CAL ファイルをインポートするためのオプションは表示されません。(中略)
注 Outlook には、Schedule+ 7.x の Covey Seven Habits ツールは含まれていません。さらに、オブジェクト モデルが大きく異なっているので、Outlook では Schedule+ 7.x のオートメーション (旧称 OLE オートメーション) のインターフェイスを認識できません。

補足その8

Outlook でやってはいけない 10 のこと 2008/6/1 OutlookLab
OFT と MSG (および下書き) の違い 2007/6/16 OutlookLab
Outlookのメッセージファイル(.msg)とテンプレートファイル(.oft)との違い 2017年3月10日 Outlook Japan Team Blog

弊社では msg ファイルのテンプレートとしての使用は推奨しておりません。

補足その9 ActionsコレクションとActionとCommandbar

以下の
myItem.ActionsがActionコレクション。Outlookのアイテム(例:mailitem)で実行できるすべての特殊なアクション (返信ボタンをおして返信するなど) を表す。actions("name").execute でボタンを押すような動作(”返信”)ボタンなどを表すことができる。
基本的にActionsとはあるオブジェクトのメソッドの集合であるが、ボタンを押す動作をフォローしているため、コマンドバーの代理にもなりうるということになる。まだ実際につかった例は見たことがないが。ただしすでにあるようにカスタムアクションはエラーになる。

myItem = CreateItem(olMailItem) 
Set myReply = myItem.Actions("Reply").Execute

補足その10 ics file icalender format file からわかること

icsファイルは今後このまとめ以上に長くなるかもしれないので、独立している。
https://qiita.com/Q11Q/items/33d7361a337f2a23845d

ics ファイルからTask Mail Contact Appointomentがつくることができる

つまりicalenderの項目の特定の項目もしくはコンポーネントの集合だといえる。

outlook はGoogle Calenderより雑なicsファイルが読めるらしい

Outllokはエラーを記録しながらも読み込むが、Googleは一切読み込めない。

Outlookは定期的な予定が他より雑で細かい設定ができない

RDATEがなくRRULEも全部読めない。これはMicrosoftが言っている。
また定期的な予定で除外日を設定できない。

補足その11 Microsoft Outlook が既に実行中であることを前提としているため、終了はさせないほうが良い

https://gallery.technet.microsoft.com/office/cd88e4e2-e45f-4d43-b19e-9ace3486b295
Microsoft Outlook について記述するときに、必ず次のような軽率な注記を記載することがあります。
「このスクリプトは、Microsoft Outlook が既に実行中であることを前提としています。」
注 : Outlook が実行中であるかどうかをわざわざ確認するのはなぜだと思いますか。これは、主に Outlook にログオンする必要があるためです。Outlook が既に実行中の場合は、このアプリケーションにバインドするために Outlook.Application オブジェクトのインスタンスを作成するだけで済みます。しかし、Outlook が実行中でなければ、NameSpace. Logon メソッドを呼び出してログオンしないとスクリプトで処理を行えません。
当然、「Outlook が既に実行中の場合でも、必ずしも Outlook にログオンする必要はないのでは」という疑問が生じるでしょう。そのとおり、必ずしもログオンする必要はありません

企業などでOutlookを使用する場合、複数のプロファイルを使い分け、起動時にプロファイルの切り替えを設定している場合がある。本記事では複数のメールアドレスを一つのプロファイルで使い分けている(Store)がプロファイルを分ける方法もある。このとき保存データもプロファイルごとに作成される。
そのようなとき、ログオンするときにプロファイルが定まっていない場合、あるいはパスワードが必要な場合は場合分けが必要になる。
ということを書くと混乱するので、起動済みを前提としている。また、ここから一般的にOutlookのコードは、原則としてログオフや電源を着る前の動作でもない限り、ScriptにApplication.Quitを書いてはいけないということになる。次にまたログオンする必要が発生してしまう。

Const olFolderInbox = 6 
 
strComputer = "." 
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery _ 
    ("Select * From Win32_Process Where Name = 'outlook.exe'") 
 
If colItems.Count = 0 Then
'Outlookが起動していなとき
    Set objOutlook = CreateObject("Outlook.Application") 
    Set objNamespace = objOutlook.GetNamespace("MAPI") 
    objNamespace.Logon "Default Outlook Profile",, False, True 'Outlookが起動していると不要。ログオン動作を行っている。また、defaultのプロファイルを使い、ShowDialogをFalseにしているのもポイント
    Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox) 
    objFolder.Display 'Outlookが起動していると不要
    Set colItems = objFolder.Items 
    Wscript.Echo colItems.Count 
   'objOutlook.Quit 'これは原則として書かないこと

Else 
    Set objOutlook = CreateObject("Outlook.Application") 
    Set objNamespace = objOutlook.GetNamespace("MAPI") 
    Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox) 
    Set colItems = objFolder.Items 
    Wscript.Echo colItems.Count
   'objOutlook.Quit 'これは原則として書かないこと

End If
142
183
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
142
183

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?