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 環境で共有されている他人の予定表のデータを取得するマクロ」への17件のフィードバック

  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(“サブカレンダー名”をつけて試してみたのですが、うまくいきません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中