配当金管理を自動化したいと思い、先人の方々の知恵を借りつつマクロを作りました。
今回作成したのは、「証券コードを入力してスクレイピング用のボタンを推せば、その時点でのおおよその株価や配当金が分かるマクロ」です。
以前までは「配当管理」というアプリを使っていたのですが、複数の証券会社を使っているとそれぞれの保有株を調べる必要があり、管理が大変でした(ただ、各月にもらえる配当金の予想ができるので、その点はとてもありがたいアプリです!)。
また、個人的には他の方が提供して下さっているスプレッドシートで管理したかったのですが、リクエストが多く上手く処理ができなかったため、今回Excelで作った次第です。
まずはじめに:銘柄が少ない場合におすすめのスプレッドシート
所持している銘柄が少ない&「マクロとかよくわからないから無理…」という方は
jim様が公開して下さっているテンプレートがおすすめです。
説明なさっている通りに導入すれば、問題なく使える素晴らしいテンプレートです。
残念ながら、私の環境ではリクエストが多さで内部エラーが多発したため、1からExcelの方で作ることにしました。
Excelで作ったマクロをざっくり説明
↓今回作ったExcelはこちら
項目名などはjim様のテンプレートを参考にさせて頂きました。
ざっくりと説明すると
①所持している株価の証券コードを手入力
②証券コード情報をもとに株価・株価(終値)・配当利回りなどをまとめているサイトにアクセスし、スクレイピング
③取得した情報をExcelにインプットし、計算式を使って配当金の予想を算出
という感じです。
「証券コード」「所持数」は、多少手間ですが手入力しています(さすがに証券会社へのスクレイピングは怖くてできなかったです…そもそもできるのかもわかりませんが)。
また、単元未満株が多く、かつ複数の証券会社で散らばっているので、その保有数もまとめて管理しています。
VBAプログラミングの備忘録
私はVBA初心者なので、詳しい人に聞きながら何とか完成することができました。
そのときの備忘録を、今後のためにまとめたいと思います。
※コードが汚いのはどうかご容赦ください!
まず、スクレイピングしたいサイトにアクセスする処理は
'変数定義
Dim str1 As String
Dim num1 As Integer
Dim i As Integer
For i = 証券コードが始まるセルの行 To Cells(証券コードが始まるセルの行, "証券コードの 列").End(xlDown).row
'入力項目を設定
str1 = "サイトのURLのパスの一部"
'証券コードが数字だったらスクレイピングをする
If IsNumeric(Cells(i, "証券コードの列").Value) = True Then
num1 = Cells(i, "証券コードの列").Value
Dim inputUrl As String: inputUrl = str1 & num1
'サイトにアクセス
.Get inputUrl
'以下スクレイピング処理
・
・
・
Else '証券コードが数字以外の場合
'なにもしない
End If
Next i
といった感じ。これだとわかりにくいので文章で説明すると
- 証券コードを参照させ、そこからスクレイピング対象のURLを作成したい
- スクレイピングしたいサイトのパスの一部を、定義していた変数に代入し、証券コードを末尾につなげる(この処理はサイトによって対応が異なる。私の使ったサイトは、末尾にパロメーターとして証券コードをつけると各銘柄のページに飛べる)
- 証券コードの列の値が数値であり、空白でない限りはループ処理を続ける
となっています。
あとは株価などの項目をスクレイピングして、シートに書き込んで行くだけです。
また、これもサイトによって実装方法は異なりますが、今回はFindElementByXPath()で要素をフルパス指定しました。
ただ、これだとサイトリニューアルのときにこちらも修正が必要になるため、保守性の高さには欠けます…。が、どうしてもそのメソッドでないと要素の取得ができませんでした。
個人的にやってよかったのがWebDriverの自動更新
これは、プログラミングに詳しい人に任せたので詳しくは説明出来ないのですが、WebDriverの自動更新があると本当に楽です。
たまにしか使わないマクロだと、気が付かないうちにブラウザとのバージョンずれが起こり、動かないことがしばしばありました。
そのため、こちらの方の記事を参考に、WebDriverの自動更新を導入しています。
最後に関数を修正して完成
表として見やすくするために、Excel関数を使って使いやすくしました。
理想値の配当(%)は、ネットでの情報を集めた「この配当利回りで買いたい」という数値。
その数値より現在の利回りが上回っていれば、背景を赤くしています。
配当金予想は、株価と配当(%)と総所得数をかけ合わせ、最後にIFERROR関数を使ってエラー文を出さないようにしています。