エクセルマクロ(VBA)で証券価額をwebスクレイピングするツール

増やす

複数の証券会社で資産を管理していることにより、現在のアセットアロケーションの把握が煩雑化・困難化している方、多いのではないかと思います。

私は、エクセルマクロ(VBA)で複数の証券会社からWEBスクレイピングをすることで、現在の運用資産価額の総額を把握し、運用方針検討の一助としています。

WEBスクレイピングとは、WEBサイトからデータを収集するコンピューター技術のことです。

本記事では、当該 エクセルマクロ(VBA) について、シェアします。

スクレイピングの対象サイト

スクレイピングの対象サイトは以下です。

  • SBI証券/投資信託トータルリターン サマリー
  • SBI証券/個別銘柄分析データ
  • SBIベネフィット・システムズ(確定拠出年金)
  • SBIネオモバイル証券/特定口座損益明細
  • SBIネオモバイル証券/口座管理(ポートフォリオ)
  • 野村証券/預り資産
  • 野村証券/特定口座譲渡益税履歴
  • 持株WEBサービス(野村証券)
  • NRK(確定拠出年金)
  • 楽天証券(未成年総合)/トータルリターン(投資信託)
  • 楽天証券(ジュニアNISA)/トータルリターン(投資信託)
  • 楽天証券/トータルリターン(投資信託)
  • 楽天証券/保有商品一覧
  • 楽天証券/配当・分配金/すべて
  • CAPEレシオ(シラーPER)

マクロ入りのエクセルブック

マクロ入りのエクセルブックは以下の通り

集計結果は以下のように表示されます。

グラフで、各種証券会社に置いた資産総計のアセットアロケーションを把握します。

マクロの紹介

マクロの初期設定

まず、初期設定が必要です。

まず、以下記事を参考に、Seleniumの設定をします。

マクロコード全文紹介

メインのマクロコードは以下の通り。

個別機能の紹介・解説は次項を参照ください。

Public driver As New ChromeDriver

Public ks As New keys

Public sTmp As String


Sub データ取得(USER_ID_1 As String, USER_PAS1 As String _
    , USER_ID_2 As String, USER_PAS2 As String _
    , USER_ID_3 As String, USER_PAS3 As String _
    , USER_ID_4 As String, USER_PAS4 As String, USER_ID_5 As String _
    , USER_ID_6 As String, USER_PAS6 As String _
    , USER_ID_7 As String, USER_PAS7 As String _
    , USER_ID_8 As String, USER_PAS8 As String _
    , USER_ID_9 As String, USER_PAS9 As String _
    , USER_ID_10 As String, USER_PAS10 As String _
    , USER_ID_11 As String, USER_PAS11 As String _
    , Path As String _
    , PROFILE_PATH As String)


    Workbooks("運用資産価額管理.xlsm").Activate

    Application.ScreenUpdating = False


    driver.AddArgument ("user-data-dir=" & PROFILE_PATH)


    'ネオモバイル


            driver.Get "https://trade.sbineomobile.co.jp/login"
            driver.Window.Maximize
            driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/form/section[1]/div/div[1]/input").SendKeys USER_ID_3
            driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/form/section[1]/div/div[2]/input").SendKeys USER_PAS3
            driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/form/section[2]/button").Click
            
            driver.Get "https://trade.sbineomobile.co.jp/trade/domestic/tradeHistory/capitalGainTaxDetail"
            
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[1]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L2") = 0
            Else
                Sheets("個別履歴").Range("L2") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[1]/td/span").Text * -1
            End If
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[2]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L3") = 0
            Else
                Sheets("個別履歴").Range("L3") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[2]/td/span").Text
            End If
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[1]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L4") = 0
            Else
                Sheets("個別履歴").Range("L4") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[1]/td/span").Text * -1
            End If

'            driver.ExecuteScript "document.body.style.zoom= '80%';"
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[2]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L5") = 0
            Else
                Sheets("個別履歴").Range("L5") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[2]/td/span").Text
            End If


            driver.Get "https://trade.sbineomobile.co.jp/account/portfolio"

            For i = 1 To 20
            
                On Error GoTo ERR14
                driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[3]/section/button").Click
                
                Application.Wait Now + TimeSerial(0, 0, 2)
                
            Next i

14:
            On Error GoTo 0

'            driver.ExecuteScript "document.body.style.zoom= '80%';"

            Sheets("ネオモバ一覧").Select
            Columns("A:D").Select
            Selection.Clear
            
            Columns(1).NumberFormatLocal = "@"

            Sheets("ネオモバ一覧").Cells(2, 3) = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[4]/ul/li[1]/p[2]/span").Text

            Application.Calculation = xlCalculationManual
            For i = 1 To driver.FindElementsByClass("name").Count
          
                Sheets("ネオモバ一覧").Cells(i + 2, 1) = Format(driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[1]/div[2]/p").Text, "@")
                Sheets("ネオモバ一覧").Cells(i + 2, 2) = Format(driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[1]/div[2]/h4/a").Text, "@")
                If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[2]/div[1]/span").Text = "--" Then
                    Sheets("ネオモバ一覧").Cells(i + 3, 3) = 0
                Else
                    Sheets("ネオモバ一覧").Cells(i + 2, 3) = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[2]/div[1]/span").Text
                End If
                Sheets("ネオモバ一覧").Cells(i + 2, 4) = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[2]/div[2]/span").Text
          
            Next i
            Application.Calculation = xlCalculationAutomatic

        
            ActiveWorkbook.Worksheets("ネオモバサマリ").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("ネオモバサマリ").Sort.SortFields.Add Key:=Range("L1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets("ネオモバサマリ").Sort
                .SetRange Range(Cells(1, 1), Cells(18, 20))
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        
        
            If ActiveWorkbook.Worksheets("銘柄データ").FilterMode = True Then
        
                ActiveWorkbook.Worksheets("銘柄データ").ShowAllData
            Else
                ActiveWorkbook.Worksheets("銘柄データ").Rows(1).AutoFilter
            
            End If
        
        
            ActiveWorkbook.Worksheets("銘柄データ").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("銘柄データ").Sort.SortFields.Add Key:=Range("I1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            ActiveWorkbook.Worksheets("銘柄データ").Sort.SortFields.Add Key:=Range("E1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets("銘柄データ").Sort
                .SetRange Range(Cells(1, 1), Cells(Sheets("銘柄データ").Cells(Rows.Count, 1).End(xlUp).Row, 300))
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            
        
            ActiveWorkbook.Worksheets("銘柄データ").Rows(1).AutoFilter Field:=8, Criteria1:="<>#VALUE!", Operator:=xlFilterValues


    'SBI証券 夫

        driver.Get "https://www.sbisec.co.jp/ETGate"

        driver.FindElementByXPath("//*[@id='user_input']/input").SendKeys USER_ID_1
        driver.FindElementByXPath("//*[@id='password_input']/input").SendKeys USER_PAS1
        Application.Wait Now + TimeSerial(0, 0, 2)
        driver.FindElementByXPath("/html/body/table/tbody/tr[1]/td[2]/div[2]/form/p[2]/input").Click
        
        
        For i = 2 To Sheets("銘柄データ").Cells(Rows.Count, 1).End(xlUp).Row
   
            sTmp = Sheets("銘柄データ").Cells(i, 1)
    
'            driver.Get "https://graph.sbisec.co.jp/sbiscreener/analysis?token=2B181B14A7224B9D9FC1FBFFB8CFF2ABE2618889CB68E2C5501CACB8168EA21C2D22FB9645E6F3CB32CAFDCD42AE15AE04C24F0415EAB71C354D7540&sym=" & sTmp & ".T"

            driver.Get "https://graph.sbisec.co.jp/sbiscreener/analysis?token=2B182FADF9BE4B9D9FC1FBFFB8CFF2ABE2618889CB68AA49487287364F5E51A2DFC2679E92F2091E9A9A09FF9CDF390E56C0F43001219C6F086DF240&sym=" & sTmp & ".T"


            sTmp2 = 0
            
            Do Until sTmp2 = 1

                If driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[1]/tbody/tr/td[2]/span[1]").Text <> "" Then
                
                    Sheets("銘柄データ").Cells(i, 11) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[1]/tbody/tr/td[2]/span[1]").Text
                    Sheets("銘柄データ").Cells(i, 12) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[1]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 13) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[2]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 14) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[3]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 15) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[4]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 16) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[5]/td[2]/div[3]").Text
                    sTmp2 = 1
        
                End If
            Loop
        Next i

