Exchange 環境で共有されている他人の予定表のデータを取得するマクロ


コメントで以下のようなご質問をいただきました。


Exchange サーバで共有している他の人の予定表から、予定を読むにはどのようにすればよいでしょうか?
自分の予定表から今月の予定をエクスポートするマクロは拝見しました。


ご質問をされた方はご自分で対処方法を発見されたのですが、共有されている他の人の予定表を開くには、NameSpace オブジェクトの GetSharedDefaultFolder メソッドを使用します。
以下のマクロは、ユーザー名をインプット ボックスで取得し、そのユーザーの予定表の今月分の予定を CSV にエクスポートするマクロです。なお、キャッシュ モードを使っている場合、他のユーザーの予定表のデータがキャッシュに保存されるまで、正しくアイテムが取得できない場合があります。

‘ ここをトリプル クリックするとマクロ全体が選択できます。
Public Sub ExportThisMonthCalendarOfSomeone()
    Dim dtExport As Date
    Dim strStart As String
    Dim strEnd As String
    Dim objFSO 'As FileSystemObject
    Dim stmCSVFile 'As TextStream
    Const CSV_FILE_NAME = "c:\thismonth.csv" ' エクスポートするファイル名を指定してください。
    Dim strUserName As String
    Dim objRecip As Recipient
    Dim colAppts As Items
    Dim objAppt 'As AppointmentItem
    Dim strLine As String
    dtExport = Now ' 来月の予定をエクスポートする場合は Now の代わりに DateAdd("m",1,Now) を使用します。
    ' 月単位ではなく任意の単位にする場合は以下の記述を変更します。
    strStart = Year(Now) & "/" & Month(Now) & "/1 00:00"
    strEnd = DateAdd("m", 1, CDate(strStart)) & " 00:00"
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set stmCSVFile = objFSO.CreateTextFile(CSV_FILE_NAME, True)
    ' CSV ファイルのヘッダです。出力するフィールドを増減する場合はこちらも変更してください。
    stmCSVFile.WriteLine """件名"",""場所"",""開始日時"",""終了日時"",""分類項目"",""主催者"",""必須出席者"",""任意出席者"""
    strUserName = InputBox("ユーザー名またはアドレスを入力してください", "共有されている予定表のエクスポート")
    Set objRecip = Application.Session.CreateRecipient(strUserName)
    objRecip.Resolve
    If Not objRecip.Resolved Then
        MsgBox "ユーザーが特定できませんでした。", vbCritical, "共有されている予定表のエクスポート"
        Exit Sub
    End If
    Set colAppts = Application.Session.GetSharedDefaultFolder(objRecip, olFolderCalendar).Items
    colAppts.Sort "[Start]"
    colAppts.IncludeRecurrences = True
    Set objAppt = colAppts.Find("[Start] < """ & strEnd & """ AND [End] >= """ & strStart & """")
    While Not objAppt Is Nothing
        strLine = """" & objAppt.Subject & _
            """,""" & objAppt.Location & _
            """,""" & objAppt.Start & _
            """,""" & objAppt.End & _
            """,""" & objAppt.Categories & _
            """,""" & objAppt.Organizer & _
            """,""" & objAppt.RequiredAttendees & _
            """,""" & objAppt.OptionalAttendees & _
            """"
'
       stmCSVFile.WriteLine strLine
        Set objAppt = colAppts.FindNext
    Wend
    stmCSVFile.Close
End Sub

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

Exchange 環境で共有されている他人の予定表のデータを取得するマクロ」への27件のフィードバック

  1. お世話になっております。
    エクセルVBAから『Exchange環境で共有されている他人の予定表を取得する』マクロを利用させていただいております。
    その際、予定表エリアに既に共有者名がある場合、このマクロを実行後に、予定表エリアにさらに同じ名前が追加されます。
    たとえば、『山田太郎』という共有者名が既に予定表エリアに表示されていた場合、マクロ実行後には『山田太郎』と
    『予定表-山田太郎』の二つが表示されます。
    この『予定表-山田太郎』を作成しないか、または、実行後に『予定表-山田太郎』を削除するか、どちらかの方法を
    ご教授いただけませんでしょうか?
    お手数をおかけしますが、どうぞよろしくお願い致します。

    • こちら、回答が遅くなりまして申し訳ありません。
      動作確認をして回避方法があるか検討してみますので、しばらくお待ちください。

  2. お世話になっております。
    予定表フォルダに重複して同人物の予定表が追加される旨の
    ご質問をさせていただきましたが
    こちらの確認ミスで、予定表フォルダに存在しないメンバーが
    『予定表ー鈴木一郎』というように登録されていました。
    同一人物の重複はありませんでした。
    お忙しいところ、大変お手数をおかけして、申し訳ございませんでした。

    そこで、この『予定表ー鈴木一郎』をマクロから削除したいのですが
    方法はございますでしょうか?

    また、他人の予定表を取り込む際、『非公開』と設定されているものも
    取り込んできますが、この『非公開』データを取り込まない方法は
    ございますでしょうか?
    何度もお手数をおかけしますが、どうぞよろしくお願いいたします。

    • 存在しないメンバーが追加されているとのことですが、手作業では削除できないということでしょうか?
      また、非公開の予定を取り込まなくする方法についてはちょっと調査してみます。

      • お世話になっております。
        お返事が遅くなり、大変申し訳ございませんでした。
        予定表フォルダに作成されたメンバーについては手作業で削除することにいたしました。
        また、非公開の予定もプロパティで取得ができましたので
        問題は解決いたしました。

        お忙しいところ、大変お手数をおかけして申し訳ございませんでした。
        今後ともどうぞよろしくお願いいたします。

  3. お世話になっております。
    エクセルVBAでExchangeサーバーで共有されている人の予定表を読むマクロを使用させていただき
    他人の予定表をエクセルシートに出力しています。

    このとき、既にExchangeサーバーから削除されている人のメルアドを指定した場合
    objRecip.Resolve
    If Not objRecip.Resolved Then
    MsgBox “ユーザーが特定できませんでした。”, vbCritical, “共有されている予定表のエクスポート”
    Exit Sub
    End If
    の箇所を通らず、その下の
    Application.Session.GetSharedDefaultFolder(objRecip, olFolderCalendar).Items
    で落ちてします。

    コードの違いは、エクセルVBAから実行しているので

    ‘アウトルックの実装
    Set olkAppli = CreateObject(“Outlook.Application”)
    ‘メンバーデータを読み込む
    Set olkNamespace = olkAppli.GetNamespace(“MAPI”)
    Set olkRecipient = olkNamespace.CreateRecipient(prmメンバーアドレス)
    olkRecipient.Resolve
    If Not olkRecipient.Resolved Then ‘メンバーが特定できなかった場合
    Set olkAppli = Nothing
    Exit Sub ‘処理終了

    End If

    と先にOUTLOOKを宣言しているところです。

    エラー番号は「-2147221219」でした。
    何か考えられる原因がございますでしょうか?
    お忙しいところお手数をおかけしますが
    お知恵を拝借いたしたく、どうぞよろしくお願い致します。

    • SMTPのメールアドレスを入力した場合、Resolve メソッドは成功してしまうので、その先の処理でエラーとなります。
      以下のように変更してみてください。

      変更前:
      If Not olkRecipient.Resolved Then

      変更後:
      If Not olkRecipient.Resolved Or Instr(olkRecipient.Address,”@”) > 0 Then

      • 早速のご教授、ありがとうございます。
        やってみます!!
        今後ともどうぞよろしくお願い致します。

  4. いつも参考にさせていただいております。
    こちらのマクロを参考に予定表を取得しているのですが、
    一部の予定ItemのLocationプロパティが「空き時間の情報を開くことができません」となり、
    実行時にエラーになってしまうのですが、それぞれの予定Itemのアクセスできないプロパティを
    判別する方法はございませんでしょうか。ご教示のほどよろしくお願いいたします。

      • ご回答ありがとうございます。存在しないプロパティ以外は取得したいため、現状はプロパティ毎に関数化してご指摘同様にエラー処理にて対応しておりますが、あまりきれいなプログラムではないため良い方法は無いものかと思い、質問させていただきました。
        今後とも何かありましたらよろしくお願いいたします。

  5. いつも参考にさせていただいています
    マクロ初心者です
    exchange環境で複数の予定表を取り込むには上記マクロのどの部分の変更をすればできるようになるでしょうか?
    初歩的な質問で申し訳ありません、よろしくお願いします

  6. いつも参考にさせていただいております。
    Exchange 環境で共有されている他人の予定表のデフォルトのカレンダーにはアクセスできるのですが、その人が別に作成したカレンダーにアクセスするにはどうしたらよいのでしょうか?具体的には、他のユーザーのサブカレンダーに書き込むマクロを作成したいのですが、GetSharedDefaultFolder(objRecip, olFolderCalendar)の後に.Folders(“サブカレンダー名”をつけて試してみたのですが、うまくいきません。

  7. いつも勉強させていただいております。「Exchange 環境で共有されている他人の予定表のデータを取得するマクロ」とても便利で勉強になりました。使い始めたところ、「非公開の予定」については、自分の予定については取得できるものの、他人の予定については取得できないようです。他人の予定も取得できる方法はありますでしょうか?ご教授いただけますと幸いに存じます。

  8. Set objAppt = colAppts.Find(“[Start] = “”” & strStart & “”””)
    の箇所でエラーとなります。

    実行時エラー ‘-2147352567 (80020009)’:

    “Start” は不明なプロパティです

  9. こちらのマクロの数々には大変お世話になっております。
    「Exchange 環境で共有されている他人の予定表のデータを取得するマクロ」を
    使用させていただこうとしております。
    ですが「更新者」の項目を取得しようとAppointmentItemのプロパティなどを
    見たのですが、それらしいものが見つからず難儀しております。
    「更新者」項目は取得できないのでしょうか。

    • apptItem に AppointmentItem オブジェクトが格納されていると仮定して、 apptItem.PropertyAccessor.GetProperty(“http://schemas.microsoft.com/mapi/proptag/0x3ffa001f”) で更新者の名前が取得できます。
      ただし、環境によってはメールアドレスになる場合があります。

  10. こんにちは、マクロを参照させていただきありがとうございます。
    実行させていただいたのですが、
    Set objAppt = colAppts.Find(“[Start] = “”” & strStart & “”””)
    の箇所でエラーとなってしまいました。
    実行時エラー ‘-2147352567 (80020009)’:
    “Start” は不明なプロパティです

    書き込まれていた通りに
    Start の代わりに 開始日時 としてみたのですが同様のエラーが発生しました。
    お忙しいところ申し訳ありませんがご教示ください。宜しくお願い致します。

  11. お世話になっております。

    1/7頃までは問題なく稼働していたのですが

    実行時エラー 5 「プロシージャの呼び出し、または引数が不正です。」
    デバック で下記が黄色になります。
    stmCSVFile.WriteLine strLine 

    どうかご指南頂ければ幸いです。
    よろしくお願い申し上げます。

    • 予定データの中に日本語のコードページに含まれない文字が存在していると考えられます。
      Set stmCSVFile = objFSO.CreateTextFile(CSV_FILE_NAME, True)

      Set stmCSVFile = objFSO.CreateTextFile(CSV_FILE_NAME, True, True)
      としてみてください。
      なお、このようにするとCSVファイルがシフトJISではなくUTF-8となるため、CSVファイルを開くアプリケーションによっては文字化けが発生するかもしれません。

  12. コメントありがとうございます。

    Set stmCSVFile = objFSO.CreateTextFile(CSV_FILE_NAME, True, True)としてみました。

    相変わらずの
    実行時エラー 5 「プロシージャの呼び出し、または引数が不正です。」
    デバック で今回修正した1行が黄色になります。

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

    予定データの中に日本語のコードページに含まれない文字が存在
    1/7頃のデータを確認してみようと思います。

コメントを残す