前回まででレジストリを編集してOutlookのルール作りの画面でスクリプトを実行する選択項目が表示されるところまでをやりました。次に、MoneyWizで取り込むためのCSVファイルを作成するために、まずカラムを決めておこうと思います。列名ですね。

 

試しに以下のようなCSVファイルを読込ませます。

 

日付,品目,金額,カテゴリ
2018/11/30,ネスカフェ ゴールドブレンド エコ&システムパック,\1350,食料品

 

コンマ区切りの一行目がカラム名として認識され、その中でMoneyWizが持っているカラム名と合致するものが自動的に認識されます。

この例では日付、金額、カテゴリが認識されましたが品目はMoneyWizのなかでは説明として登録されているので合致せずデフォルトではインポートしない設定になってしまいました。多分カラム名を説明に変えれば自動的に認識されます。多分。

 

 

あと、実際に運用すると分かりますがこのままだとどの口座の取引か不明です。財布とかカードとか電子マネーとか、どこからお金を使ったの? という情報が欠けているんですね。

あとカテゴリも既に存在しているカテゴリから逸脱していると手動作業が発生します。メールの文面、あるいは説明から類推できるのであればその辺も整備しておいた方が良いでしょう。

 

ちなみに上に書いたサンプル、取り込んだら財布の残高が増えました。-1350としていなかったからでしょう。

というわけでだいたいやるべき事が見えてきました。

 

  1. 取引内容が記載されたメールを選別して処理対象とする
  2. 1で対象とされたメールの内容を分析して日付、説明、金額、カテゴリ、口座情報を得る。
  3. 2で得た情報を元にCSVファイルを作成する。
1は既にルール作成の時点で達成されていますので、2以降をマクロで作り込んでいく必要があります。
 
 
これは取り込みたいメールの一例です。
 
Public Sub FilteringTest(Item As Outlook.MailItem)
    
    Debug.Print Item.Body
    
End Sub

標準モジュールにこんな感じのプロシージャを書き込みます。
こうしておくと取り込まれたOutlook.MailItem(=各メール)のHTMLタグをあらかた抜いたボディ部分をイミディエイトウィンドウに表示してくれます。
すると
 
注文内容

注文番号: 503-6507396-7751820 <https://www.amazon.co.jp/gp/r.html?C=3FLDZT5JFED36&K=1WJSGBNSCWSCJ&M=urn:rtn:msg:201811231330394c15e3b405504ad7abafb4257ef0p0fe&R=X9WITZK65ZI5&T=C&U=https%3A%2F%2Fwww.amazon.co.jp%2Fgp%2Fcss%2Fsummary%2Fedit.html%3Fie%3DUTF8%26orderID%3D503-6507396-7751820%26ref_%3Dpe_492632_159100282_TE_on&H=6DACGZDKJ1QOTNEFNB09JVQ4DUGA&ref_=pe_492632_159100282_TE_on>  
注文日:2018/11/23  
 <https://www.amazon.co.jp/gp/r.html?C=3FLDZT5JFED36&K=1WJSGBNSCWSCJ&M=urn:rtn:msg:201811231330394c15e3b405504ad7abafb4257ef0p0fe&R=1M1UW3MQ0FQ9F&T=C&U=http%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB0792PG3S9%2Fref%3Dpe_492632_159100282_TE_item_image&H=FXAE9KHXP0YSQP6VVMHRHRSUMTYA&ref_=pe_492632_159100282_TE_item_image>    Echo Dot (エコードット) 第3世代 (Newモデル) - スマートスピーカー with Alexa、チャコール - 2点 <https://www.amazon.co.jp/gp/r.html?C=3FLDZT5JFED36&K=1WJSGBNSCWSCJ&M=urn:rtn:msg:201811231330394c15e3b405504ad7abafb4257ef0p0fe&R=21G71F3E29IKG&T=C&U=http%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB0792PG3S9%2Fref%3Dpe_492632_159100282_TE_item&H=USSUATYRFA05VTMMYVWSVDRSRL8A&ref_=pe_492632_159100282_TE_item>