11:
        Err.Number = 0

        On Error GoTo ERR11
'        On Error GoTo 0

        driver.Get "https://www.sbisec.co.jp/ETGate"

        driver.FindElementByXPath("//*[@id='user_input']/input").SendKeys USER_ID_1
        driver.FindElementByXPath("//*[@id='password_input']/input").SendKeys USER_PAS1
        driver.FindElementByXPath("/html/body/table/tbody/tr[1]/td[2]/div[2]/form/p[2]/input").Click
        
        driver.Get "https://www.sbisec.co.jp/ETGate/?OutSide=on&_ControlID=WPLETsmR001Control&_DataStoreID=DSWPLETsmR001Control&_PageID=WPLETsmR001Sdtl12&sw_page=WNS001&sw_param1=account&sw_param2=totalreturn&sw_param3=fund&sw_param4=summary&cat1=home&cat2=none&getFlg=on&int_pr1=150313_cmn_gnavi:2_dmenu_04"
        
        
        driver.FindElementByXPath("//*[@id='printArea1']/div/table/tbody/tr[3]/td[1]/a").Click
        
        driver.FindElementByXPath("//*[@id='MAINAREA02_780']/div[5]/p/a[1]").Click
        
        Application.Wait Now + TimeSerial(0, 0, 3)
 
        Call ダウンロードファイル起動(Path, "fundList20*.csv")
        
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
        
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(SBI夫)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True

        On Error GoTo 0

    'SBI証券(妻)

12:
        Err.Number = 0

        On Error GoTo ERR12

        driver.Get "https://www.sbisec.co.jp/ETGate"

        driver.FindElementByXPath("//*[@id='user_input']/input").SendKeys USER_ID_8
        driver.FindElementByXPath("//*[@id='password_input']/input").SendKeys USER_PAS8
        driver.FindElementByXPath("/html/body/table/tbody/tr[1]/td[2]/div[2]/form/p[2]/input").Click
        
       
        driver.Get "https://www.sbisec.co.jp/ETGate/?OutSide=on&_ControlID=WPLETsmR001Control&_DataStoreID=DSWPLETsmR001Control&_PageID=WPLETsmR001Sdtl12&sw_page=WNS001&sw_param1=account&sw_param2=totalreturn&sw_param3=fund&sw_param4=summary&cat1=home&cat2=none&getFlg=on&int_pr1=150313_cmn_gnavi:2_dmenu_04"
        
        Application.Wait Now + TimeSerial(0, 0, 2)
        
        driver.FindElementByXPath("/html/body/table/tbody/tr/td[2]/div[4]/div/table/tbody/tr[7]/td[1]/a").Click
        
        driver.FindElementByXPath("//*[@id='MAINAREA02_780']/div[5]/p/a[1]").Click
 
        Application.Wait Now + TimeSerial(0, 0, 2)
 
        Call ダウンロードファイル起動(Path, "fundList20*.csv")
        
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
        
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(SBI妻)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True
        
        On Error GoTo 0

    'SBI証券(会社)

