決まった件名のメッセージを受け取ったら添付された CSV ファイルの 2 行目を Excel ファイルの最後尾に追加するマクロ


コメントにて以下のご要望をいただきました。


特定の件名で始まるメールを受信したら、
  添付されたcsvファイルの2行目(1行目は項目名なので除外)を、
マスター(excel)ファイル最後尾に追加していく
  という処理を自動化したいのですが、
outlookマクロで可能でしょうか。

メールの内容を Excel ファイルにかき出すマクロ
決まった件名で終わるメッセージを受信したら、キーワードを含む 1 行を CSV ファイルに保存するマクロ
受信したメールに添付された Excel ファイルをもとに別の Excel ファイルの内容を更新するマクロ
  このあたりを参考にしたのですが、
・最後尾に追加していく
  ・csvから読み込む
  あたりで詰まってしまいました。


まず、最後尾に追加するという処理ですが、通常は 1 列目にデータが格納されていない行を探すという方法で最後尾を見つけることができると考えられます。
次に、CSV ファイルを読み込むという処理ですが、これには以下のような方法が考えられます。

  1. CSV ファイルをテキスト ファイルとして開き、テキスト データを Split 関数などにより加工してデータを取りだす
  2. CSV ファイルを Excel の Workbooks オブジェクトの Open メソッドにより開く

今回は 2 の方法を使って実装してみました。

' ここをトリプルクリックでマクロ全体を選択できます。
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
      MergeCsvToExcel EntryIDCollection
End Sub
'
Private Sub MergeCsvToExcel(ByVal EntryIDCollection As String)
     Const AUTO_SAVE_TITLE = "タイトル" ' 自動処理するメールの件名
     Const CSV_BASE = "c:\temp\update" ' 一時保存する添付ファイル名の接頭語
     Const EXCEL_FILE = "c:\temp\master.xlsx" ' 保存する Excel ファイルの名前
     Dim i As Integer
     Dim myMsg As MailItem
     ' メッセージの取得
     Set myMsg = Session.GetItemFromID(EntryIDCollection)
     ' 指定の件名のメールのみ処理を実行
     If myMsg.Subject = AUTO_SAVE_TITLE Then
         Dim strCsvFile As String
         Dim bookCsv
         Dim bookMaster
         Dim objSheet
         Dim r As Integer
         Dim rowDest
         ' 添付ファイルがなければ処理を中断
         If myMsg.Attachments.Count = 0 Then
             Exit Sub
         End If
         ' 添付ファイルを保存するための一時ファイル名を作成
         strCsvFile = CSV_BASE & Timer() & ".csv"
         ' 添付ファイルを保存
         myMsg.Attachments.Item(1).SaveAsFile strCsvFile
         ' Excel ファイルを開く
         Set bookMaster = GetObject(EXCEL_FILE)
         bookMaster.windows(1).Activate
         Set objSheet = bookMaster.Sheets(1)
         ' 1 行目はタイトルとして使用し、2 行目からデータ
         r = 2
         ' データがない行 (= 末尾) まで移動
         While objSheet.Cells(r, 1) <> ""
             r = r + 1
         Wend
         ' ファイル末尾をコピー先として取得
         Set rowDest = objSheet.Rows(r)
         ' CSV ファイルを Excel で開く
         Set bookCsv = bookMaster.Application.Workbooks.Open(strCsvFile)
         ' CSV ファイルの 2 行目を Excel ファイルに転記
         bookCsv.Sheets(1).Rows(2).Copy rowDest
         ' Csv ファイルを閉じる
         bookCsv.Close False
         ' Excel ファイルを閉じる
         bookMaster.Close True
         ' 一時保存した CSV ファイルを削除
         Kill strCsvFile
     End If
End Sub

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

コメントを残す

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

WordPress.com ロゴ

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

Google フォト

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

Twitter 画像

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

Facebook の写真

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

%s と連携中