特定の分類項目が設定されているアイテムを CSV に従って移動するマクロ 階層対応版

特定の分類項目が設定されているアイテムを CSV に従って移動するマクロのコメントにて以下のご要望をいただきました。


振り分け先を、受信トレイのサブフォルダーでなく、受信トレイや送信済みアイテムと同じ階層の別名フォルダーにすることは可能でしょうか。また、それら別名フォルダーをさらに階層化して

受信トレイ
振り分け先1
振り分け先1(サブ1)
振り分け先1(サブ2)
振り分け先2

お伺いしてばかりで申し訳ございません。


移動先のフォルダーをルートから指定し、¥ でパスを区切って指定できるように以前のマクロを修正しました。
例えば、「受信トレイ」の下の「フォルダーA」に移動する場合は「受信トレイ¥フォルダーA」、受信トレイと同じ階層の「振り分け先1」に移動する場合は「振り分け先1」、その下の「サブ1」に移動する場合は「振り分け先1¥サブ1」と CSV のフォルダー名に指定します。

'

' 特定の分類項目が設定されているアイテムを CSV に従って移動するマクロ
Public Sub MoveItemsBySenderInCSV2()
     ' 移動対象となる分類項目の設定
     Const MOVE_MARK = "処理完了"
     Dim dicRules As Scripting.Dictionary
     Dim fldInbox As Folder
     Dim i As Integer
     Dim objItem As Object
     Dim strAddr As String
     Dim strPath As String
     Dim fldDest As Folder
     ' CSV ファイルの内容を Dictionary に読み込み
     Set dicRules = CreateObject("Scripting.Dictionary")
     ImportRulesFromCSV dicRules
     '
     Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
     ' 受信トレイのアイテムを最後から確認
     For i = fldInbox.Items.Count To 1 Step -1
         Set objItem = fldInbox.Items(i)
         ' 処理対象となる分類項目が設定されていたら
         If InStr(objItem.Categories, MOVE_MARK) > 0 Then
             ' 差出人のアドレスを取得
             strAddr = objItem.SenderEmailAddress
             ' Dictionary にアドレスが設定されていたら
             If dicRules.Exists(strAddr) Then
                 ' アイテムを指定されたパスに移動
                 strPath = dicRules(strAddr)
                 MoveItemsToSubFolder objItem, strPath
             End If
         End If
     Next
