amazonの購入履歴をエクセルでダウンロードするVBAマクロ


預金入出金やクレジットカード明細の自動記帳エクセルマクロを作っているのですが、そこでネックになりそうなのが、Amazonからの購入。
Amazonでは様々なものを購入できるため、Amazonからの購入頻度が多い場合には、自動記帳をしようと思っても限界があります。

マネーフォワードを使うとamazonの購入履歴をダウンロードできるらしい、というので、それなら、エクセルVBAマクロでもAmazonの購入履歴をダウンロードできるだとう、ということで作ってみました。

Amazon購入履歴ダウンロード-エクセルVBAマクロ

下記から、エクセルマクロをダウンロードしてください。
Amazon購入履歴ダウンロードマクロをダウンロードする

あらかじめInternet ExplorerでAmazonにログインしている状態で、「amazon購入履歴取得」というマクロを実行してください。

マクロをそのまま使うと、次のように2016年の購入履歴がエクセルにダウンロードできます。

amazonkounyuurireki_1_1

他の年度の購入履歴をダウンロードしたい場合には、
マクロ内部の「FS = "year-2016"」の部分の「2016」を2015とか2014とかに変えてください。
過去の分もダウンロードできます。

動作の仕組み・注意事項

Amazonの購入履歴画面のHTMLを取得して、該当する部分を抜き出しています。

具体的には、購入履歴画面のHTMLが、次のような作りになっています。

<div class="order">
  <span class="value">注文日</span>
  <div class="shipment">
    <div class="a-fixed-left-grid-inner">
      <span class="item-view-qty">数量</span>
      <a class="a-link-normal">商品名</a>
      <span class="a-color-price">単価</span>
    </div>
  </div>
</div>

そこで、テキストデータを解析して、該当部分を抽出しています。

※ギフトカードなど出荷が伴わないものについては、構造が違うので個別対応しています。ただ、全形態を試したわけではないので、あらゆるデータをダウンロードできるかはわかりません。

このように、現在の画面表示の仕方にあわせてマクロを組んでいますので、Amazonの購入履歴の画面表示の仕方が変わると、データ抽出の方法も変わってしまいます。
当然、画面表示が変わると、今回のマクロは使えなくなります。

また、テキトーに作ったものなので、完璧に動作するか保障はできません。
購入履歴のダウンロード後は、きちんともれなくダウンロードできているか、自力で確認を入れてください。

VBAマクロソースコード

今回のソースコードも念のため、貼っておきます。

2018年2月28日追記:
下記ソースコードでは正常に動作しない場合があるとのことで、風柳さんが修正版のソースコードを作成してくれました。

下記にリンクを貼っておきますので、修正版もお試しください。
github furyutei/amazonrireki_macro

※VBAのメニューで「ツール」→「参照設定」より「Microsoft VBScript Regular Expressions 5.5」を選択しておく必要があります。

以下、修正前のソースです。

Option Explicit

Const URL As String = "https://www.amazon.co.jp/gp/css/order-history/ref=oss_pagination?ie=UTF8&search=&orderFilter="

Public Sub amazon購入履歴取得()
  Dim FS As String
  FS = "year-2016"
'  FS = "months-6"
  
  Dim IE As Object
    
  Dim objShell As Object
  Dim objWin As Object
  
  Set objShell = CreateObject("shell.application")
  For Each objWin In objShell.Windows
    If objWin.Name = "Internet Explorer" Then
      Set IE = objWin
      Exit For
    End If
  Next
  
  If IE Is Nothing Then
    Set IE = CreateObject("InternetExplorer.Application")
  End If

'  ie.Visible = True
  Call IE.Navigate2(URL & FS, &H800, "amazon_get_purchaserecords")

  Application.Wait [Now() + "00:00:05"]

'新規作成したタブを取得
  Dim IE2 As Object
  Dim IE2_Exist As Boolean
  IE2_Exist = False
  
  For Each objWin In objShell.Windows
    If objWin.Name = "Internet Explorer" Then
      Set IE2 = objWin
      If IE2.LocationURL = URL & FS Then
        IE2_Exist = True
        Exit For
      ElseIf IE2.LocationURL Like "*www.amazon.co.jp/ap/signin*" Then
        MsgBox "ログイン後に再度起動してください。プログラムを終了します。"
        End
      End If
    End If
  Next

  If IE2_Exist = False Then
    MsgBox "開いたタブが見つかりませんでした。中止します"
    End
  End If
  
  Do While IE2.Busy = True Or IE2.readyState <> 4
    DoEvents
  Loop


