家計簿 Amazon領収書の取込みプログラム

プログラミング

Amazon領収書のWebデータをExcelの表に取り込むプログラムを作成しました。
取り込むデータは、注文No、注文日、アイテム名、数量、単価です。
開発言語はExcel VBAです。

2年ほど前、Accessデータベースにレシートを全て手入力で登録していましたが、3か月で挫折しました。止めた理由は、当然ながら、入力作業が大変だからです。
そもそも、レシートの登録を始めたのは、家計の支出の明細を登録して、何にどれくらい支出しているのか実態を把握し、無駄な部分の改善に役立てたい、という理由でした。
その後、レシートの合計金額だけの登録に変更しましたが、それでも登録作業は作業量的にも心理的にも負担が大きく、これもほどなく断念しました。
今は、クレジット利用のデータだけを登録しています。
クレジットデータはクレジット会社がCSV形式で利用明細を提供しているので、入力の手間がかかりません。

食費は主に現金支払いですが、
科目でいうと通信費、家電用品、園芸用品、修繕費のほとんどがクレジット利用です。
食費はほぼ現金支払いなので、明細の取得は行っていません。食費の明細に関しては目をつむっています。

さて、クレジットデータはクレジット会社がCSV形式で利用明細を提供してくれるのですが、データが不足しています。
購入先の合算金額でまとめられているため、アイテムの明細の記載がないのです。
そのため、CSV形式のデータをもとに、アイテム明細を調べて、手入力していました。

クレジット利用は、大きく実店舗利用とネット利用に分かれます。
私のクレジット利用金額は、2023年で約300,000円です。
その内、Amazonで利用した金額が約95,000円です。
クレジット利用の約32%をAmazonで利用しています。
今回、このAmazonの利用明細をAmazon領収書から自動的に取得するプログラムを作成しました。

参考までに科目別のクレジット利用の割合のグラフを示します。
食費15%の内訳は、主にMikoのためにフラクトオリゴ糖を定期的にネット購入している分です。

Amazon領収書のWebデータをExcelの表に取り込むプログラムで、Amazon利用だけでも、アイテム明細を調べたり、手入力する手間を省くことができるようになりました。

Excelに取り込む手順は以下のとおりです。

Amazonの注文確認メールを開き、[配送状況を確認する]ボタンをクリックします。

注文明細の[領収書等]>[領収書/購入明細書]を選択します。

領収書全体を選択しコピーします。

Amazon領収書取込.xlmsを開き、Amazon領収書シートに貼り付けます。

開発タブ>Vsisual Basic>でVBAシートを開き、フォーム>Amazonを選択します。

実行>Subユーザーフォームの実行を選択します。

取込開始ボタンをクリックします。

「抽出結果を追加してセットしますか?」に[はい]を応答すると、既にセットされている最終行の次の行から追加します。
[いいえ]をクリックするとセットされているデータを消去して、先頭行(2行目)からセットします。

以上の操作で、ExcelシートにAmazon領収書データを取り込みます。
画面例は注文アイテムが1アイテムですが、複数アイテムの領収書データも取り込めることは確認済みです。
Excelフォームの自動表示は、今はしていませんが、少し使ってみてから自動表示化します。

ここで取り込んだデータは、家計簿管理(AccessとExcel)の方へ、コピー/貼り付けをして使用します。

Excel VBAは、Excel操作に慣れている人であれば、比較的簡単に作成できます。

プログラムコードを以下に示します。

