Excel のデータを Outlook にインポートするマクロ


メッセージにて、Excel のデータを Outlook のユーザー定義フィールドに取り込む方法はないかというご質問を頂きました。
Outlook には Excel のデータをインポートする機能がありますが、あらかじめ決められたフィールドにのみインポートが可能であり、ユーザー定義フィールドにデータを取り込むことはできません。
そこで、Excel のデータを 1 行 1 アイテムとして Outlook に取り込むマクロを作成しました。
EXCEL_FILE で指定したファイル名の Excel ファイルを開き、そのデータを ITEM_CLASS で指定したメッセージ クラスのアイテムで保存します。例えば、投稿アイテムなら "IPM.Post" ですが、仕事アイテムだと "IPM.Task"、予定アイテムだと "IPM.Appointment" になります。
まず、最初の行の各列に設定されている値をフィールド名として取得し、値が設定されていないところまでをインポートの列範囲として認識します。最大 255 列までとしてありますが、それより大きい場合は MAX_COLS の値を増やしてください。
そして、次の行から 1 行ずつアイテムを作成してデータを格納し、最初の列に値が入っていない行を終りとみなします。
列名ですが、Subject や Body のように Outlook Object Model の既存のプロパティとして存在する場合は、そのプロパティに値を設定するようにしています。

' ここをトリプルクリックでマクロ全体を選択できます。
Public Sub ImportExcel()
    Const EXCEL_FILE = "c:\temp\test.xls"
    Const ITEM_CLASS = "IPM.Post"
    Const MAX_COLS = 255
    Dim objWorkbook ' As Excel.Workbook
    Dim objSheet ' As Excel.Worksheet
    Dim iCol As Integer
    Dim iRow As Integer
    Dim iNamesMax As Integer
    Dim aNames(MAX_COLS) As String
    Dim objItem As PostItem
    Dim objProp As Object ' ItemProperty or UserProperty
    ' 最初の行からユーザー定義フィールドの名前を取得する
    Set objWorkbook = GetObject(EXCEL_FILE)
    Set objSheet = objWorkbook.Sheets(1)
    For iCol = 1 To MAX_COLS
        If objSheet.Cells(1, iCol).Value <> "" Then
            aNames(iCol) = objSheet.Cells(1, iCol).Value
        Else
            iNamesMax = iCol
            Exit For
        End If
    Next
    ' 2 行目から実際のデータ
    iRow = 2
    ' A 列のデータがない行で終了とする
    While objSheet.Cells(iRow, 1).Value <> ""
        Set objItem = ActiveExplorer.CurrentFolder.Items.Add(ITEM_CLASS)
        For iCol = 1 To iNamesMax
            ' アイテムの既存のプロパティとして存在する場合はそれを使用する
            Set objProp = objItem.ItemProperties(aNames(iCol))
            If objProp Is Nothing Then
                ' 存在しないプロパティはユーザー定義フィールドとして追加
                Set objProp = objItem.UserProperties.Add(aNames(iCol), olText)
            End If
            objProp.Value = objSheet.Cells(iRow, iCol).Value
        Next
        objItem.Close olSave
        iRow = iRow + 1
    Wend
    objWorkbook.Close
End Sub

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

広告

Excel のデータを Outlook にインポートするマクロ」への6件のフィードバック

  1. お世話になります。
    自分は会社でOutlook2003を使用しています。
    上記マクロを入力してみましたが、いざ実行してみようとすると
    「型が一致しません」というエラーが出ます。
    エラーの出る箇所は
    Set objItem = ActiveExplorer.CurrentFolder.Items.Add(ITEM_CLASS)
    の行のようですが、このエラーはどう解決するのが良いでしょうか。
    (問題解決のためにはどんな情報が必要かご指示いただければ調べてみます)
    よろしくお願いいたします

    • マクロを実行する際に開いているフォルダーによって、作成できるアイテムの種別が異なります。
      おそらくは、マクロで指定している ITEM_CLASS のアイテムが開いているフォルダーで作成できないのだと考えられます。
      Excel ファイルをどの種類のフォルダー (メール、予定、仕事など) に取り込もうとしているのでしょうか?

  2. お世話になります。Dim objItem As PostItemでエラーが出てしまうのですが
    どのように解決したらよろしいですか???

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中