' 結果出力
  Dim Doc As String
  Doc = IE2.Document.body.innerHTML

'件数取得
  Dim OrderCount As String
  OrderCount = IE2.Document.getElementsByClassName("num-orders")(0).innerHTML
  OrderCount = Left(OrderCount, Len(OrderCount) - 1)

  Dim Data(1 To 5) As Variant
'暫定
'1:日付、2:数量、3:単価、4:金額、5:内容


  Dim DocOrder As Variant
  Dim DocShipment As Variant
  Dim DocItemView As Variant
  Dim Page As Long
  Dim I1 As Long
  Dim I2 As Long
  Dim I3 As Long
  Dim I2Items As Long
  
  Dim I3Items As Long
  Dim OrderDate As Variant
  Dim R As Long
  R = 2
  
  Worksheets.Add
  ActiveSheet.Cells(1, 1) = "注文日"
  ActiveSheet.Cells(1, 2) = "数量"
  ActiveSheet.Cells(1, 3) = "単価"
  ActiveSheet.Cells(1, 4) = "金額"
  ActiveSheet.Cells(1, 5) = "内容"
  
  
  
  For Page = 0 To OrderCount - 1 Step 10
   If Page > 0 Then
     Call IE2.Navigate(URL & FS & "&startIndex=" & Page)
     Do While IE2.Busy = True Or IE2.readyState <> 4
       DoEvents
     Loop
   End If
   
   For I1 = 0 To IE2.Document.getElementsByClassName("order").Length - 1
    Set DocOrder = IE2.Document.getElementsByClassName("order")
  
'注文日取得
    OrderDate = DocOrder(I1).getElementsByClassName("value")(0).innerHTML
  
  
'ギフトカードはshipmentがないため別タグを取得
    I2Items = DocOrder(I1).getElementsByClassName("shipment").Length - 1
    If I2Items > 0 Then
      Set DocShipment = DocOrder(I1).getElementsByClassName("shipment")
    Else
      I2Items = DocOrder(I1).getElementsByClassName("a-fixed-right-grid-inner").Length - 1
      Set DocShipment = DocOrder(I1).getElementsByClassName("a-fixed-right-grid-inner")
    End If
    
    For I2 = 0 To I2Items
'数量取得
      Set DocItemView = DocShipment(I2).getElementsByClassName("a-fixed-left-grid-inner")
      I3Items = DocItemView.Length
      
      For I3 = 0 To I3Items - 1
       With DocItemView(I3)
        Data(1) = CDate(OrderDate)
        If .getElementsByClassName("item-view-qty").Length >= 1 Then
          Data(2) = CDbl(.getElementsByClassName("item-view-qty")(0).innerHTML)
        Else
          Data(2) = 1
        End If
        
        If .getElementsByClassName("a-color-price").Length >= 1 Then
          Data(3) = CDbl(.getElementsByClassName("a-color-price")(0).innerHTML)
        Else
'ギフトカードは価格のタグが違う
          Data(3) = CDbl(.getElementsByClassName("gift-card-instance")(0) _
                     .getElementsByClassName("a-span2")(0).innerHTML)
        End If
        
        Data(4) = Data(2) * Data(3)
        Data(5) = Replace(Replace(Replace(Trim(.getElementsByClassName("a-link-normal")(1).innerHTML), " ", ""), Chr(13), ""), Chr(10), "")
        ActiveSheet.Range(ActiveSheet.Cells(R, 1), ActiveSheet.Cells(R, 5)) = Data
      
        R = R + 1
       End With
      Next
    Next
   Next
  Next

  Set IE = Nothing

'  IE2.Quit
  Set IE2 = Nothing
  
End Sub

※2018/2/16 ソースコードを一部修正

エクセル基礎講座 「無料」動画マニュアル

「経理事務のためのエクセル基礎講座(初級編)」(動画マニュアル 総収録時間162分)を無料プレゼント中です!

このマニュアルで解説していることを一通り学べば、経理事務を行う上で最低限必要となる知識が得られます。

ご登録者の方には、合わせて、公認会計士が実体験を通して身に付けたエクセルを使う技をメールにてお伝えしていきます!

無料動画講座 登録フォーム

※ご登録頂いたメールアドレスに、エクセルを使いこなすための情報を配信するメールセミナー「エクセル倍速講座」も合わせて配信させていただきます。