エレクトロニクス
販売:Amazon Japan G.K.

    <https://www.amazon.co.jp/gp/f.html?C=3FLDZT5JFED36&K=1WJSGBNSCWSCJ&M=urn:rtn:msg:201811231330394c15e3b405504ad7abafb4257ef0p0fe&R=117ZGRWE2LYKP&T=C&U=https%3A%2F%2Fwww.amazon.com%3A443%2Fgp%2Fredirect.html%3F_encoding%3DUTF8%26location%3Dhttps%253A%252F%252Fwww.facebook.com%252Fdialog%252Ffeed%253Fapp_id%253D164734381262%2526caption%253D%2526display%253Dpopup%2526link%253Dhttp%25253A%25252F%25252Fwww.amazon.co.jp%25252Fdp%25252FB0792PG3S9%25252Fref%25253Dcm_sw_r_fa_doce%2526name%253D%2526picture%253Dhttps%25253A%25252F%25252Fimages-na.ssl-images-amazon.com%25252Fimages%25252FI%25252F41MZrRTS8lL._SCLZZZZZZZ__SY115_SX115_.jpg%2526redirect_uri%253Dhttp%25253A%25252F%25252Fwww.amazon.co.jp%25252Fdp%25252FB0792PG3S9%25252Fref%25253Dcm_sw_r_fa_doce%26source%3Dstandards%26token%3DD5EC69B240AF2BD2E283D624E6D1DEB3CD9E2605%26ref_%3Dpe_492632_159100282&H=WAFTZOWLWGWDCAUISYA6VPKMBMOA&ref_=pe_492632_159100282>     <https://www.amazon.co.jp/gp/f.html?C=3FLDZT5JFED36&K=1WJSGBNSCWSCJ&M=urn:rtn:msg:201811231330394c15e3b
405504ad7abafb4257ef0p0fe&R=3MK7NJBWY16LJ&T=C&U=https%3A%2F%2Fwww.amazon.com%3A443%2Fgp%2Fredirect.html%3F_encoding%3DUTF8%26location%3Dhttps%253A%252F%252Ftwitter.com%252Fshare%253Fcount%253Dnone%2526original_referer%253Dhttp%25253A%25252F%25252Fwww.amazon.co.jp%25252Fdp%25252FB0792PG3S9%25252Fref%25253Dcm_sw_r_tw_doce%2526related%253Damazon%25252Camazondeals%25252Camazonmp3%2526text%253D%2526url%253Dhttp%25253A%25252F%25252Fwww.amazon.co.jp%25252Fdp%25252FB0792PG3S9%25252Fref%25253Dcm_sw_r_tw_doce%2526via%253Damazon%26source%3Dstandards%26token%3D98D0A180D8352AD0106E78922A9FA3BF14CB7A37%26ref_%3Dpe_492632_159100282&H=YZK0MFJP4BNJSGATTV4RYK1JRYOA&ref_=pe_492632_159100282>   <https://www.amazon.co.jp/gp/f.html?C=3FLDZT5JFED36&K=1WJSGBNSCWSCJ&M=urn:rtn:msg:201811231330394c15e3b405504ad7abafb4257ef0p0fe&R=BA768UOJ2JL7&T=C&U=https%3A%2F%2Fwww.amazon.com%3A443%2Fgp%2Fredirect.html%3F_encoding%3DUTF8%26location%3Dhttps%253A%252F%252Fpinterest.com%252Fpin%252Fcreate%252Fbutton%252F%253Fdescription%253D%25252C%2525
20http%25253A%25252F%25252Fwww.amazon.co.jp%25252Fdp%25252FB0792PG3S9%25252Fref%25253Dcm_sw_r_pi_doce%2526is_video%253Dfalse%2526media%253Dhttps%25253A%25252F%25252Fimages-na.ssl-images-amazon.com%25252Fimages%25252FI%25252F41MZrRTS8lL._SCLZZZZZZZ__SY115_SX115_.jpg%2526title%253D%2526url%253Dhttp%25253A%25252F%25252Fwww.amazon.co.jp%25252Fdp%25252FB0792PG3S9%25252Fref%25253Dcm_sw_r_pi_doce%26source%3Dstandards%26token%3D66F440C4FE2A44A8699AC34842839E4EC556FC25%26ref_%3Dpe_492632_159100282&H=ABAETYFCQQUKH2Q1GIAGT0MTTGGA&ref_=pe_492632_159100282>  
¥ 5,980
    
    
商品の小計:    ¥ 11,960   
配送料・手数料:    ¥ 0    
割引:  -¥ 6,460   

