Outlook の VBA で既定以外のフォルダーを取得する

Outlook に登録されている予定を取得するプログラムを作成した際に、常に既定の予定表フォルダーが対象となるようにプログラムしていました。しかし、Outlook は複数のフォルダーを作ることができるため、既定以外のフォルダーを取得する方法を、予定表を例にまとめました。

既定のフォルダーを取得する方法

既定以外のフォルダーを取得する前に、まず、既定のフォルダーを取得する方法です。少し違和感があるかもしれませんが、予定表もフォルダーの一種として扱われます。

Dim l_calendar As Outlook.Folder
Set l_calendar = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)

既定以外のフォルダーの例

既定以外のフォルダーというのは、たとえば次のような場合です。

[Outlook] 既定の予定表とは別に予定表がある
既定の予定表とは別に予定表がある

予定表の中にさらに予定表が入っています。実際はこのようにすることはあまりないかもしれませんが、今回はテストなので、あえてこのようにしました。

既定以外の予定表を取得するには

既定以外のフォルダを取得する場合は、ルート フォルダーから目的のフォルダーまで順にたどっていく必要があります。上の例の場合は、「テスト用 Outlook データファイル」フォルダー取得 → 「テスト用予定表」フォルダー取得 → 「テスト用予定表2」フォルダー取得、という流れです。

指定したパスに従って、フォルダーを順にたどっていく関数は次の通りです。

' 指定したパスの Outlook フォルダーを取得します。
' <params>
'   p_folderPath
'       フォルダーのパス。
' <returns>
'   p_folderPath が示す Outlook フォルダー。存在しない場合は Nothing。
Private Function GetOutlookFolder(ByVal p_folderPath As String) As Outlook.Folder
    If Left(p_folderPath, 2) = "\\" Then
        p_folderPath = Right(p_folderPath, Len(p_folderPath) - 2)
    End If
    
    ' フォルダーのパスを、フォルダー名ごとに分けて配列にします。
    Dim l_folderNames As Variant
    l_folderNames = Split(p_folderPath, "\")
    
    Dim l_folder As Outlook.Folder
    
    Dim l_folders As Outlook.Folders
    Set l_folders = Application.Session.Folders
    
    ' フォルダーを検索し、見つかればそのフォルダーを基点としてさらに子フォルダーを検索します。
    ' これをフォルダーの階層分繰り返して、目的のフォルダーを探します。
    For Each l_folderName In l_folderNames
        Set l_folder = l_folders.Item(l_folderName)
        
        If l_folder Is Nothing Then Exit Function
        
        Set l_folders = l_folder.Folders
    Next
    
    Set GetOutlookFolder = l_folder
End Function

関数を呼ぶ側は次のようになります。

Dim l_calendar As Outlook.Folder
Set l_calendar = GetOutlookFolder("\\テスト用 Outlook データ ファイル\テスト用予定表\テスト用予定表2")

これで、既定の予定表以外も取得できます。また、予定表だけではなく、他の種類のフォルダーも同様に取得できます。

kpdn

お寿司とゲームと動物が好きな、フリーランスのエンジニアです。フロントエンドからインフラまで日々奮闘中です。最近は物忘れがどんどんがひどくなってきました。

2件のコメントがあります

  1. 匿名

    For Each l_folderName In l_folderNames

    でエラーとなります。sがありません

    For Each l_folderNames In l_folderNames

    1. アバター画像
      kpdn

      こんにちは!コメントありがとうございます。

      変数 l_folderName(末尾に s が付いていないもの)は、For Each のループのたびに、l_folderNames が保持している複数のフォルダ名が 1 件ずつ格納される変数です。
      エラーとは、「宣言されていない変数(l_folderName)が使われている」というような内容でしょうか。
      一度、For Each より前の個所に、変数 l_folderName の宣言を追加してみてください!
      今手元に Outlook が無く、動作確認ができないのですが、おそらくそれでエラーは消えると思います。

      記憶があいまいで申し訳ないのですが、確か VBA には「変数の宣言を強制するかどうか」の設定があって、それがオンになっているのかもしれません。

コメントを残す