Outlook の予定表を CSV ファイルにエクスポートするマクロ Ver 2


以前、「Outlook の予定表を CSV ファイルにエクスポートするマクロ」や「Exchange 環境で共有されている他人の予定表のデータを取得するマクロ」として、予定表を CSV ファイルに出力するマクロを公開していたのですが、開始日時や終了日時を日付と時間に分けて出力する方法についてのご質問をいただきました。

そこで、以前公開したバージョンの改訂版として開始日時を日付と時間に分けたものを作成しました。

以下がそのマクロです。ExportMyCalendar は自分の予定を、ExportOthersCalendar は Exchange 環境で共有されている他人の予定を CSV に出力するマクロです。

'ここをトリプル クリックするとマクロ全体が選択できます。
'  自分の予定表を出力するマクロ
Public Sub ExportMyCalendar()
    Const MY_CSV_FILE_NAME = "c:\mycalendar.csv" ' エクスポートするファイル名を指定してください。
    Dim fldCalendar ' As Folder
    Set fldCalendar = Application.Session.GetDefaultFolder(olFolderCalendar)
    ExportThisMonth fldCalendar, MY_CSV_FILE_NAME
End Sub
'  他人の予定を出力するマクロ
Public Sub ExportOthersCalendar()
    Const OTHERS_CSV_FILE_NAME = "c:\others.csv" ' エクスポートするファイル名を指定してください。
    Dim strUserName As String
    Dim objRecip As Recipient
    Dim fldCalendar 'As Folder
    strUserName = InputBox("ユーザー名またはアドレスを入力してください", "共有されている予定表のエクスポート")
    Set objRecip = Application.Session.CreateRecipient(strUserName)
    objRecip.Resolve
    If Not objRecip.Resolved Then
        MsgBox "ユーザーが特定できませんでした。", vbCritical, "共有されている予定表のエクスポート"
        Exit Sub
    End If
    Set fldCalendar = Application.Session.GetSharedDefaultFolder(objRecip, olFolderCalendar)
    ExportThisMonth fldCalendar, OTHERS_CSV_FILE_NAME