注文合計:  ¥ 5,500    

支払い方法      
クレジットカード(Amazon MasterCard クラシック):   ¥ 5,500
 
こんな感じになりました。少なくともVBAからはこのメールがこんな風に見える、ということですね。
ここから分かるのは、
  1. 必要な情報は注文内容という文字列の後を見れば分かる
  2. 日付は注文日のあとのyyyy/mm/dd書式の日付を当たればOK。
  3. 商品名(説明)は日付のあとのタグに囲まれた部分
  4. 実際に支払う金額は支払方法の後の\マークのうしろの金額。口座はその前のクレジットカードなんちゃら部分で認識させる。
ということです。この辺はAmazonが発信するメールの書式が変わると変更する必要が出てきますけれども、ひとまずこれに合わせて作り込むことにしましょう。
 
 
正規表現で文字列を処理したいのでMicrosoft VBScript Regular Expressions 5.5(または1.0)にチェックを入れます。
 
しかし作っている最中に気付いたんですが、注文商品が複数であった場合商品名の横に各商品の金額がきます。
そしてポイント利用などで値引きした金額が最後に支払額として計上されます。
なので、商品の金額=支払額ではないんですよね。ややこしい。
クレジットカードの明細にはその時の取引の合計金額が(当然ながら)計上されます。するとこれを無理矢理単一の取引として処理しようとすると、少なくともカテゴリ設定は複数カテゴリを含む取引の書式にしなくてはならない。
説明も可読性が低くなる。これは厄介です。
なので、商品と値引き額をわけて考えることにします。
 
とりあえず現在作りかけのプロシージャを貼り付けます。ではまた次回
(もちろんまだ動きません)
 

Public Sub Expense_Amazon(Item As Outlook.MailItem)
    Dim Line() As String
    Dim i, j As Long
    Dim delimiter As String
    Dim pos_delimiter As Long
    Dim uDate As Date
    Dim uDesc As String
    Dim uCategory As String
    Dim uPrice As Long
    
    
    Dim re As RegExp
    
    
        
    
    Line = Split(Item.Body, vbCrLf)
    
    For i = 0 To UBound(Line) - 1
        Line(i) = Trim(Line(i))

        ' 注文日の取得
        If InStr(Line(i), "注文日:") = 1 Then
            delimiter = ":"
            pos_delimiter = InStr(Line(i), delimiter)
            uDate = Mid(Line(i), pos_delimiter + 1)
            Exit For
        End If
                    
    Next
    
    
    Set re = New RegExp
    re.Pattern = "<https([^>]*)>[^<>]<https([^>]*)>"
    
    ' 各商品の情報を取得する。
    For i = i + 1 To UBound(Line) - 1
            
            If re.Test(Line(i)) Then
                
                ' 注文日の次の行が商品名を含んでいるので、こちらもついでに処理する
                re.Pattern = "<https([^>]*)>"
                re.Global = True
                            
                uDesc = re.Replace(Line(i), "")
                
                ' 更に次の行がカテゴリを含んでいる場合があるのでそれも処理。
                i = i + 1
                If InStr(Line(i), "販売") = 0 Then
                    Select Case Line(i)
                        Case "エレクトロニクス"
                            uCategory = "家庭>家電"
                        ' よく分からなければ文字列をそのまま入れる
                        Case Else
                            uCategory = Line(i)
                    End Select
                
                End If
                
                ' この後の5行以内に\マークから始まる各品目の金額が入るはず
                For j = i To j + 5
                    If InStr(Line(j), "¥") = 1 Then
                        uPrice = CLng(Mid(Line(j), 3))
                        uPrice = uPrice * -1
                        i = j
                        Exit For
                    End If
                Next
                
                
                
            End If
        
    Next
    

    
End Sub