End Sub
'
' アイテムを指定されたパスに移動するマクロ
Public Sub MoveItemsToSubFolder(objItem As Object, strPath As String)
     Dim fldRoot As Folder
     Dim fldDest As Folder
     ' ルートフォルダーを取得
     Set fldRoot = Session.GetDefaultFolder(olFolderInbox).Parent
     ' パスが 1 階層のみならルート直下のフォルダーに移動
     If InStr(strPath, "\") = 0 Then
         objItem.Move fldRoot.Folders(strPath)
     Else
         Dim arrPath As Variant
         Dim strFolder As Variant
         ' パスを \ で分割
         arrPath = Split(strPath, "\")
         Set fldDest = fldRoot
         ' 分割したパスごとにフォルダーをたどる
         For Each strFolder In arrPath
             Set fldDest = fldDest.Folders(strFolder)
         Next
         ' たどり着いたフォルダーに移動
         objItem.Move fldDest
     End If
End Sub
'
' CSV ファイルの内容を Dictionary オブジェクトに読み込むマクロ
Private Sub ImportRulesFromCSV(dicRules As Object)
     ' 移動ルールが格納されている CSV ファイルのファイル名
     Const CSV_FILE = "c:\temp\moverules.csv"
     Dim strFolder As String
     Dim strAddrs As String
     Dim arrAddrs As Variant
     Dim strAddr As Variant
     ' CSV ファイルを読み込みのため開く
     Open CSV_FILE For Input As #1
     ' 1 行目はヘッダーのためスキップ
     Line Input #1, strFolder
     ' ファイルの終わりまで繰り返す
     While Not EOF(1)
         ' CSV からフォルダーとアドレスを読み込み
         Input #1, strFolder, strAddrs
         ' アドレスに ; が含まれていなければ単一のアドレス
         If InStr(strAddrs, ";") = 0 Then
             ' アドレスが Dictionary になければ
             If Not dicRules.Exists(strAddrs) Then
                 ' アドレスをキーとしてフォルダー名を Dictionary に追加
                 dicRules.Add strAddrs, strFolder
             End If
         Else
             ' ; を区切りとして文字列を分割
             arrAddrs = Split(strAddrs, ";")
             ' 分割したアドレスごとに処理
             For Each strAddr In arrAddrs
                 ' アドレスが Dictionary になければ
                 If Not dicRules.Exists(strAddr) Then
                     ' アドレスをキーとしてフォルダー名を Dictionary に追加
                     dicRules.Add strAddr, strFolder
                 End If
             Next
         End If
     Wend
     Close #1
End Sub

マクロの登録方法やメニューへの追加について

広告

差出人をもとにフォルダーに振り分けるルールを CSV ファイルにエクスポートするマクロ

先週作成したマクロについては、以下のような追加のご要望もありました。


すみません。欲を言えば、設定済みルールをExcelかCSVに書き出し(.rwzという特殊な仕様でなく)、またExcelやCSVで作成したリストからルールを読み込むようなことが出来れば素晴らしいのですが。VBA追加分だけでも、Excel等の外部リストから読み込んで仕訳けが出来れば大変に助かります。よろしくお願いいたします。


自動仕分けのルールについては Outlook Object モデルでアクセスできないものや、データ化が難しいものもあり、丸ごとエクスポートということは困難です。
しかし、特定の条件とアクションのみに限定するということであればエクスポートできるものもあります。

「特定の人から受信したメッセージをフォルダーに移動する」というルールを、先週のマクロで読み込み可能な形式の CSV ファイルにエクスポートするマクロは以下のようになります。

'

' 特定の人から受信したメッセージをフォルダーに移動するルールのみ CSV にエクスポートするマクロ
Public Sub ExportMoveBySenderRules()
     On Error Resume Next
     ' 移動ルールをエクスポートする CSV ファイルのファイル名
     Const CSV_FILE = "c:\temp\moverules.csv"
     Dim colRules As Rules
     Dim oneRule As Rule
     Dim oneRec As Recipient
     Dim strAddr As String
     Dim strFolder As String
     ' エクスポートする CSV ファイルを書き込み用に開く
     Open CSV_FILE For Output As #1
     ' 1 行目にヘッダーを書き込む
     Print #1, "フォルダー名,アドレス"
     ' ルール一覧を取得
     Set colRules = Session.DefaultStore.GetRules
     ' ルールを一つずつ処理
     For Each oneRule In colRules
         strFolder = ""
         strAddr = ""
         ' フォルダー移動のアクションかの確認
         With oneRule.Actions.MoveToFolder
             ' フォルダー移動のアクションが設定されていたら
             If Not .Folder Is Nothing Then
                 ' フォルダー名を取得
                 strFolder = .Folder.Name
             End If
         End With
         ' 差出人を条件とするかの確認
         With oneRule.Conditions.From
             ' 差出人が条件に設定されていたら
             If .Recipients.Count > 0 Then
                 ' 受信者ごとに処理
                 For Each oneRec In .Recipients
                     ' 受信者のアドレスを ; で区切って連結
                     strAddr = strAddr & oneRec.AddressEntry.Address & ";"
                 Next
                 ' 最後の余計な ; を削除
                 strAddr = Left(strAddr, Len(strAddr) - 1)
             End If
         End With
         ' 移動先フォルダーと差出人の両方がルールにあったら
         If strFolder <> "" And strAddr <> "" Then
             ' CSV ファイルに書き込み
             Print #1, strFolder; ","; strAddr
         End If
     Next
     Close #1
End Sub

マクロの登録方法やメニューへの追加について

特定の分類項目が設定されているアイテムを CSV に従って移動するマクロ

コメントにて以下のご要望をいただきました。


「特定の分類項目にマークしたInboxメールのメールアドレスによるフォルダーへの仕分け」

種々VBA情報のご提供本当にありがとうございます。題記につきお伺いします。

(初心者で、自前で作成を試みていますがつまずいてます。)

現状、この作業はOutlook標準の仕分けルールを使って作業していますが、仕分け

に登録できる項目に容量制限があり、追加登録が出来なくなりました。

VBAコードをお教えいただけますと大変幸甚です。

ありがとうございます。ご理解のとおり、「差出人のメールアドレスによるフォルダーの仕分け」が希望です。ただし、仕分けるのは分類項目で「処理完了」のフラグを立てたもののみとし、そうでない場合はルールがヒットしても受信トレイに残すことを希望します

すでにOutlookの仕訳ルールで400件以上のルールを設定しましたが、それらはそのまま残し、登録しきれなかった追加仕訳分のみサブルール的にVBA処理を行うことを希望します。

(本当はOutlookで、仕訳も含む記録領域を増やすことが好ましい方向であろうことは理解します。)

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


以下のようなフォーマットの CSV ファイルを読み込み、特定の分類項目が設定されているメールについて CSV ファイルの内容に基づいて移動するマクロを作りました。

フォルダー名,アドレス
Folder1,user1@example.com
Folder2,user2@example.com;user3@example.com

フォルダーは受信トレイのサブフォルダーとして存在するものと仮定しています。
また、複数の差出人を同じフォルダーに振り分ける場合は、; で区切って指定することでルールを 1 行にまとめられるようにしました。

このマクロのポイントは Dictionary オブジェクトを使ったことにあります。
Dictionary オブジェクトは VBA の組み込み機能ですが、これを使うと任意の文字列または数字のキーとペアとなるアイテムのデータが扱えるようになり、メールアドレスごとの振り分け先のフォルダーの検索というような処理が非常に簡単になります。

マクロは以下の通りです。

' 特定の分類項目が設定されているアイテムを CSV に従って移動するマクロ
Public Sub MoveItemsBySenderInCSV()
     ' 移動対象となる分類項目の設定
     Const MOVE_MARK = "処理完了"
     Dim dicRules As Object
     Dim fldInbox As Folder
     Dim i As Integer
     Dim objItem As Object
     Dim strAddr As String
     Dim strFolder As String
     Dim fldDest As Folder
     ' CSV ファイルの内容を Dictionary に読み込み
     Set dicRules = CreateObject("Scripting.Dictionary")
     ImportRulesFromCSV dicRules
     ' 受信トレイを取得
     Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
     ' 受信トレイのアイテムを最後から確認
     For i = fldInbox.Items.Count To 1 Step -1
         Set objItem = fldInbox.Items(i)
         ' 処理対象となる分類項目が設定されていたら
         If InStr(objItem.Categories, MOVE_MARK) > 0 Then
             ' 差出人のアドレスを取得
             strAddr = objItem.SenderEmailAddress
             ' Dictionary にアドレスが設定されていたら
             If dicRules.Exists(strAddr) Then
                 ' Dictionary からフォルダー名を取得
                 strFolder = dicRules(strAddr)
                 ' 受信トレイのサブフォルダーを取得
                 Set fldDest = fldInbox.Folders(strFolder)
                 ' アイテムを指定されたフォルダーに移動
                 objItem.Move fldDest
             End If
         End If
     Next
End Sub
'
' CSV ファイルの内容を Dictionary オブジェクトに読み込むマクロ
Private Sub ImportRulesFromCSV(dicRules As Object)
     ' 移動ルールが格納されている CSV ファイルのファイル名
     Const CSV_FILE = "c:\temp\moverules.csv"
     Dim strFolder As String
     Dim strAddrs As String
     Dim arrAddrs As Variant
     Dim strAddr As Variant
     ' CSV ファイルを読み込みのため開く
     Open CSV_FILE For Input As #1
     ' 1 行目はヘッダーのためスキップ
     Line Input #1, strFolder
     ' ファイルの終わりまで繰り返す
     While Not EOF(1)
         ' CSV からフォルダーとアドレスを読み込み
         Input #1, strFolder, strAddrs
         ' アドレスに ; が含まれていなければ単一のアドレス
         If InStr(strAddrs, ";") = 0 Then
             ' アドレスが Dictionary になければ
             If Not dicRules.Exists(strAddrs) Then
                 ' アドレスをキーとしてフォルダー名を Dictionary に追加
                 dicRules.Add strAddrs, strFolder
             End If
         Else
             ' ; を区切りとして文字列を分割
             arrAddrs = Split(strAddrs, ";")
             ' 分割したアドレスごとに処理
             For Each strAddr In arrAddrs
                 ' アドレスが Dictionary になければ
                 If Not dicRules.Exists(strAddr) Then
                     ' アドレスをキーとしてフォルダー名を Dictionary に追加
                     dicRules.Add strAddr, strFolder
                 End If
             Next
         End If
     Wend
     Close #1
End Sub

マクロの登録方法やメニューへの追加について

全く同じバージョンの Outlook で特定の機能が使えなかったり、表示が異なったりする現象について

Microsoft 365 Apps や製品版の (ボリューム ライセンス版でない) Office 2016/2019/2021 では、”バージョン 2210″ というように表記されるバージョンがあります。
このバージョンは毎月 (チャネルによっては半年に一度) 更新されるもので、バージョン アップすると機能が追加されることがあります。
ただし、同じバージョンにバージョンアップしても、PC によって特定の機能が使えなかったり、ユーザー インターフェイスの表示が異なる場合があり、その原因としては以下のようなものがあります。

  • ライセンスの違い
  • 接続先の違い
  • Microsoft Edge WebView2 のインストール状況の違い
  • Enhanced Configuration Service の影響
  • レジストリ設定によるもの

それぞれについて以下で詳しく説明します。

ライセンスの違い

Outlook を Exchange サーバーに接続して使用している場合、Office や Exchange のライセンスにより使用できない機能があります。
例えば、以下のような機能は Office の Home & Business や Standard といったライセンスでは使用できません。

  • インプレース アーカイブ
  • アイテム保持ポリシー
  • Information Rights Management (IRM) の適用
  • サイト メールボックス
  • DLP ポリシーのヒント

上記のような機能が使用できない場合は、Office をアクティベーションした際のライセンスを確認してみてください。

参考リンク: Outlook の Exchange 機能に関するライセンス要件 (microsoft.com)

接続先の違い

Outlook の新機能については Exchange Online や Outlook.com に接続した場合のみ使用可能なものがあります。
そのため、Exchange Online とオンプレミス Exchange のハイブリッド環境では、特定の機能についてオンプレミス Exchange 上のメールボックスに接続していると使用できず、Exchange Online 上のメールボックスに接続していると使用できるという違いが生じます。
Exchange Online でしか使用できない機能は多数あるので、その機能を使用したいということになるとメールボックスをオンプレミスから Exchange Online に移動する必要があります。

Microsoft Edge WebView2 のインストール状況の違い

Microsoft Edge WebView2 (以下、WebView2) とは、Microsoft Edge の HTML レンダリング エンジンを Outlook のようなアプリケーションから利用するための機能です。
Outlook の Web アドインや Outlook on the Web の UI を使用する機能 (OPX と呼びます) については WebView2 がなければ動作しないものがあるため、WebView2 がインストールされていない PC では表示が変わったり、機能自体が使えなかったりする場合があります。

なお、バージョン 2101 以降の Office がインストールされている場合は自動的に WebView2 がインストールされるようになっています。

参考リンク: Microsoft Edge WebView2 とMicrosoft 365 Apps – Deploy Office | Microsoft Learn

Enhanced Configuration Service の影響

Enhanced Configuration Service (以下、ECS) はOffice の重要なサービス – Deploy Office | Microsoft Learnで以下の様に定義されています。

Enhanced Configuration Serice (ECS)

ECS により、ユーザーが Office を再展開する必要なく、Office のインストールを Microsoft が再構成できるようになります。 機能や更新プログラムを段階的にロールアウトしながら、収集される診断データからロールアウトの影響を監視するために使用されます。 また、機能や更新プログラムによるセキュリティやパフォーマンスの問題を軽減するためにも使用されます。 さらに、ECS では、適切なイベントが確実に収集されるようにする、診断データに関連する構成の変更をサポートします。

この機能により、特定の修正や機能追加によって重大な障害が発生したような場合に、ユーザーが Office の更新をアンインストールなどを行わずに修正などの機能を無効化することができるというものです。
また、ECS は新機能の展開の際に少しずつ新機能が使用できる PC を増やすというような使われ方もするので、新しいバージョンをインストールした直後に特定の PC でのみ新機能が使用できるというような差異が生じる場合があります。
この機能については詳細が公開されていないため、ECS でどの機能が無効化されているかや、有効化までにどのくらいかかるかなどを確認することはできません。

レジストリ設定によるもの

Outlook の機能にはレジストリ設定で有効・無効が制御できるものが多数あります。
そのため、何らかのトラブル対応でレジストリ設定で特定の機能が無効化され、その後新しくインストールした PC ではその対応がされていないというような場合、同じバージョンでも異なる表示や動作になる場合があります。

Outlook for iOS/Android が社内ネットワークで新着メールの通知が受けられない

Outlook for iOS/Android を社内の WiFi ネットワークに接続している状況で、新着メールの通知が受け取れない場合があります。
これは、モバイル機器独自の通知の要件に依存して発生しています。

一般に Windows 用のアプリなどでは、アプリの起動時にサーバーと通知用のセッションを確立し、そのセッションによりサーバーからメールの着信などの通知を受け取るような動作となっています。
しかし、モバイル機器でこのような実装を行うと以下のような問題が生じます。

・ 常にアプリを起動し続ける必要があり、バッテリーが消費される

・ 移動中に IP アドレスが変わると、セッションを確立しなおす必要がある

このような問題に対処するため、iOS では Apple プッシュ通知サービス (APNs)、Android では Firebase Cloud Messaging (FCM) というサービスからモバイル機器に通知を行うための仕組みが用意されています。
アプリ開発者がこの仕組みを使用してメールの着信などを通知することで、アプリが起動していなくてもメールの着信が通知されるような動作となり、Outlook for iOS/Android もこの仕組みを使用しています。

そして、これらの通知サービスは、通常の Web アクセスとは異なる TCP ポートを使用するため、社内ネットワークで適切に対処が行われていない場合に Outlook for iOS/Android で新着メールの通知が行われないという現象が発生します。

具体的には以下のようなポートがブロックされていると通知が行われません。

APNs: 5223 および 2197、443
FCM: 5228-5230、443

そのため、もし Outlook for iOS/Android で特定のネットワークでのみ新着メールの通知が来ないというような現象が発生した場合は、そのネットワークの管理者に上記のポートがブロックされていないか確認いただいてください。

参考資料:

Apple 製のデバイスで Apple プッシュ通知が届かない場合 – Apple サポート (日本)

FCMメッセージについて  |  Firebase Cloud Messaging (google.com)

Outlook の [プログラムによるアクセスのセキュリティ] に表示される [ウイルス対策ソフトウェアの状態] について

Outlook の [ファイル]-[オプション] の [トラスト センター] (バージョンによっては [セキュリティ センター]) の [プログラムによるアクセス] には [ウイルス対策ソフトウェアの状態] という項目があります。
この項目が [有効] となっていない場合、既定ではプログラムなどから Outlook オブジェクト モデルを使用してメールの送信やアドレス データの取得を行おうとすると警告が表示されます。
ところが、ウイルス対策ソフトウェアをインストールし、最新の状態にしているはずなのに、この値が [有効] とならないという現象が発生する場合があります。
これは、Outlook が [ウイルス対策ソフトウェアの状態] の検出を Windows セキュリティ センター (以下、WSC) に依存しているために発生しています。

WSC は Windows Vista 以降に搭載されている、Windows のウイルス対策ソフトウェアなどを統合的に管理する機能です。
サードパーティ製のウイルス対策ソフトウェアでも、WSC に対応している製品であれば、コントロール パネルでウイルス対策ソフトウェアのステータスが確認できるというものです。

言い換えると、WSC に対応していないウイルス対策ソフトウェア製品がインストールされている場合は、Outlook ではそのソフトウェアが認識できず、ウイルス対策ソフトウェアの状態は有効とはなりません。

また、Windows Server 2022 のようなサーバー OS では、WSC の状態を取得する API がサポートされていないため、このようなサーバー OS 上でもウイルス対策ソフトウェアの状態は有効とはなりません。
注意しなければいけない点として、Windows 10 Enterprise マルチ セッションという OS については、アプリケーションに対してサーバー OS として認識されるため、Outlook でも他のサーバー OS と同様にウイルス対策ソフトウェアの状態は有効とはならないというものがあります。

さらに、WSC に対応しているウイルス対策ソフトウェアがインストールされていても、そのソフトウェアが最新の状態ではない場合には有効となりません。
「最新の状態」 であるかどうかはウイルス対策ソフトウェア自身が判断して WSC に通知するものであるため、どのような状態なら最新なのかという点についてはウイルス対策ソフトウェアにより異なります。

なお、ウイルス対策ソフトウェアの状態は、Outlook の起動中は常に監視されており、状態に変更があった場合は直ちに Outlook に反映される動作となっています。
これは、Outlook が定期的に状態をチェックするというものではなく、状態が変更されると WSC から Outlook に通知が行われるというような仕組みで実現されています。

参考情報:

Outlook Trust Center でウイルス対策の状態が使用不可と表示される – Outlook | Microsoft Learn

Windows 10 Enterprise マルチセッションに関する FAQ – Azure | Microsoft Learn

WscGetSecurityProviderHealth 関数 (wscapi.h) – Win32 apps | Microsoft Learn

WscRegisterForChanges 関数 (wscapi.h) – Win32 apps | Microsoft Learn

[共有予定表の強化] のメリットと制限

Microsoft 365 Apps の Outlook のバージョン 2112 以降では、[共有予定表の強化] という機能が既定で有効になっており、半期チャネルでもこの機能が有効になっている環境が増えているようです。
しかし、この機能の有効化に伴って、想定外の動作になるというトラブルも発生する場合があります。

今回は [共有予定表の強化] について説明します。

[共有予定表の強化] とは?

[共有予定表の強化] は、共有されている予定表へのアクセスを従来の MAPI から REST という API に変更することで実現されています。
従来の MAPI 接続では、自分のメールボックスと共有メールボックスで同じ接続方法を使用しており、以下のような問題が生じていました。

  • 競合が発生する恐れがあるため、書き込み可能な代理人の数に制限がある (MAPI 接続でサポートされる書き込み可能な代理人の数は 1 名のみ)
  • メールボックス単位のアクセス権とフォルダー単位のアクセス権で矛盾があると予期しない動作をする
  • 共有フォルダーのダウンロードがオンの場合、OST にキャッシュされている共有予定表の数だけ TCP の常時接続セッションが必要となる (1 クライアントで 100 近くの TCP セッションが維持されることも…)
  • Outlook for iOS/Android など MAPI を使用していないクライアントで共有予定表が開けない
  • キャッシュ モードで共有予定表の更新にタイムラグが生じる

このような制限は接続に使用している MAPI の仕様に起因するものであるため、これを改善するために REST という API を使用して共有予定表へのアクセスを行うというのが共有予定表の強化になります。

[共有予定表の強化] のメリット

MAPI の制限を改善することが共有予定表の強化の目的であるため、メリットは上記の制限の改善ということになります。
具体的には以下のようなものです。

  • 複数の代理人での書き込みがサポートされる
  • メールボックス単位のアクセス権とフォルダー単位のアクセス権で矛盾があっても、適切なアクセス権で動作する
  • 共有フォルダーのために TCP セッションを維持する必要がない
  • Outlook for iOS/Android でも共有予定表を開くことができる
  • 共有予定表の更新が速い

また、以下のような改善もされています。

  • 繰り返しの会議の終了日を変更した場合に、例外がクリアされない
  • 会議出席依頼の応答が出席者から返されない場合でも、[履歴管理] タブで出席者の承諾・辞退の状態が確認できる
  • 会議の出席者を変更した場合に、更新を変更した出席者のみに送信するかどうかを選択する必要がない

[共有予定表の強化] の制限事項

上記のようなメリットもあるのですが、API の変更に伴って以下のような制限事項もあり、これについては改善される予定はないようです。

  • 最終更新者が表示されない
  • 同じユーザーの予定表を複数の予定表グループに追加できない
  • すでに複数の予定表グループに同じユーザーの予定表が追加された状態で共有予定表の強化が有効になった場合、どれか一つを選択すると他のグループの予定表も選択されたり、予定表グループ間で移動されたりする
  • 会議出席依頼の応答にファイルを添付できない
  • 会議や予定の下書きが自動保存されない
  • 会議の変更を下書き状態で保存できず、保存した場合は自動的に変更が送信される
  • [共有フォルダーをダウンロード] の設定は共有予定表に対しては無視され、常に OST にキャッシュされる
  • 自動仕分けの送信遅延ルールが会議出席依頼に反映されず、直ちに送信される
  • 個人用フォーム ライブラリのカスタム フォームがサポートされない
  • 会議出席依頼に対する自動応答の設定がサポートされない

また、現時点では以下のような既知の不具合が確認されています。

  • 複数の予定表を並べて表示している際に、選択した時間と異なる時間帯のアイテムが選択される場合がある
  • 代理人が添付ファイルに変更を加えて会議出席依頼の更新を送信すると、出席者が更新されていない添付ファイルを受信する場合がある

このように、様々な制限事項やまだ修正されていない不具合などもあるため、MAPI の制限に起因する現象に遭遇していない状況なのであれば、[共有予定表の強化] をオフにしておくほうが良いかもしれません。

参考リンク

Outlook for Windows の共有予定表の更新 (microsoft.com)

Microsoft 365 での予定表​​​の共有

Outlook 予定表共有の更新プログラムを有効または無効にする方法 (microsoft.com)

Outlook デスクトップ共有予定表の改善に関する既知の問題 (microsoft.com)

アプリケーションを使用する場合の組織のベスト プラクティスOutlook カレンダー (microsoft.com)

Planning considerations for REST-based (aka new model) calendar sharing in Outlook – Microsoft Community Hub

Conflicting permission sets when working with shared or delegated folders in Outlook – Microsoft Community Hub

Improve shared and delegated calendar experiences in Microsoft Outlook – Events | Microsoft Learn

特定のメール テンプレートをもとにメールを作成している際に、差出人アカウントを切り替えるとテンプレートの一部が消える

Outlook で複数のアカウントを使用しており、署名を含むようなメール テンプレートを使用してメールを送信するようなシナリオで、差出人アカウントを切り替えると本文の一部が消えるという現象が発生する場合があります。
これは、メール テンプレートの本文の一部が署名として認識されるために発生します。

Outlook ではアカウント切り替えなどでメールの署名を簡単に切り替えられるようにするため、署名を追加した場合にはその領域に _MailAutoSig という特殊なタグが設定されます。
そして、アカウントを切り替えたり、[挿入]-[署名] で別の署名を挿入したような場合、既存の署名が新しい署名に置き換えられるという仕組みになっています。

問題は、署名として認識されているエリアについても、本文と同様に変更ができてしまうという点です。

署名が挿入されている状態で本文の編集などを行っていると、誤って署名の領域に本文の一部を追記してしまう可能性があります。
そして、そのような署名に追記された本文は、署名の置き換えの際にもともとあった署名と同様に削除されてしまうのです。

このような現象を回避するには、テンプレートを作成する際には署名を挿入していない状態で編集を行い、署名の挿入は最後に行う必要があります。

なお、本文が署名として認識されているかどうかは本文を右クリックしたときに表示されるメニューで判断できます。
もし、フォントなどの設定が表示されるのであれば通常の本文として認識されていますが、署名の挿入ダイアログになる場合は署名として認識されています。

テンプレート (OFT) から送信したメールのみ送信時に確認メッセージを表示するマクロ

コメントにて以下のご要望をいただきました。


以下の内容がVBで可能でしたらご教授ください。
作業後の内容が間違っていないか最後の確認を行うために
テンプレートされたメールを送信する際、作業項目のチェックが出来るようメッセージが表示されるようにしたいと思っております。
テンプレートされたメールのみにメッセージが表示されるようにすることは可能でしょうか。


「テンプレートされたメール」というのは Outlook のテンプレート (OFT ファイル) を使って送信されるメールということでよいでしょうか?
その場合、OFT ファイルを作成する際にあらかじめ「未チェック」という分類項目を設定しておき、メールの送信時にその分類項目がついているメールだけ確認メッセージを表示するというようなマクロで実現できるでしょう。

作成中のメールに分類項目を付けるには、[ファイル]-[プロパティ] で [分類項目] をクリックして追加します。

マクロは以下の様になります。

'
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
     Const UNCHECK_KEYWORD = "未チェック"
     ' 分類項目を確認
     If Item.Categories = UNCHECK_KEYWORD Then
         ' チェックをしたかどうかを確認
         If MsgBox("チェックは完了しましたか?", vbYesNo) = vbYes Then
             ' チェック済みなら分類項目を削除して送信
             Item.Categories = ""
         Else
             ' チェック済みでなければ送信キャンセル
             Cancel = True
         End If
     End If
End Sub

マクロの登録方法やメニューへの追加について

Outlook の本文から同一のデータを複数取得するマクロ

本文から取得したデータを項目別に Excel のシートに書き出すマクロ 2 のコメントにて以下のご要望をいただきました。


いつも参考にさせていただいております。ありがとうございます。
このページのPrivate Function GetValueByTokenを改良して使いたいのですが、躓いてしまったので教えていただけますでしょうか。

私の会社では社外に添付ファイル付きメールを送ると自動的に添付ファイルにPWがかけられ、送信者に以下の様なメールが来ます。
~~~メール抜粋 ここから~~~~~~~~~~
  (略)
●件名    ○○について
●解凍PW  knebt&3c45
●送信先   aaa1@aaaaa.co.jp
●送信先   aaa2@aaaaa.co.jp
●送信先   bbb1@bbbbb.co.jp
  (略)
~~~メール抜粋 ここまで~~~~~~~~~~

このメールを基に送信先のメール全員にPWを送るのですが、Private Function GetValueByTokenを使って件名、解凍PWと送信先の1つ目は抽出できるのですが、送信先の2つ目以降が抽出できません。送信先が複数ある場合に2つ目以降のデータ開始位置の取得方法を教えていただけますでしょうか。

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


本題に入る前に少しだけ。

添付ファイルに自動的にパスワードを付けて、そのパスワードを別のメールで送信するという処理は一般に PPAP と呼ばれる手法であり、セキュリティ上意味がないだけでなく、生産性の低下やマルウェアによる悪用などが危険視されており、一部の企業ではパスワード付きの添付ファイルの受け取りを拒否するところも出てきているものです。
そのため、個人的にはこのような運用を見直すことをお勧めします。
詳細は以下のリンクをご覧ください。

PPAP (セキュリティ) – Wikipedia

さて、上記のようなフォーマットの本文の場合、データの終わりは改行となるので、本文から取得したデータを項目別に Excel のシートに書き出すマクロの中の GetValueByToken のほうが適しているかもしれません。
ただ、取得すべき項目名が複数登場する状況には対応するには、本文のどこまで検索したのかという情報を維持して項目名の検索を繰り返すというような処理が必要です。
項目名に対応するデータを 1 つだけ取り出す GetValueByTokenLF と、同一項目が複数存在する場合に対応した GetMultiValueByTokenLF を作成しました。
GetMultiValueByTokenLF は取得したデータを ; で区切って一つの文字列として返すため、Split 関数で値を分割する必要があります。
これらの関数の使用方法の説明のため、メールを作成するサンプルもつけたマクロは以下の通りです。

'
Public Sub CreatePasswordMails()
     Dim objItem As MailItem
     Dim strSubject As String
     Dim strPassword As String
     Dim strTo As String
     Dim arrTo As Variant
     Dim strAddr As Variant
     Dim pwMail As MailItem
     ' メインのウィンドウのメールを取得
     If TypeName(ActiveWindow) = "Inspector" Then
         Set objItem = ActiveInspector.CurrentItem
     Else
         Set objItem = ActiveExplorer.Selection(1)
     End If
     ' メール本文から件名、パスワード、送信先を取得
     With objItem
         strSubject = GetValueByTokenLF(.Body, "●件名")
         strPassword = GetValueByTokenLF(.Body, "●解凍PW")
         strTo = GetMultiValueByTokenLF(.Body, "●送信先")
     End With
     arrTo = Split(strTo, ";")
     For Each strAddr In arrTo
         Set pwMail = CreateItem(olMailItem)
         pwMail.Subject = "パスワード通知: " & strSubject
         pwMail.Body = "件名「" & strSubject & "」の解凍パスワードをお知らせします。" & _
             vbCrLf & "パスワード: " & strPassword & vbCrLf
         pwMail.To = strAddr
         pwMail.Display
     Next
End Sub
'
' 指定された文字列の行のデータを取得する関数
Private Function GetValueByTokenLF(strBody As String, strToken As String) As String
     Dim i As Integer
     Dim strLine As String
     Dim strValue As String
     i = InStr(strBody, strToken)
     If i > 0 Then
         strValue = ""
         strLine = Mid(strBody, i + Len(strToken) + 4)
         i = InStr(strLine & vbCrLf, vbCrLf)
         ' 余計な空白を削除
         strValue = Trim(Left(strLine, i - 1))
         GetValueByTokenLF = strValue
     Else
         GetValueByTokenLF = ""
     End If
End Function
'
' 指定された文字列の行のデータを複数取得する関数
Private Function GetMultiValueByTokenLF(strBody As String, strToken As String) As String
     Dim i As Integer
     Dim iL As Integer
     Dim strLine As String
     Dim strValues As String
     i = InStr(strBody, strToken)
     If i > 0 Then
         strValues = ""
         While i > 0
             strLine = Mid(strBody, i + Len(strToken) + 4)
             iL = InStr(strLine & vbCrLf, vbCrLf)
             ' 余計な空白を削除し、最後に ; をつけて連結
             strValues = strValues & Trim(Left(strLine, iL - 1)) & ";"
             i = InStr(i + Len(strToken), strBody, strToken)
         Wend
         ' 最後の ; を削除
         strValues = Left(strValues, Len(strValues) - 1)
         GetMultiValueByTokenLF = strValues
     Else
         GetMultiValueByTokenLF = ""
     End If
End Function

マクロの登録方法やメニューへの追加について