Outlook VBA에서 정형 항목 알림 메일 자동 전기

지루한 일은 VBA에 가자.



Outlook에서도 Excel과 마찬가지로 VBA를 사용할 수 있습니다. 편리하지만 Excel과 비교하면별로 알려져 있지 않기 때문에 조금이라도 퍼지면.
또한 본 코드는 Outlook2013, 2010에서 동작을 확인하고 있습니다.

정형 항목의 통지 메일을 다른 파일에 자동 전기





신청하거나 장애의 통지 메일이라든지, 수동으로 전기하는 것은 지루하지 않기 때문에 VBA에 했습니다.
다음 코드는 아래에 적용되어야 합니다.
  • 항목명과 데이터가 1행인 것(개행을 넘지 않는다)
  • 1 메일 당, 1 내용인 것

  • 코드


  • 코드 상단의 상수를 수정하기 만하면됩니다.
  • 메일 항목 수인 itemArray의 요소 수를 늘렸다고해서 코드를 수정할 필요가 없습니다.
  • 게시 대상 파일이 다른 응용 프로그램에서 사용중인 경우 동일한 폴더에 별도의 파일을 만들고 씁니다.
    Const MAIL_TITLE As String = "【AAシステム】申請連絡"   '対象とするメールの件名
    Const FILE_NAME As String = "XXシステム管理表.csv"      '管理表の名前
    Const FILE_NAME_TEMP As String = "_XXシステム申請.csv"  '管理表が開かれているときに書き込むファイル名
    Const FILE_PATH As String = "d:\temp\"                  '管理表のパス
    Const itemArray As String = "申請番号:,申請区分:,コード:,名前:" '項目。splitで分割するため、区切りの為の半角SPは入れない
    Const MSG_ERR_NUMBER = "エラー番号:"
    Const MSG_ERR_DESCRIPTION = "エラー種類:"
    
    
    'メール受信時に発生するイベント
    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    
        Dim myMsg As Object
        Set myMsg = Session.GetItemFromID(EntryIDCollection)
    
        '全てのメール受信時に発生する為、管理しやすいよう関数の呼び出しに留める
        Call MainExportXXsystemToCSV(myMsg)    'メールの任意の項目を自動転記する
    
        Set myMsg = Nothing
    End Sub
    
    
    'メールの任意の項目を自動転記する関数
    Private Function MainExportXXsystemToCSV(ByRef myMsg As Object)
    
        On Error GoTo EXPORT_ERR
    
        Dim itemXXsystem() As String
        itemXXsystem = Split(itemArray, ",")   '管理表の項目を設定
    
        '対象の件名に対し処理を行う
        If myMsg.Subject Like MAIL_TITLE Then
    
            Dim wkData() As String
            wkData = FetchItemByMailBody(myMsg.Body, itemXXsystem())    'メール本文からデータを抜き出す
    
            Dim i As Long
            Dim wkstr As String
            wkstr = myMsg.ReceivedTime & ","    '先頭の項目を受信日時とする
            For i = 0 To UBound(wkData)        ' データをまとめる
                wkstr = wkstr & wkData(i) & ","
            Next
    
            Dim dstfile As String        ' ファイルに書き込む
            If IsFileOpen(FILE_PATH & FILE_NAME) = False Then
                Dim strrnd As String
                Randomize
                strrnd = "_" & Format((Int(1000 * Rnd)), "0000")    'キーとなる項目が重複しても、ファイル名が重複しないように。
    
                dstfile = FILE_PATH & wkData(0) & strrnd & FILE_NAME_TEMP
            Else
                dstfile = FILE_PATH & FILE_NAME
            End If
    
            Dim fnum As Integer
            fnum = FreeFile
    
            Open dstfile For Append As fnum
            Print #fnum, wkstr
            Close #fnum
    
        End If
        Exit Function
    
    EXPORT_ERR:
        MsgBox MSG_ERR_NUMBER & Err.Number & vbCrLf & _
               MSG_ERR_DESCRIPTION & Err.Description, vbExclamation
    
    End Function
    
    
    'メール本文から指定項目のデータを取得する関数
    Private Function FetchItemByMailBody(ByVal strBody As String, ByRef itemXXsystem() As String) As String()
    
        Dim stritem() As String
        Dim max As Long
    
        max = UBound(itemXXsystem)
        ReDim stritem(max)   '取得した項目を格納する
    
        Dim i As Long
        Dim sline As Long
        Dim eline As Long
        Dim strline As String
    
        For i = 0 To max
            sline = InStr(strBody, itemXXsystem(i))                     '取得したい項目の開始位置
    
            If sline > 0 Then
                strline = Mid(strBody, sline + Len(itemXXsystem(i)))    '取得したい項目の先頭から最後までを取得
                eline = InStr(strline, vbCrLf)                          '取得したい項目の最後尾(改行)の位置を取得
                stritem(i) = Left(strline, eline - 1)                   '-1により改行分を削除
            Else
                stritem(i) = ""
            End If
        Next
    
        FetchItemByMailBody = stritem()
    
    End Function
    
    
    ' ファイルがすでに開かれているか確認する関数
    Private Function IsFileOpen(ByVal dst_file As String) As Boolean
        On Error GoTo FILE_ERR
    
        Dim fnum As Integer
        fnum = FreeFile
    
        Open dst_file For Binary Access Read Lock Read As #fnum
        Close #fnum
        IsFileOpen = True
    
        Exit Function
    
    FILE_ERR:
        IsFileOpen = False
    
    End Function
    

    비고



    실제 운용에서는 전기처의 파일(=관리표)에 플래그를 추가해 실시 미실시를 관리합니다.

    대상으로 하는 메일의 조건에, 주제 뿐만이 아니라 송신원도 추가하는 것으로 보다 견고해질지도.
    또, 에러의 메세지 박스를 표시했을 때, 처리를 멈추지 않게 하는 편이 좋은가 어떤가. 응답 불필요한 메시지 박스를 구현한다면 VBA의 MsgBox에서는 할 수 없는 것 같습니다. 여러가지 조사하면 유저 폼이나 WMI를 사용하면 할 수 있을 것 같다.
  • 좋은 웹페이지 즐겨찾기