13:
        Err.Number = 0

        On Error GoTo ERR13

        driver.Get "https://www.sbisec.co.jp/ETGate"

        driver.FindElementByXPath("//*[@id='user_input']/input").SendKeys USER_ID_9
        driver.FindElementByXPath("//*[@id='password_input']/input").SendKeys USER_PAS9
        driver.FindElementByXPath("/html/body/table/tbody/tr[1]/td[2]/div[2]/form/p[2]/input").Click
        
       
        driver.Get "https://www.sbisec.co.jp/ETGate/?OutSide=on&_ControlID=WPLETsmR001Control&_DataStoreID=DSWPLETsmR001Control&_PageID=WPLETsmR001Sdtl12&sw_page=WNS001&sw_param1=account&sw_param2=totalreturn&sw_param3=fund&sw_param4=summary&cat1=home&cat2=none&getFlg=on&int_pr1=150313_cmn_gnavi:2_dmenu_04"
        
        Application.Wait Now + TimeSerial(0, 0, 2)
        
        driver.FindElementByXPath("/html/body/table/tbody/tr/td[2]/div[4]/div/table/tbody/tr[3]/td[1]/a").Click
        
        driver.FindElementByXPath("//*[@id='MAINAREA02_780']/div[5]/p/a[1]").Click
 
        Application.Wait Now + TimeSerial(0, 0, 2)

        Call ダウンロードファイル起動(Path, "fundList20*.csv")
        
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
        
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(SBI会社)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True

        On Error GoTo 0

        'SBIベネフィット


        driver.Get "https://www.benefit401k.com/customer/RkDCMember/Common/JP_D_BFKLogin.aspx"
    
        driver.FindElementByXPath("//*[@id='txtUserID']").SendKeys USER_ID_2
        driver.FindElementByXPath("//*[@id='txtPassword']").SendKeys USER_PAS2
        Application.Wait Now + TimeSerial(0, 0, 1)
        driver.FindElementByXPath("//*[@id='btnLogin']").Click
        
    
        driver.Get "https://www.benefit401k.com/customer/RkDCMember/Financial/JP_D_Financial_AssetState.aspx"

        Sheets("元(DC)").Range("B5") = Replace(driver.FindElementByXPath("//*[@id='contentArea']/div[2]/div[1]/div[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[1]/table/tbody/tr/td").Text, "円", "")
        Sheets("元(DC)").Range("C5") = Replace(driver.FindElementByXPath("//*[@id='contentArea']/div[2]/div[1]/div[1]/table/tbody/tr/td[2]/table/tbody/tr[1]/td[1]/table/tbody/tr/td").Text, "円", "")

    '楽天証券(夫)

        driver.Get "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"

        driver.FindElementByXPath("//*[@id='form-login-id']").SendKeys USER_ID_11
        driver.FindElementByXPath("//*[@id='form-login-pass']").SendKeys USER_PAS11
        Application.Wait Now + TimeSerial(0, 0, 2)
        driver.FindElementByXPath("//*[@id='login-btn']").Click
        
        Application.Wait Now + TimeSerial(0, 0, 1)
        
        '保有商品一覧
        driver.ExecuteScript ("memberPageJump('/app/ass_all_possess_lst.do;BV_SessionID=XXXXXXXXXX?eventType=directInit&type=&sub_type=&local=&gmn=S&smn=01&lmn=01&fmn=01');s.lidTrack('pulldown_menu_ass_stk_01');return false;")
       
       
        Application.Wait Now + TimeSerial(0, 0, 5)
        
        
        driver.FindElementByXPath("//*[@id='printLink']/table/tbody/tr/td[4]/div/a/img").Click
        
        Application.Wait Now + TimeSerial(0, 0, 3)

        Call ダウンロードファイル起動(Path, "assetbalance(all)_20*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
        
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True
        
        'トータルリターン
        driver.ExecuteScript ("memberPageJump('/app/ass_total_all.do;BV_SessionID=5E4779E201C0D6C09EAE744AF23CE32C.42ad2c3e?eventType=init&gmn=S&smn=01&lmn=01&fmn=08#')")
        driver.FindElementByXPath("/html/body/div[2]/div/div[1]/div/div/table/tbody/tr/td/form/div[4]/table/tbody/tr/td[2]/a/img").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
    
        Call ダウンロードファイル起動(Path, "TotalReturn_all_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天トータル)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True

        '分配金
        driver.ExecuteScript ("memberPageJump('/app/ass_dividend_history.do;BV_SessionID=XXXXXXXXXX?eventType=init&gmn=S&smn=06&lmn=01&fmn=01');return false")
        driver.FindElementByXPath("//*[@id='dispTermPanel']/span[5]/img[1]").Click
        driver.FindElementByXPath("//*[@id='str-main-inner']/table/tbody/tr/td/form/div[3]/table/tbody/tr[7]/td/span/input").Click
        driver.FindElementByXPath("//*[@id='str-main-inner']/table/tbody/tr/td/form/table[3]/tbody/tr/td/table/tbody/tr/td/div/a/img").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
        
    
        Call ダウンロードファイル起動(Path, "dividendlist_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天(夫)分配金)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True


    '楽天証券(子)

        driver.Get "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"

        driver.FindElementByXPath("//*[@id='form-login-id']").SendKeys USER_ID_10
        driver.FindElementByXPath("//*[@id='form-login-pass']").SendKeys USER_PAS10
        Application.Wait Now + TimeSerial(0, 0, 2)
        driver.FindElementByXPath("//*[@id='login-btn']").Click
        
        Application.Wait Now + TimeSerial(0, 0, 2)
        
        driver.ExecuteScript ("memberPageJump('/app/ass_total_all.do;BV_SessionID=7B5EF13CA1DE13A351E1DDE96964526F.f003e262?eventType=init&gmn=S&smn=01&lmn=01&fmn=08')")
        driver.FindElementByXPath("/html/body/div[2]/div/div[1]/div/div/table/tbody/tr/td/form/div[4]/table/tbody/tr/td[2]/a/img").Click
        
        
        driver.ExecuteScript ("memberPageJump('/app/ass_total_all_jrisa.do;BV_SessionID=XXXXXXXXXX?eventType=init&gmn=H&smn=01&lmn=&fmn=#');return false;")
        driver.FindElementByXPath("/html/body/div[2]/div/div[1]/div/div/table/tbody/tr/td/form/div[4]/table/tbody/tr/td[2]/a/img").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
    
        Call ダウンロードファイル起動(Path, "TotalReturn_all_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天ジュニア)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True
    
    
        Call ダウンロードファイル起動(Path, "TotalReturn_all_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天 子)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True


    '確定拠出年金

        If (Weekday(Date) = 1 And (Time > CDate("2:00") Or Time < CDate("8:00"))) Or (getDateWeekNum(Year(Now), Month(Now), vbSaturday, 2) = Date And Time > CDate("21:00")) Or (getDateWeekNum(Year(Now), Month(Now), vbSunday, 2) = Date And Time < CDate("8:00")) Then
    
    
        Else
    
        
            driver.Get "https://supportsite.dc.tr.mufg.jp/mmbli/li001/LI001A01/"
            
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[1]/div[1]/span/input").Clear
            
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[1]/div[1]/span/input").SendKeys USER_ID_7
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[1]/div[2]/span/input").SendKeys USER_PAS7
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[3]/input").Click
    
            Application.Wait Now + TimeSerial(0, 0, 3)
            
    
            
            Sheets("元(DC)").Range("C2") = driver.FindElementByXPath("/html/body/form/div[2]/div[3]/div[3]/div[1]/div/div[1]/table/tbody/tr[2]/td[1]/p/span/em").Text
            Sheets("元(DC)").Range("B2") = driver.FindElementByXPath("/html/body/form/div[2]/div[3]/div[3]/div[1]/div/div[1]/table/tbody/tr[2]/td[3]/p/span/em").Text
            Sheets("元(DC)").Range("D2") = driver.FindElementByXPath("/html/body/form/div[2]/div[3]/div[3]/div[1]/div/div[1]/table/tbody/tr[2]/td[5]/p/span/em").Text
    
    
        End If
        
    '持株会

        If Time > CDate("6:00") Or Time < CDate("2:00") Then
        
            driver.Get "https://www.e-plan.nomura.co.jp/e-forum/html/index.html"

            driver.FindElementByXPath("/html/body/main/div/div/div[2]/ul[2]/li[1]/form/div[1]/div/div[1]/input").SendKeys USER_ID_6
            driver.FindElementByXPath("/html/body/main/div/div/div[2]/ul[2]/li[1]/form/div[1]/div/div[2]/div/input").SendKeys USER_PAS6
            driver.FindElementByXPath("/html/body/main/div/div/div[2]/ul[2]/li[1]/form/div[2]/p/input").Click
        
            driver.Get "https://www.e-plan.nomura.co.jp/mocikabu/script/WEAW1101.jsp"

            Sheets("持株会").Range("B2") = Mid(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/dl/dd[1]").Text, 1, InStr(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/dl/dd[1]").Text, "株") - 1)
            Sheets("持株会").Range("B3") = driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/div[1]/dl/dd/span[2]").Text
            Sheets("持株会").Range("B4") = driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/div[2]/dl/dd/span[1]").Text
            Sheets("持株会").Range("B5") = driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/div[3]/dl/dd/span[1]").Text
            Sheets("持株会").Range("B6") = Mid(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[3]/table/tbody/tr/td").Text, 1, InStr(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[3]/table/tbody/tr/td").Text, "円") - 1)
            driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[2]/table/thead/tr/th/div").Click
            Sheets("持株会").Range("B7") = Mid(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[2]/table/tbody/tr[2]/td").Text, 1, InStr(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[2]/table/tbody/tr[2]/td").Text, "円") - 1)


        End If

    '野村証券