End Sub
'  共通ルーチンです。必ずこちらもコピーしてください。
Public Sub ExportThisMonth( fldCalendar, strFileName As String )
    Dim strStart As String
    Dim strEnd As String
    Dim dtExport As Date
    Dim objFSO 'As FileSystemObject
    Dim stmCSVFile 'As TextStream
    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(strFileName, True)
    ' CSV ファイルのヘッダです。出力するフィールドを増減する場合はこちらも変更してください。
    stmCSVFile.WriteLine """件名"",""場所"",""開始日"",""開始時刻"",""終了日"",""終了時刻"",""分類項目"",""主催者"",""必須出席者"",""任意出席者"""
    Set colAppts = fldCalendar.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 & _
            """,""" & FormatDateTime(objAppt.Start, vbShortDate) & _
            """,""" & FormatDateTime(objAppt.Start, vbShortTime) & _
            """,""" & FormatDateTime(objAppt.End, vbShortDate) & _
            """,""" & FormatDateTime(objAppt.End, vbShortTime) & _
            """,""" & objAppt.Categories & _
            """,""" & objAppt.Organizer & _
            """,""" & objAppt.RequiredAttendees & _
            """,""" & objAppt.OptionalAttendees & _
            """"
'
       stmCSVFile.WriteLine strLine
        Set objAppt = colAppts.FindNext
    Wend
    stmCSVFile.Close
End Sub

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

Outlook の予定表を CSV ファイルにエクスポートするマクロ Ver 2」への29件のフィードバック

  1. こんにちは。予定表をエクスポートする目的が、GoogleCalendarへの取り込みであれば、iCalendar形式で書きだすのが簡単です。

    Sub ExportCalendar()

    Dim oNamespace As NameSpace
    Dim oFolder As Folder
    Dim oCalendarSharing As CalendarSharing

    ‘ 条件設定部

    Const mySaveFolder As String = “D:\Documents and Settings\myname\My Documents\”
    ‘エクスポートしたファイルの保存先
    ‘icsファイルの名前は000.icsで決め打ち(Google Calendarにインポートするときすぐ見つけやすい名前)
    Const myEndPeriod As Integer = 3
    ‘今日からmyEndPeriodヶ月後までの予定をエクスポート

    ‘ 予定表の既定のフォルダへの参照を取得します。
    Set oNamespace = Application.GetNamespace(“MAPI”)
    Set oFolder = oNamespace.GetDefaultFolder(olFolderCalendar)

    ‘ 予定表の既定のフォルダの CalendarSharing オブジェクトを取得します。
    Set oCalendarSharing = oFolder.GetCalendarExporter

    ‘ 添付ファイルやプライベートなアイテムを含めて、
    ‘ 予定表フォルダの内容今日以降設定された月までを詳細にエクスポートするように
    ‘ CalendarSharing オブジェクトを設定します。
    With oCalendarSharing
    .CalendarDetail = olFullDetails
    .IncludePrivateDetails = True
    .StartDate = Now
    .EndDate = DateAdd(“m”, myEndPeriod, Now)
    ‘〇日後までをエクスポートしたければDateAdd(“d”, myEndPeriod, Now)
    End With

    ‘ 予定表を iCalendar 予定表 (000.ics) ファイルにエクスポートします。
    oCalendarSharing.SaveAsICal mySaveFolder & “000.ics”

    Set oCalendarSharing = Nothing
    Set oFolder = Nothing
    Set oNamespace = Nothing

    End Sub

    あとはGoogleCalendarで000.icsを指定してインポートするだけ。
    ちなみに、上記のコードはOutlook2007のマクロヘルプに出ていたものに、少しだけ手を入れたものです。

  2. 上記をコピペして処理しようとしたところ、実行時エラー70(書き込みできません)と出てしまいました。デジタル署名も作成し、OUTLOOKも再起動してから記入したのですが。

    • サンプルのエクスポート先のファイル名が C: ドライブ直下なのですが、それが原因かもしれません。
      書き込みできるフォルダーのパスに変更してお試しください。

  3. はじめまして。上記マクロで質問です。
    先月(2012年12月)の時点で似たようなマクロを実施したものが、今月はできませんでした。
    strStart = Year(Now) & “/” & Month(Now) & “/1 00:00”
    の部分が今年(2013年)のデータのみを抽出するよう設定しているのかと思い、いろいろ試しましたが、先月以前のデータが出せない状態です。
    アドバイスいただけますでしょうか?

  4. 以前(3ヶ月前)の予定表をエクスポートする場合はdtExport = Now を dtExport = DateAdd(“m”,-3,Now) に変更してみましたが、当月分しか取れません。

  5. はじめまして。このマクロで質問です。当月分の予定がすべて書き出される仕様だと思うのですが、なぜか2日分くらいしかエクスポートできません。原因が推測できれば、お手数をおかけしますがご教示いただけると助かります。(ちなみに、翌月をエクスポートするとなぜか全て書き出されます)
    環境はMicrosoft Outlook 2010(Win7/32bit)です。

  6. はじめまして。宜しくお願いします。
    OUTLOOKの予定表をCSVにエクスポートする件、大変便利に使わせてもらってます。
    これにユーザー定義フィールド”収入”、”支出”を付加したデータとしてエクスポートしたいのですが、
    上手くいきません。
    教えていただけると助かります。

    • 以下のコードを “””,””” & objAppt.OptionalAttendees & _ の後に追記してください。
      “””,””” & objAppt.UserProperties(“収入”).Value & _
      “””,””” & objAppt.UserProperties(“支出”).Value & _

  7. Outlookの予定データを日報管理として
    Accessかexcelにインポートして活用したいと考えています。

    各個人でExportする事を前提として
    以下の文章(一部ここでは省略)を除いて
    ThisOutlookSessionにコピペしマクロ登録致しました。

    ‘ 他人の予定を出力するマクロ
    Public Sub ExportOthersCalendar()
    中略
    End Sub

    デジタル署名の作成、OUTLOOKも再起動しマクロを実行
    画面ではなんの変化もなく一瞬不安になりましたが、
    エクスポート先のファイル名とされている C: ドライブ直下を確認すると
    mycalendar.csv が作成されていた。
    中身を確認すると当月の予定がExportされていました。

    以下の点を変更したいのですが…。

    Q1:日単位や週単位としたい場合はどのようにすればよいのでしょうか?
    マクロの文章に以下の説明があるのですが…
    dtExport = Now ‘ 来月の予定をエクスポートする場合は Now の代わりに DateAdd(“m”,1,Now) を使用します。
    ‘ 月単位ではなく任意の単位にする場合は以下の記述を変更します。
    strStart = Year(Now) & “/” & Month(Now) & “/1 00:00”
    strEnd = DateAdd(“m”, 1, CDate(strStart)) & ” 00:00″

    DateAdd 関数を調べてみました。m=月、d=日、ww=週が引数 interval の設定値のようです。

    本日の予定をエクスポートしたい場合
    “m”を”d”と変更することでよいのでしょうか?

    dtExport = Now

    dtExport = DateAdd(“d”,-1,Now)

    上記部分のみの変更では当月の予定がExportされます。
    下記部分も追加変更しましたが、
    本日(2016/11/17)ではなく201611/01のデータがExportされました。

    strEnd = DateAdd(“m”, 1, CDate(strStart)) & ” 00:00″

    strEnd = DateAdd(“d”, 1, CDate(strStart)) & ” 00:00″

    私の力ではこれ以上は無理です。
    本日、昨日、先週の条件でエクスポートするにはどのように変更すればよいのでしょうか?

    質問2:日付のデータの形式について
    Exportされた日付データは 2016/11/17 (木) という曜日まで表示されている形式です。
    2016/11/17のような 曜日を含まない形式でのExportはできないでしょうか?

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

  8. 以前コメントさせて頂いた時には
    各個人でExportする事を前提として使用しようとしておりましたが
    幾分、他のメンバーの技術面に問題があり
    現在、共有してもらっている予定表を各人毎にエクスポートして集計しております。

    環境としては
    現在、Outlook2013でOutlook.comのアカウントを接続しており
    Outlook.comにて複数人(3名)の予定表を共有して貰っています。
    Outlook2013では自分のアカウントは【個人の予定表】に表示されています。
    共有して貰っている複数人(3名)の予定表は【その他の予定表】に表示されています。

    ExportOthersCalendar は Exchange 環境で共有されている
    他人の予定を CSV に出力するマクロを実行しました。
    “ユーザー名またはアドレスを入力してください”には
    【その他の予定表】に表示されている名前を入れてみましたが
    上記の場合はExchange 環境には該当しないのでしょう。
    データはexportされませんでした。

    【その他の予定表】の予定表を CSV に出力するには
    どのようにしたらよいのでしょうか?

    その時に、以下の設定をしたいです。

    エクスポート期間指定(以下のように任意の日付指定)
    たとえば…(いつからいつまで)というように開始日と終了日をそれぞれ指定したい。
    2017/03/01 ~ 2017/03/31
    以前のコメントした回答に【日付の文字列を設定するいくつかの方法】を頂戴しましたので
    先月とか、先週等の固定期間は作成できました。

    エクスポートファイル名の指定
    複数人(3名)毎に、出力する日付を付記したファイル名としたい場合
    都度ファイル名を任意名に指定したい。

    もしくは、自身の含め4名を一度にエクスポート
    但し、その場合は、出力するフィールドにユーザーが判断できる項目が必要です。

    よろしくお願い申し上げます。

  9. 一点、自力で解決できました。
    ※こちらの過去の説明を参考にさせて頂いたので自力ではないです。

    【その他の予定表】の予定表を CSV に出力するには…。

    【任意のフォルダーにアイテムを作成するマクロ】の
    以下の記述を参考にさせて頂きました。
    Set fldCalendar = Session.Folders(“iCould”).Folders(“予定表”)

    Set fldCalendar = Application.Session.GetDefaultFolder(olFolderCalendar)

    Set fldCalendar = Application.Session.GetDefaultFolder(olFolderCalendar).Folders(“××××”)
    ××××には【その他の予定表】に表示されている名前を入力

    取り急ぎ、ご報告まで。

  10. Outlook.comにて複数人(3名)の予定表を共有して貰っています。
    Outlook2013では自分のアカウントは【個人の予定表】に表示されています。
    共有して貰っている複数人(3名)の予定表は【その他の予定表】に表示されています。
    で【その他の予定表】に関しては下記の記述で自己解決できたのです。

    Set fldCalendar = Application.Session.GetDefaultFolder(olFolderCalendar).Folders(“××××”)
    ××××には【その他の予定表】に表示されている名前を入力

    自分のアカウント【個人の予定表】はOutlook.comのアカウントを予定表を管理するアカウントとしており
    メールの送受信は会社のメールアドレスをOutlook2013にアカウント登録しております。
    その会社のメールアドレスのアカウントでも予定を管理開始しました。
    また、別のアカウント(Outlook.com)を所得しOutlook2013に登録しこちらも予定を管理開始しました。
    この二つのアカウントの予定表は【その他の予定表】ではなく
    【個人の予定表】下記のような表示となっております。

    予定表-aaaaa@Outlook.com
    予定表-bbbbb@Outlook.com
    予定表-ccccc@*******.com

    今日まで予定表-aaaaa@Outlook.comの予定表をエクスポートさせるのには
    下記の記述で問題ありませんでした。
    Set fldCalendar = Application.Session.GetDefaultFolder(olFolderCalendar)

    予定表-ccccc@*******.comの予定表をエクスポートさせるのに下記でチャレンジしましたが
    エクスボートされません。
    Set fldCalendar = Application.Session.GetDefaultFolder(“ccccc@*******.com”)
    Set fldCalendar = Application.Session.GetDefaultFolder(“予定表-ccccc@*******.com”)

    どのような記述にすれば良いのでしょうか?
    よろしくお願い申し上げます。

  11. はじめまして。
    他メンバーのスケジュール書き出しに便利に使わせて頂いています。
    以下の方法をご教示いただけないでしょうか。
    1.非公開の予定を「非公開」の予定として書き出す方法。
    2.空の予定を書きださない方法。
    どうかよろしくお願い申し上げます。

  12. はじめまして。
    当方、java開発者でvbaに関しては初心者のものです。

    実行環境
    Microsoft Excel 2010

    私の環境にて
    記載されているソースをExcel Vbaにて実行しようとすると
    Set objRecip = Application.Session.CreateRecipient(strUserName)
    の行にて
    オブジェクトは、このプロパティまたはメソッドをサポートしていません。
    とのエラーが出て
    最後まで実行できません。

    参照設定では
    Microsoft Excel 14.0 Object Library
    Microsoft Outlook 14.0 Object Library
    を登録しております。

    何か参照設定で足りていないもの等
    アドバイスいただけないでしょうか?

    お手数をおかけしますが
    よろしくお願いいたします。

    • 匿名希望のものです。
      すみません。自己解決できました。
      Excel用に記述を変更することで解決しました。

  13. こちらのマクロを社内の営業担当の行動目標件数管理用で、いつも活用させていただいております。
    とても助かっております。ありがとうございます。

    1点ご相談がございます。
    スケジュールに環境依存文字(①➡∼⁻など)が件名や場所、分類項目に入っていると
    エラーが出てしまい、環境依存文字が記載されたスケジュール以降がデータとして反映されません。
    該当するであろう変数をVariant型に直してみたのですが、同様です。
    回避方法がございましたらご教示頂けると幸いです。

    ※デバックすると、 stmCSVFile.WriteLine strLineが黄色になります。
    ※使用環境は、OUTLOOK2013・セキュリティは「すべてのマクロを有効にする」で設定しています。

    ご回答、何卒、よろしくお願いします。

    ‘ 他人の予定を出力するマクロ
    Public Sub ExportOthersCalendar()
    Const OTHERS_CSV_FILE_NAME = “H:\others.csv” ‘ エクスポートするファイル名を指定
    Dim strUserName As String
    Dim objRecip As Recipient
    Dim fldCalendar ‘As Folder
    strUserName = InputBox(“ユーザー名またはアドレスを入力してください”, “共有されている予定表のエクスポート”)
    Set objRecip = Application.Session.CreateRecipient(strUserName)
    objRecip.Resolve
    If Not objRecip.Resolved Then
    MsgBox “ユーザーが特定できませんでした。”, vbCritical, “共有されている予定表のエクスポート”
    Exit Sub
    End If
    Set fldCalendar = Application.Session.GetSharedDefaultFolder(objRecip, olFolderCalendar)
    ExportThisMonth fldCalendar, “H:\” & strUserName & “.csv”
    End Sub
    ‘ 共通(当月)
    Public Sub ExportThisMonth(fldCalendar, strFileName As String)
    Dim strStart As String
    Dim strEnd As String
    Dim dtExport As Date
    Dim objFSO ‘As FileSystemObject
    Dim stmCSVFile ‘As TextStream
    Dim colAppts As Items
    Dim objAppt ‘As AppointmentItem
    Dim strLine As Variant

    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(strFileName, True)
    ‘ CSV ファイルのヘッダ 出力するフィールドを増減する場合はこれも変更
    stmCSVFile.WriteLine “””件名””,””開始日””,””開始時刻””,””終了日””,””終了時刻””,””分類項目””,””主催者””,””必須出席者””,””任意出席者”””
    Set colAppts = fldCalendar.Items
    colAppts.Sort “[Start]”
    colAppts.IncludeRecurrences = True
    Set objAppt = colAppts.Find(“[Start] = “”” & strStart & “”””)
    While Not objAppt Is Nothing
    strLine = “””” & objAppt.Subject & _
    “””,””” & FormatDateTime(objAppt.Start, vbShortDate) & _
    “””,””” & FormatDateTime(objAppt.Start, vbShortTime) & _
    “””,””” & FormatDateTime(objAppt.End, vbShortDate) & _
    “””,””” & FormatDateTime(objAppt.End, vbShortTime) & _
    “””,””” & objAppt.Categories & _
    “””,””” & objAppt.Organizer & _
    “””,””” & objAppt.RequiredAttendees & _
    “””,””” & objAppt.OptionalAttendees & _
    “”””

    stmCSVFile.WriteLine strLine
    Set objAppt = colAppts.FindNext
    Wend
    stmCSVFile.Close
    MsgBox “抽出が終わりました。”
    End Sub
    ‘ 他人の予定を出力するマクロ(前月)
    Public Sub ExportOthersCalendarlastmonth()
    Const OTHERS_CSV_FILE_NAME = “H:\others lastmonth.csv” ‘ エクスポートするファイル名を指定
    Dim strUserName As String
    Dim objRecip As Recipient
    Dim fldCalendar ‘As Folder
    strUserName = InputBox(“ユーザー名またはアドレスを入力してください”, “共有されている予定表のエクスポート”)
    Set objRecip = Application.Session.CreateRecipient(strUserName)
    objRecip.Resolve
    If Not objRecip.Resolved Then
    MsgBox “ユーザーが特定できませんでした。”, vbCritical, “共有されている予定表のエクスポート”
    Exit Sub
    End If
    Set fldCalendar = Application.Session.GetSharedDefaultFolder(objRecip, olFolderCalendar)
    ExportLastMonth fldCalendar, “H:\前月 ” & strUserName & “.csv”
    End Sub

    • このマクロでは Windows の既定のコードページを使用してファイルを保存しています。
      そのため、そのコードページに含まれない文字を使用するとエラーになります。
      ファイルを Unicode で開けばエラーは発生しなくなりますが、出力したファイルはどのように使用されるのでしょうか?
      もし、ファイルを使用するアプリケーションが Unicode に対応していない場合、Unicode で出力するとそのアプリケーションでファイルが読めなくなってしまいます。
      アプリケーションが Unicode に対応しているようであれば、
      Set stmCSVFile = objFSO.CreateTextFile(strFileName, True)

      Set stmCSVFile = objFSO.CreateTextFile(strFileName, True, True)
      としてください。

  14. いつもお世話になっております。
    複数人数の共有の予定表を取得するソースを参考にしたところ、
    30人以上の予定を一度に取得しようとすると
    共有の制限人数に引っかかるようで
    処理が落ちてしまいます。

    こちらの事象を回避する方法はございませんでしょうか?

    お手数をおかけしますが
    ご回答いただければ幸いです。

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

  15. お世話になります。
    outlook2016ver.を使用しておりますが上記マクロ実行できません。
    対処法や原因のアドバイス頂けないでしょうか…
    恐縮ではございますがよろしくお願い致します。

    ・自分の予定表、選択した人の予定表(週単位)がCSVに落としたい情報です

    何卒宜しくお願い致します

コメントを残す