Excel VBAで企業コードから株価と配当利回りを取得する方法|企業名も自動入力する方法を解説

Visual Basic

Excel VBAを使って株価情報を自動取得したいというケースは非常に多く、特に「A列に企業コードを入力したら、B列へ企業名、C列へ株価、D列へ配当利回りを自動取得したい」というニーズは投資管理や銘柄分析でよく使われます。この記事では、Excel VBAで株価情報を取得する基本的な考え方や、実装時によくあるポイントを整理します。

まず理解したい「取得元サイト」の存在

VBAだけでは株価データは存在しないため、どこかのWebサイトやAPIから取得する必要があります。

一般的には以下のような情報源が使われます。

取得元 特徴
Yahoo!ファイナンス 情報量が多い
株探 配当情報が見やすい
証券会社API 精度が高い
Google Finance 関数利用向け

VBAでは「Webページを読み込んで必要情報を抜き出す」という形になることが多いです。

つまり、VBA単体ではなく“Webスクレイピング”がセットになるケースが一般的です。

基本的なシート構成例

例えば以下のような構成で管理すると扱いやすくなります。

列 内容
A列 企業コード
B列 企業名
C列 株価
D列 配当利回り

例えばA列へ「7203」を入力すると、トヨタ自動車の情報を取得するイメージです。

VBA側ではA列をループ処理しながら、各企業コードごとに情報取得していきます。

VBAでよく使われる取得方法

Excel VBAで株価取得する場合、以下の方法が比較的よく使われます。

  • XMLHTTPによるWeb取得
  • HTMLDocument解析
  • Power Query利用
  • Selenium連携

比較的シンプルなのは、XMLHTTP+HTML解析です。

例えば以下のような流れになります。

  1. 企業コードからURL生成
  2. Webページ取得
  3. HTML解析
  4. 株価部分抽出
  5. セルへ書き込み

ただし、サイト側の仕様変更で突然動かなくなることもあります。

Yahoo!ファイナンス利用時の注意点

初心者がまず試しやすいのはYahoo!ファイナンス系ですが、近年はスクレイピング対策が強化されています。

そのため、単純なHTML取得だけではうまくいかない場合があります。

また、以下の問題もあります。

  • HTML構造変更
  • アクセス制限
  • JavaScript描画
  • 利用規約問題

特に配当利回りはページ構造変更の影響を受けやすいため、定期的な修正が必要になるケースがあります。

[参照]

実際に使われやすいVBAの考え方

例えばVBAでは以下のようなイメージで処理されます。

For Each code In Range("A2:A100")
  URL生成
  HTML取得
  株価取得
  配当利回り取得
  セルへ出力
Next

このようにループ処理で一覧取得する形が一般的です。

企業コードが200件あっても、自動取得できればかなり作業時間を短縮できます。

最近はPower Queryの方が簡単な場合もある

最近のExcelでは、VBAよりPower Queryの方が安定するケースもあります。

特に以下のメリットがあります。

Power Query 特徴
GUI操作可能 初心者向け
再読み込み簡単 更新しやすい
Web取得対応 VBA不要な場合もある

VBAにこだわらないなら、Power Query+関数管理の方が保守しやすいこともあります。

証券会社APIを使うと安定しやすい

本格的に運用する場合、無料サイトスクレイピングよりAPI利用の方が安定しやすいです。

例えば以下があります。

  • Alpha Vantage
  • Finnhub
  • 証券会社API

APIならJSON形式で取得できるため、VBAでも扱いやすくなります。

ただし、日本株の配当利回り情報まで揃うAPIは限られるため、用途によって使い分けが必要です。

まとめ

Excel VBAで企業コードから企業名・株価・配当利回りを取得する場合、基本的にはWebサイトやAPIからデータ取得する形になります。

一般的には、A列の企業コードをループ処理し、Yahoo!ファイナンスなどからHTML解析して取得する方法がよく使われています。

ただし、最近はサイト仕様変更やスクレイピング制限も増えているため、Power QueryやAPI利用も検討すると安定しやすくなります。200件以上の銘柄管理でも、自動化できれば大幅に効率化できるため、取得元選びとメンテナンス性を意識するのが重要です。

コメント

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