10:

        If Time > CDate("6:00") Or Time < CDate("2:00") Then
        
            On Error GoTo ERR10
    
            driver.Get "https://hometrade.nomura.co.jp/web/rmfCmnCauSysLgiInitAction.do"
        
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[4]/form/div[1]/fieldset/div/div[1]/div/ul[1]/li/div[1]/label/input").SendKeys USER_ID_5
            driver.FindElementByXPath("//*[@id='accountNo']").SendKeys USER_ID_4
            driver.FindElementByXPath("//*[@id='passwd1']").SendKeys USER_PAS4
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[4]/form/div[2]/div/button").Click
        
            Application.Wait Now + TimeSerial(0, 0, 1)
        
            driver.Get "https://hometrade.nomura.co.jp/web/rmfAstTrhCpgHisInitAction.do"

            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[2]/fieldset/dl/dd/div[1]/div[1]/div[1]/label/select/option[3]").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[2]/fieldset/dl/dd/div[1]/div[1]/div[2]/label/select/option[1]").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[2]/fieldset/dl/dd/div[1]/div[1]/div[3]/label/select/option[1]").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[3]/div/button").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/ul[2]/li[2]/a").Click

            Application.Wait Now + TimeSerial(0, 0, 3)

            Call ダウンロードファイル起動(Path, "New_file*.csv")
            
            If Dir(sTmp) = "" Then
                GoTo 10
            End If
            
            If Date - FileDateTime(sTmp) < 14 Then
                Workbooks.Open sTmp, ReadOnly:=True
            Else
                GoTo ERR10
            End If
        
            Cells.Select
            Selection.Copy
            
            Application.DisplayAlerts = False
            ActiveWorkbook.Close SaveChanges:=False
        
            Kill sTmp
            
            EndRow = Sheets("元(野村履歴)").Cells(1048576, 1).End(xlUp).Row
            Range(Sheets("元(野村履歴)").Cells(12, 1), Sheets("元(野村履歴)").Cells(EndRow, 2)).Clear

            Sheets("元(野村履歴)").Select
            Cells.Select
            Selection.Clear
            ActiveSheet.Paste
        
            Application.DisplayAlerts = True

            driver.Get "https://hometrade.nomura.co.jp/web/rmfAstAdpAdpRealAdpAction.do?kzKkKbn=1"
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[4]/ul[1]/li[2]/a").Click
            
            Application.Wait Now + TimeSerial(0, 0, 3)
            
            Call ダウンロードファイル起動(Path, "New_file*.csv")
            
            If Dir(sTmp) = "" Then
                GoTo 10
            End If
        
        
            If Date - FileDateTime(sTmp) < 14 Then
                Workbooks.Open sTmp, ReadOnly:=True
            Else
                GoTo ERR10
            End If
        
            Cells.Select
            Selection.Copy
            
            Application.DisplayAlerts = False
            ActiveWorkbook.Close SaveChanges:=False
        
            Kill sTmp
        
            Sheets("元(野村預り)").Select
            Cells.Select
            Selection.Clear
            ActiveSheet.Paste
    
            Application.DisplayAlerts = True

        
        
        
        End If



    'シラーPER
        driver.Get "https://www.multpl.com/shiller-pe"
        
        sTmp = Mid(driver.FindElementByXPath("/html/body/div[2]/div[2]/div[2]/div[2]/div[3]/div[1]").Text, 27, 5) * 1
        
        EndRow = Sheets("株比率").Cells(1048576, 10).End(xlUp).Row
        
        For i = 4 To EndRow
        
            If sTmp > (Sheets("株比率").Cells(i - 1, 10) + Sheets("株比率").Cells(i, 10)) / 2 And sTmp <= (Sheets("株比率").Cells(i, 10) + Sheets("株比率").Cells(i + 1, 10)) / 2 Then
                Sheets("株比率").Cells(i, 1) = 1
            Else
                Sheets("株比率").Cells(i, 1) = ""
            End If
        Next i

    Set driver = Nothing

    On Error GoTo 0


    EndRow = Sheets("資産推移").Cells(1048576, 1).End(xlUp).Row + 1

    Sheets("資産推移").Cells(EndRow, 1) = Date
    Sheets("資産推移").Cells(EndRow, 2) = Sheets("メイン").Cells(50, 12)
    Sheets("資産推移").Cells(EndRow, 3) = Sheets("メイン").Cells(50, 12) - Sheets("メイン").Cells(50, 17)
    Sheets("資産推移").Cells(EndRow, 4) = Sheets("メイン").Cells(50, 17)
    Sheets("資産推移").Cells(EndRow, 5) = Sheets("メイン").Cells(50, 18)
    Sheets("資産推移").Cells(EndRow, 7) = Sheets("メイン").Cells(54, 2)
    Sheets("資産推移").Cells(EndRow, 8) = Sheets("15年").Cells(31, 3) * Sheets("メイン").Cells(54, 2)
    Sheets("資産推移").Cells(EndRow, 9) = Sheets("15年").Cells(70, 3) * Sheets("メイン").Cells(54, 2)

    Sheets("メイン").Select
   
    Sheets("メイン").Cells(1, 1) = Now
    
    NumLockOn

    Application.ScreenUpdating = True


    Sheets("メイン").Cells(1, 1).Select