Private Sub RetriveButton1_Click()
    Dim i
    Dim PDate As String                                 ‘注文日の1行分のデータ
    Dim strDate As String                               ‘注文日を yyyy/mm/dd の形式にした文字列
    Dim OrderDate As Date                               ‘注文日を Date形式にしたもの
    Dim PNo As String                                   ‘注文番号
    Dim MeisaiFlg As Boolean                            ‘明細行の開始フラグ
    Dim Item(99) As String                              ‘商品アイテム名  Max100アイテム分
    Dim suu(99) As Integer                              ‘数量
    Dim Price(99) As Integer                            ‘単価
    Dim j As Integer                                    ‘抽出データ数
      
   
    ‘/*****************************************************
    ‘/*  新規抽出 or 追加抽出 か確認
    ‘/*    新規抽出の場合、既存データクリア
    ‘/*****************************************************
    Dim xlLastRow As Long                               ‘Excel自体の最終行
    Dim LastRow As Long                                 ‘最終行
    Dim answer As Integer
   
    answer = MsgBox(“抽出結果を追加してセットしますか?”, vbQuestion + vbYesNo + vbDefaultButton2, “追加・新規の確認”)
   
    If answer = vbNo Then
   
         Sheets(“抽出データ”).Select
        xlLastRow = Cells(Rows.Count, 1).Row                ‘Excelの最終行を取得
        LastRow = Cells(xlLastRow, 1).End(xlUp).Row         ‘A列の最終行を取得
 
        Range(Cells(2, 1), Cells(LastRow, 13)).Clear    ‘データクリア
   
    End If
   
    ‘/*****************************************************
    ‘/*  アマゾン領収書に貼り付けた領収書データを抽出します
    ‘/*****************************************************
    Sheets(“アマゾン領収書”).Select
    Range(“A1”).Select
   
    MeisaiFlg = False
    j = 0
   
    For i = 1 To 100
        If Mid(Cells(i, 1), 1, 4) = “注文日:” Then
            PDate = MidB(Cells(i, 1), 11, 256)
            strDate = Mid(PDate, 1, 4) & “/” & Mid(PDate, InStr(PDate, “年”) + 1, InStr(PDate, “月”) – InStr(PDate, “年”) – 1) & “/” & Mid(PDate, InStr(PDate, “月”) + 1, InStr(PDate, “日”) – InStr(PDate, “月”) – 1)
          
            OrderDate = CDate(strDate)
       
        End If
       
        If Mid(Cells(i, 1), 1, 17) = “Amazon.co.jp 注文番号” Then
       
            PNo = Mid(Cells(i, 1), 20, 256)
       
        End If
       
       
        If Cells(i, 1) = “注文商品” Then
            MeisaiFlg = True
            GoTo Continue
        End If
               
       
        If MeisaiFlg Then
       
            MeisaiFlg = False
           
            suu(j) = Mid(Cells(i, 1), 1, InStr(Cells(i, 1), “点”) – 2)
            Item(j) = Mid(Cells(i, 1), InStr(Cells(i, 1), “点”) + 2, 256)
           
           
            If Cells(i, 2) = “” Then
                Price(j) = Cells(i, 3)
            Else
                Price(j) = Cells(i, 2)
            End If
           
           
            j = j + 1
       
        End If
       
Continue:
    Next i
 
    ‘/*****************************************************
    ‘/*  抽出したデータを抽出データシートにセットします
    ‘/*****************************************************
   
    Sheets(“抽出データ”).Select
   
      
    xlLastRow = Cells(Rows.Count, 1).Row                ‘Excelの最終行を取得
    LastRow = Cells(xlLastRow, 1).End(xlUp).Row         ‘A列の最終行を取得
   
   
    For i = 0 To j – 1
   
       Cells(i + LastRow + 1, 1) = OrderDate            ‘注文日
       Cells(i + LastRow + 1, 4) = 4                    ‘税区分 4:内税(10%)
       Cells(i + LastRow + 1, 6) = suu(i)               ‘注文数量
       Cells(i + LastRow + 1, 7) = Price(i)             ‘単価
       Cells(i + LastRow + 1, 8) = Item(i)              ‘商品名
       Cells(i + LastRow + 1, 9) = Price(i) * suu(i)    ‘金額
       Cells(i + LastRow + 1, 10) = 3                   ‘支払区分 3:楽天(クレ)
       Cells(i + LastRow + 1, 12) = “AMAZON.CO.JP”      ‘備考
       Cells(i + LastRow + 1, 13) = PNo                 ‘注文番号
       
    Next i
 
End Sub


追記
職業訓練校の講師だったときの生徒に30代なかばの小野さんという方(男性)がいました。
訓練のコースはJavaプログラミングでした。
しかし、その方は、よく私に、Excel VBAで仕事を合理化、効率化できるはずなので、そうした仕事に就くにはどうゆう方面へ就職活動すればよいか、尋ねてきました。
職場ごとにかかえている特有の業務課題の解決のために、Excel VBAのプログラムは有効であるし、その技術を持った人に活躍する場があることを話しました。
また、作るだけではなく、作ったプログラムのマニュアル化、使い方を教えること、プログラムのメンテナンスなどを特定の個人が負うのではなく職場としてできるようにすること、などの課題についても話しました。
今回、Excel VBAで作ってみて、システム規模としては小さくても、職場独自の課題解決に有効なツールであることを、再認識しました。
小野さんは6カ月の訓練期間を待たずに、4ヵ月目に、希望の職種に就職が決まりました。
プログラム作成中、時々、小野さんのことを思い出しました。

タイトルとURLをコピーしました