'    Cells.Copy
    
'    ActiveWorkbook.Close SaveChanges:=False


    'IE(InternetExplorer)を閉じる
'    objIE.Quit

    'オブジェクト解除
'    Set objIE = Nothing


    Exit Sub

ERR10:
    Resume 10

ERR11:
    Resume 11
    
ERR12:
    Resume 12

ERR13:
    Resume 13
    
ERR14:
    Resume 14
    
a:
    MsgBox "エラー", vbExclamation, "エラー"
    
    



End Sub

関連のコードは以下の通り

 ' API declarations:
    Private Declare PtrSafe Sub keybd_event Lib "user32" _
       (ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
 
      Private Declare PtrSafe Function GetKeyboardState Lib "user32" _
         (pbKeyState As Byte) As Long
 
      ' Constant declarations:
      Const VK_NUMLOCK = &H90
      Const VK_SCROLL = &H91
      Const VK_CAPITAL = &H14
      Const KEYEVENTF_EXTENDEDKEY = &H1
      Const KEYEVENTF_KEYUP = &H2
Function NumLockOn()
    Dim NumLockState As Boolean
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)
    NumLockState = keys(VK_NUMLOCK)
       
    'オフであれば強制的にオンに切り替えます。
    If NumLockState <> True Then
        'Simulate Key Press
        keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        'Simulate Key Release
        keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If
End Function

Function getDateWeekNum(myYear As Integer, myMonth As Integer, _
                    myWeekday As VbDayOfWeek, weekNum As Integer) As Date
    Dim firstWeekday As Integer    ' 指定した年月の1日の曜日番号
    Dim Sabun As Integer            ' 曜日番号の差分
 
   ' 指定した年月の1日の曜日番号求める
    firstWeekday = Weekday(DateSerial(myYear, myMonth, 1))
 
   '1日の曜日番号と求めたい曜日番号の差分を求める
    Sabun = myWeekday - firstWeekday
    If myWeekday < firstWeekday Then
        Sabun = Sabun + 7
    End If
 
   ' 目的の日付データを求めて返す
   getDateWeekNum = DateSerial(myYear, myMonth, 1 + Sabun + 7 * (weekNum - 1))
End Function




Sub ダウンロードファイル起動(PATH2 As String, Target As String)

    Dim FSO As Object, Folder As Variant, File As Variant
    On Error Resume Next

    Set FSO = CreateObject("Scripting.FileSystemObject")

'    For Each Folder In FSO.GetFolder(Path).SubFolders
'        Call ダウンロードファイル(Folder.Path, Target)
'    Next Folder

    For Each File In FSO.GetFolder(PATH2).Files

        If File.Name Like Target Then
            If sTmp = "" Then
                sTmp = File.PATH
            Else
                If FileDateTime(sTmp) < FileDateTime(File) Then
                    sTmp = File.PATH
                End If
            End If
        End If
    Next File

End Sub


マクロコード個別解説

SBI証券のスクレイピング

本項では、SBI証券のスクレイピングコードを抜粋して紹介します。

二つの機能があります。

・株価を取得する機能

・SBI証券による企業スコア評価を取得する機能

・トータルリターンのcsvベタデータを取得する機能

最後の機能について、たまに、原因不明の動作エラーがでるため、無限リトライする機能をつけています。


        driver.Get "https://www.sbisec.co.jp/ETGate"

        driver.FindElementByXPath("//*[@id='user_input']/input").SendKeys USER_ID_1
        driver.FindElementByXPath("//*[@id='password_input']/input").SendKeys USER_PAS1
        driver.FindElementByXPath("/html/body/table/tbody/tr[1]/td[2]/div[2]/form/p[2]/input").Click
        
        For i = 2 To Sheets("銘柄データ").Cells(Rows.Count, 1).End(xlUp).Row
   
            sTmp = Sheets("銘柄データ").Cells(i, 1)
    
            driver.Get "https://graph.sbisec.co.jp/sbiscreener/analysis?token=2B1802A07CB84B9D9FC1FBFFB8CFF2ABE2618889CB68B066CB46B7584A6B1BF65FDE9D786205F4CD9AB3032BD4EB7B3E36743B22ADF83304E53AC570&sym=" & sTmp & ".T"

            sTmp2 = 0
            
            Do Until sTmp2 = 1

                If driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[1]/tbody/tr/td[2]/span[1]").Text <> "" Then
                
                    Sheets("銘柄データ").Cells(i, 11) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[1]/tbody/tr/td[2]/span[1]").Text
                    Sheets("銘柄データ").Cells(i, 12) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[1]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 13) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[2]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 14) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[3]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 15) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[4]/td[2]/div[3]").Text
                    Sheets("銘柄データ").Cells(i, 16) = driver.FindElementByXPath("//*[@id='root']/div/div/div[2]/div[1]/table[2]/tbody/tr[5]/td[2]/div[3]").Text
                    sTmp2 = 1
        
                End If
            Loop
        Next i

11:
        Err.Number = 0

        On Error GoTo ERR11

        driver.Get "https://www.sbisec.co.jp/ETGate"

        driver.FindElementByXPath("//*[@id='user_input']/input").SendKeys USER_ID_1
        driver.FindElementByXPath("//*[@id='password_input']/input").SendKeys USER_PAS1
        driver.FindElementByXPath("/html/body/table/tbody/tr[1]/td[2]/div[2]/form/p[2]/input").Click
        
        driver.Get "https://www.sbisec.co.jp/ETGate/?OutSide=on&_ControlID=WPLETsmR001Control&_DataStoreID=DSWPLETsmR001Control&_PageID=WPLETsmR001Sdtl12&sw_page=WNS001&sw_param1=account&sw_param2=totalreturn&sw_param3=fund&sw_param4=summary&cat1=home&cat2=none&getFlg=on&int_pr1=150313_cmn_gnavi:2_dmenu_04"
        
        
        driver.FindElementByXPath("//*[@id='printArea1']/div/table/tbody/tr[3]/td[1]/a").Click
        
        driver.FindElementByXPath("//*[@id='MAINAREA02_780']/div[5]/p/a[1]").Click
        
        Application.Wait Now + TimeSerial(0, 0, 2)
 
        Call ダウンロードファイル起動(PATH, "fundList20*.csv")
        
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
        
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(SBI夫)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True

        On Error GoTo 0

楽天証券のスクレイピング

本項では、 楽天証券のスクレイピングコードを抜粋して紹介します。

以下の機能があります。

  • 投資信託のトータルリターンを取得する機能。
  • ジュニアNISAの投資信託のトータルリターンを取得する機能。
  • 保有商品一覧を取得する機能
  • 分配金の履歴を取得する機能
    '楽天証券(夫)

        driver.Get "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"

        driver.FindElementByXPath("//*[@id='form-login-id']").SendKeys USER_ID_11
        driver.FindElementByXPath("//*[@id='form-login-pass']").SendKeys USER_PAS11
        driver.FindElementByXPath("//*[@id='login-btn']").Click
        
        '保有商品一覧
        driver.ExecuteScript ("memberPageJump('/app/ass_all_possess_lst.do;BV_SessionID=XXXXXXXXXX?eventType=directInit&type=&sub_type=&local=&gmn=S&smn=01&lmn=01&fmn=01');s.lidTrack('pulldown_menu_ass_stk_01');return false;")
       
       
        Application.Wait Now + TimeSerial(0, 0, 5)
        
        
        driver.FindElementByXPath("//*[@id='printLink']/table/tbody/tr/td[4]/div/a/img").Click
        
        Application.Wait Now + TimeSerial(0, 0, 3)

        Call ダウンロードファイル起動(PATH, "assetbalance(all)_20*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
        
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True
        
        'トータルリターン
        driver.ExecuteScript ("memberPageJump('/app/ass_total_all.do;BV_SessionID=5E4779E201C0D6C09EAE744AF23CE32C.42ad2c3e?eventType=init&gmn=S&smn=01&lmn=01&fmn=08#')")
        driver.FindElementByXPath("/html/body/div[2]/div/div[1]/div/div/table/tbody/tr/td/form/div[4]/table/tbody/tr/td[2]/a/img").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
    
        Call ダウンロードファイル起動(PATH, "TotalReturn_all_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天トータル)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True

        '分配金
        driver.ExecuteScript ("memberPageJump('/app/ass_dividend_history.do;BV_SessionID=XXXXXXXXXX?eventType=init&gmn=S&smn=06&lmn=01&fmn=01');return false")
        driver.FindElementByXPath("//*[@id='dispTermPanel']/span[5]/img[1]").Click
        driver.FindElementByXPath("//*[@id='str-main-inner']/table/tbody/tr/td/form/div[3]/table/tbody/tr[7]/td/span/input").Click
        driver.FindElementByXPath("//*[@id='str-main-inner']/table/tbody/tr/td/form/table[3]/tbody/tr/td/table/tbody/tr/td/div/a/img").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
        
    
        Call ダウンロードファイル起動(PATH, "dividendlist_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天(夫)分配金)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True


    '楽天証券(子)

        driver.Get "https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html"

        driver.FindElementByXPath("//*[@id='form-login-id']").SendKeys USER_ID_10
        driver.FindElementByXPath("//*[@id='form-login-pass']").SendKeys USER_PAS10
        driver.FindElementByXPath("//*[@id='login-btn']").Click
        

        
        driver.ExecuteScript ("memberPageJump('/app/ass_total_all.do;BV_SessionID=7B5EF13CA1DE13A351E1DDE96964526F.f003e262?eventType=init&gmn=S&smn=01&lmn=01&fmn=08')")
        driver.FindElementByXPath("/html/body/div[2]/div/div[1]/div/div/table/tbody/tr/td/form/div[4]/table/tbody/tr/td[2]/a/img").Click
        
        
        driver.ExecuteScript ("memberPageJump('/app/ass_total_all_jrisa.do;BV_SessionID=XXXXXXXXXX?eventType=init&gmn=H&smn=01&lmn=&fmn=#');return false;")
        driver.FindElementByXPath("/html/body/div[2]/div/div[1]/div/div/table/tbody/tr/td/form/div[4]/table/tbody/tr/td[2]/a/img").Click

        Application.Wait Now + TimeSerial(0, 0, 3)
    
        Call ダウンロードファイル起動(PATH, "TotalReturn_all_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天ジュニア)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True
    
    
        Call ダウンロードファイル起動(PATH, "TotalReturn_all_*.csv")
    
        If Date - FileDateTime(sTmp) < 14 Then
            Workbooks.Open sTmp, ReadOnly:=True
        Else
            GoTo a
        End If
    
        Cells.Select
        Selection.Copy
    
        Application.DisplayAlerts = False
        ActiveWorkbook.Close SaveChanges:=False
    
        Kill sTmp
    
        Sheets("元(楽天 子)").Select
        Cells.Select
        Selection.Clear
        ActiveSheet.Paste
    
        Application.DisplayAlerts = True

SBIベネフィット・システムズのスクレイピング

本項では、 SBIベネフィット・システムズ のスクレイピングコードを抜粋して紹介します。

idecoの管理を委託しているサイトです。

私は1銘柄の集中投資をしているため、運用掛金と、現在値、それぞれの総額のみを取得する仕様としています。



        'SBIベネフィット


        driver.Get "https://www.benefit401k.com/customer/RkDCMember/Common/JP_D_BFKLogin.aspx"
    
        driver.FindElementByXPath("//*[@id='txtUserID']").SendKeys USER_ID_2
        driver.FindElementByXPath("//*[@id='txtPassword']").SendKeys USER_PAS2
        driver.FindElementByXPath("//*[@id='btnLogin']").Click
        
    
        driver.Get "https://www.benefit401k.com/customer/RkDCMember/Financial/JP_D_Financial_AssetState.aspx"

        Sheets("元(DC)").Range("B5") = Replace(driver.FindElementByXPath("//*[@id='contentArea']/div[2]/div[1]/div[1]/table/tbody/tr/td[2]/table/tbody/tr[2]/td[1]/table/tbody/tr/td").Text, "円", "")
        Sheets("元(DC)").Range("C5") = Replace(driver.FindElementByXPath("//*[@id='contentArea']/div[2]/div[1]/div[1]/table/tbody/tr/td[2]/table/tbody/tr[1]/td[1]/table/tbody/tr/td").Text, "円", "")

SBIネオモバイル証券のスクレイピング

本項ではSBIネオモバイル証券のスクレイピング について抜粋して紹介します。以下機能があります。

当年度の譲渡益税徴収額合計
当年度の 損益額合計
当年度の 配当所得税徴収額合計
当年度の 配当金額合計

保有銘柄の銘柄情報を取得。

預かり現金額を取得

コードは以下の通りです。

    'ネオモバイル


            driver.Get "https://trade.sbineomobile.co.jp/login"
            driver.Window.Maximize
            driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/form/section[1]/div/div[1]/input").SendKeys USER_ID_3
            driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/form/section[1]/div/div[2]/input").SendKeys USER_PAS3
            driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/form/section[2]/button").Click
            
            driver.Get "https://trade.sbineomobile.co.jp/trade/domestic/tradeHistory/capitalGainTaxDetail"
            
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[1]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L2") = 0
            Else
                Sheets("個別履歴").Range("L2") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[1]/td/span").Text * -1
            End If
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[2]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L3") = 0
            Else
                Sheets("個別履歴").Range("L3") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[1]/table/tbody/tr[2]/td/span").Text
            End If
            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[1]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L4") = 0
            Else
                Sheets("個別履歴").Range("L4") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[1]/td/span").Text * -1
            End If

            
            If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[2]/td/span").Text = "--" Then
                Sheets("個別履歴").Range("L5") = 0
            Else
                Sheets("個別履歴").Range("L5") = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/section[3]/section/div[2]/table/tbody/tr[2]/td/span").Text
            End If


            driver.Get "https://trade.sbineomobile.co.jp/account/portfolio"

            For i = 1 To 20
            
                On Error GoTo ERR14
                driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[3]/section/button").Click
                
                Application.Wait Now + TimeSerial(0, 0, 2)
                
            Next i

14:
            On Error GoTo 0


            Sheets("ネオモバ一覧").Select
            Columns("A:D").Select
            Selection.Clear
            
            Columns(1).NumberFormatLocal = "@"

            Sheets("ネオモバ一覧").Cells(2, 3) = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[4]/ul/li[1]/p[2]/span").Text

            Application.Calculation = xlCalculationManual
            For i = 1 To driver.FindElementsByClass("name").Count
          
                Sheets("ネオモバ一覧").Cells(i + 2, 1) = Format(driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[1]/div[2]/p").Text, "@")
                Sheets("ネオモバ一覧").Cells(i + 2, 2) = Format(driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[1]/div[2]/h4/a").Text, "@")
                If driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[2]/div[1]/span").Text = "--" Then
                    Sheets("ネオモバ一覧").Cells(i + 3, 3) = 0
                Else
                    Sheets("ネオモバ一覧").Cells(i + 2, 3) = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[2]/div[1]/span").Text
                End If
                Sheets("ネオモバ一覧").Cells(i + 2, 4) = driver.FindElementByXPath("/html/body/div[3]/div/div/div[1]/div[2]/div[1]/main/div[1]/section[" & i + 4 & "]/div/div[2]/div[2]/span").Text
          
            Next i
            Application.Calculation = xlCalculationAutomatic

        
            ActiveWorkbook.Worksheets("ネオモバサマリ").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("ネオモバサマリ").Sort.SortFields.Add Key:=Range("L1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets("ネオモバサマリ").Sort
                .SetRange Range(Cells(1, 1), Cells(18, 20))
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        
        
            If ActiveWorkbook.Worksheets("銘柄データ").FilterMode = True Then
        
                ActiveWorkbook.Worksheets("銘柄データ").ShowAllData
            Else
                ActiveWorkbook.Worksheets("銘柄データ").Rows(1).AutoFilter
            
            End If
        
        
            ActiveWorkbook.Worksheets("銘柄データ").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("銘柄データ").Sort.SortFields.Add Key:=Range("I1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            ActiveWorkbook.Worksheets("銘柄データ").Sort.SortFields.Add Key:=Range("E1"), _
                SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets("銘柄データ").Sort
                .SetRange Range(Cells(1, 1), Cells(Sheets("銘柄データ").Cells(Rows.Count, 1).End(xlUp).Row, 300))
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
            
        
            ActiveWorkbook.Worksheets("銘柄データ").Rows(1).AutoFilter Field:=8, Criteria1:="<>#VALUE!", Operator:=xlFilterValues


ERR14:
    Resume 14

   

野村証券のスクレイピング

本項では野村證券のスクレイピング について抜粋して紹介します。 以下機能があります。

株式の現在預かり資産を取得。

特定口座の譲渡益履歴を取得。

コードは以下の通りです。

    '野村証券

10:

        If Time > CDate("6:00") Or Time < CDate("2:00") Then
        
            On Error GoTo ERR10
    
            driver.Get "https://hometrade.nomura.co.jp/web/rmfCmnCauSysLgiInitAction.do"
        
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[4]/form/div[1]/fieldset/div/div[1]/div/ul[1]/li/div[1]/label/input").SendKeys USER_ID_5
            driver.FindElementByXPath("//*[@id='accountNo']").SendKeys USER_ID_4
            driver.FindElementByXPath("//*[@id='passwd1']").SendKeys USER_PAS4
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[4]/form/div[2]/div/button").Click
        
            Application.Wait Now + TimeSerial(0, 0, 1)
        
            driver.Get "https://hometrade.nomura.co.jp/web/rmfAstTrhCpgHisInitAction.do"

            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[2]/fieldset/dl/dd/div[1]/div[1]/div[1]/label/select/option[3]").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[2]/fieldset/dl/dd/div[1]/div[1]/div[2]/label/select/option[1]").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[2]/fieldset/dl/dd/div[1]/div[1]/div[3]/label/select/option[1]").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/div[3]/div/button").Click
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[3]/form/ul[2]/li[2]/a").Click

            Application.Wait Now + TimeSerial(0, 0, 3)

            Call ダウンロードファイル起動(Path, "New_file*.csv")
            
            If Dir(sTmp) = "" Then
                GoTo 10
            End If
            
            If Date - FileDateTime(sTmp) < 14 Then
                Workbooks.Open sTmp, ReadOnly:=True
            Else
                GoTo ERR10
            End If
        
            Cells.Select
            Selection.Copy
            
            Application.DisplayAlerts = False
            ActiveWorkbook.Close SaveChanges:=False
        
            Kill sTmp
            
            EndRow = Sheets("元(野村履歴)").Cells(1048576, 1).End(xlUp).Row
            Range(Sheets("元(野村履歴)").Cells(12, 1), Sheets("元(野村履歴)").Cells(EndRow, 2)).Clear

            Sheets("元(野村履歴)").Select
            Cells.Select
            Selection.Clear
            ActiveSheet.Paste
        
            Application.DisplayAlerts = True

            driver.Get "https://hometrade.nomura.co.jp/web/rmfAstAdpAdpRealAdpAction.do?kzKkKbn=1"
            driver.FindElementByXPath("/html/body/div[1]/div/main/div/div[4]/ul[1]/li[2]/a").Click
            
            Application.Wait Now + TimeSerial(0, 0, 3)
            
            Call ダウンロードファイル起動(Path, "New_file*.csv")
            
            If Dir(sTmp) = "" Then
                GoTo 10
            End If
        
        
            If Date - FileDateTime(sTmp) < 14 Then
                Workbooks.Open sTmp, ReadOnly:=True
            Else
                GoTo ERR10
            End If
        
            Cells.Select
            Selection.Copy
            
            Application.DisplayAlerts = False
            ActiveWorkbook.Close SaveChanges:=False
        
            Kill sTmp
        
            Sheets("元(野村預り)").Select
            Cells.Select
            Selection.Clear
            ActiveSheet.Paste
    
            Application.DisplayAlerts = True

        
        
        
        End If

持株WEBサービス(野村証券)のスクレイピング

本項では、 持株WEBサービス(野村証券)のスクレイピング について抜粋して紹介します。

以下が取得できます。

株数現在高
時価評価額
平均買付価格
リターン
繰越金
奨励金

    '持株会

        If Time > CDate("6:00") Or Time < CDate("2:00") Then
        
            driver.Get "https://www.e-plan.nomura.co.jp/e-forum/html/index.html"

            driver.FindElementByXPath("/html/body/main/div/div/div[2]/ul[2]/li[1]/form/div[1]/div/div[1]/input").SendKeys USER_ID_6
            driver.FindElementByXPath("/html/body/main/div/div/div[2]/ul[2]/li[1]/form/div[1]/div/div[2]/div/input").SendKeys USER_PAS6
            driver.FindElementByXPath("/html/body/main/div/div/div[2]/ul[2]/li[1]/form/div[2]/p/input").Click
        
            driver.Get "https://www.e-plan.nomura.co.jp/mocikabu/script/WEAW1101.jsp"

            Sheets("持株会").Range("B2") = Mid(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/dl/dd[1]").Text, 1, InStr(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/dl/dd[1]").Text, "株") - 1)
            Sheets("持株会").Range("B3") = driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/div[1]/dl/dd/span[2]").Text
            Sheets("持株会").Range("B4") = driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/div[2]/dl/dd/span[1]").Text
            Sheets("持株会").Range("B5") = driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[1]/div[1]/div[3]/dl/dd/span[1]").Text
            Sheets("持株会").Range("B6") = Mid(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[3]/table/tbody/tr/td").Text, 1, InStr(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[3]/table/tbody/tr/td").Text, "円") - 1)
            driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[2]/table/thead/tr/th/div").Click
            Sheets("持株会").Range("B7") = Mid(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[2]/table/tbody/tr[2]/td").Text, 1, InStr(driver.FindElementByXPath("/html/body/main/section[1]/div/div/div[2]/div[2]/table/tbody/tr[2]/td").Text, "円") - 1)


        End If

NRK(確定拠出年金)のスクレイピング

本項では、NRK(確定拠出年金) のスクレイピング について抜粋して紹介します。

私は1銘柄の集中投資をしているため、運用掛金と、現在値、それぞれの総額のみを取得する仕様としています。

    '確定拠出年金

        If (Weekday(Date) = 1 And (Time > CDate("2:00") Or Time < CDate("8:00"))) Or (getDateWeekNum(Year(Now), Month(Now), vbSaturday, 2) = Date And Time > CDate("21:00")) Or (getDateWeekNum(Year(Now), Month(Now), vbSunday, 2) = Date And Time < CDate("8:00")) Then
    
    
        Else
    
        
            driver.Get "https://supportsite.dc.tr.mufg.jp/mmbli/li001/LI001A01/"
            
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[1]/div[1]/span/input").Clear
            
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[1]/div[1]/span/input").SendKeys USER_ID_7
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[1]/div[2]/span/input").SendKeys USER_PAS7
            driver.FindElementByXPath("/html/body/div[1]/div[2]/div[2]/div/form/div[3]/input").Click
    
            Application.Wait Now + TimeSerial(0, 0, 3)
            
    
            
            Sheets("元(DC)").Range("C2") = driver.FindElementByXPath("/html/body/form/div[2]/div[3]/div[3]/div[1]/div/div[1]/table/tbody/tr[2]/td[1]/p/span/em").Text
            Sheets("元(DC)").Range("B2") = driver.FindElementByXPath("/html/body/form/div[2]/div[3]/div[3]/div[1]/div/div[1]/table/tbody/tr[2]/td[3]/p/span/em").Text
            Sheets("元(DC)").Range("D2") = driver.FindElementByXPath("/html/body/form/div[2]/div[3]/div[3]/div[1]/div/div[1]/table/tbody/tr[2]/td[5]/p/span/em").Text
    
    
        End If

シラーPER(CAPEレシオ)のスクレイピング

本項では、 シラーPER(CAPEレシオ) 値のスクレイピング について抜粋して紹介します。

私はシラー PER(CAPEレシオ) によって株式の比率を増やしたり減らしたりしているので、値を取得しています。

また取得したうえで、株式の比率を算出する機能も設けています。

コードは以下の通りです。

    'シラーPER
        driver.Get "https://www.multpl.com/shiller-pe"
        
        sTmp = Mid(driver.FindElementByXPath("/html/body/div[2]/div[2]/div[2]/div[2]/div[3]/div[1]").Text, 27, 5) * 1
        
        EndRow = Sheets("株比率").Cells(1048576, 10).End(xlUp).Row
        
        For i = 4 To EndRow
        
            If sTmp > (Sheets("株比率").Cells(i - 1, 10) + Sheets("株比率").Cells(i, 10)) / 2 And sTmp <= (Sheets("株比率").Cells(i, 10) + Sheets("株比率").Cells(i + 1, 10)) / 2 Then
                Sheets("株比率").Cells(i, 1) = 1
            Else
                Sheets("株比率").Cells(i, 1) = ""
            End If
        Next i

まとめ

いかがでしたでしょうか? 資産管理ツール作成の参考になれば幸いです。

本稿で紹介したマクロのサポートやカスタマイズ、もしくは新規案件については、条件によって、有償にて対応受付しております。

以下、クラウドワークスないしココナラのアカウントよりご依頼いただければ幸いです。

FIRE太郎さん(その他)に依頼・外注する | 簡単ネット発注なら【クラウドワークス】
日本最大のクラウドソーシング「クラウドワークス」にご登録いただいているFIRE太郎さんのプロフィールです。その他のスキルを持つプロフェッショナルに1時間から仕事を気軽に発注!発注者は手数料無料。
FIRE太郎さん(会社員)のプロフィール | ココナラ
Excelマクロ(VBA)による自動化ツールの作成が得意です。|ブログ「FIRE(早期リタイア)研究所」運営中

コメント

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