いやー、エンタテインメントしたいとかタイトルで書いてますけど、今回の記事はExcelとか為替とか娯楽とかけ離れてる感がしますね。とか言いつつ前の続き(前回はこちら)を書いていきますがw
【プログラム】
では、いよいよExcel VBAでのプログラミングに入ります。
今回の実装の流れはこんな感じ。
(0. 開発環境の準備)
1. ライブラリの参照
2. 為替レート取得用のプロシージャ
3. 2.で実装したプロシージャの使用
0. 開発環境の準備 (VBA開発を有効にしている場合は不要)
Excelではデフォルトで開発環境が無効になっているため、これを使用できるように設定を変える必要があります。
とはいえ、手順(Excel 2010以降の場合)は簡単で
「ファイル」 >> 「オプション」 >> 「リボンのユーザー設定」を選択し、「開発」タブを有効にするだけです。
1. ライブラリの参照
まず、Excel VBAでIEを制御するために、「Microsoft Internet Controls」と「Microsoft HTML Object Library」というライブラリを参照する必要があります。
これらのライブラリは、簡単にWebブラウザ(IE)の制御とHTMLの解析をするためのライブラリで、この中の関数をいくつか使用して為替レートの読み取りを行います。
2. 為替レート取得用のプロシージャ
これで、Webブラウザで為替レートの検索と取得を行う準備が完了したので、いよいよコードの実装に入ります。
まずは、開発環境(VBE:Visual Basic Editor)を起動します。
続いて、関数(プロシージャ)を書くための標準モジュールを用意しましょう。
標準モジュールの作り方は、開発環境の画面左にある「標準モジュール」を右クリックし、「挿入」>>「標準モジュール」の順に選択します。
では、為替レートを取得する関数を見てみます。
以下のコードを先ほど作った標準モジュールにコピペすればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
'Sleep関数を使用するための宣言 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'IEを介してリアルタイムな為替レートを取得するファンクションプロシージャ 'ライブラリ"Microsoft Internet Controls" と "Microsoft HTML Object Library"を参照 Function getExchangeRateIE(Optional ByVal src As String = "JPY", Optional ByVal dst As String = "USD") As Double Dim ie As New InternetExplorer Dim timeOut As Date Dim elem As Object 'html elements in webpage Dim inTxt As String 'inner text 'タイムアウトを20秒に設定 timeOut = Now + TimeSerial(0, 0, 20) 'IEを起動して、Googleの為替コンバーターを開く ie.Navigate2 ("https://www.google.com/finance/converter?a=1&from=" & src & "&to=" & dst) 'ie.Visible = True 'IEを表示(コメントアウトしています) 'Webページの読み込みが完了するまで待機 While ie.Busy = True Or ie.readyState < READYSTATE_COMPLETE DoEvents Sleep 1 'IEがページを読み込めなければ、強制終了 If Now > timeOut Then ie.Quit 'kill IE process Exit Function End If Wend 'HTML要素を取得する Set elem = ie.document.getElementsByName("currency_converter_result")(0) ' (変換元の通貨) - (変換先の通貨) 間の為替レートを読み取る:スクレイピング inTxt = elem.innerText inTxt = Left(inTxt, Len(inTxt) - 2) 'スペース2文字分を削除 '為替レートを取得する getExchangeRateIE = CDbl(Split(inTxt, " ")(3)) '配列には {1, (変換元の通貨), (レート), (変換先の通貨)} の順に格納 ie.Quit 'IEの終了 End Function |
3. 2.で実装したプロシージャの使用
2. で作った関数はそのまま使うことができないので、新しい関数を作成してその中で使用します。
(いろんな場所で使いやすくするために、Function形式で記述していました)
下のサブプロシージャを、2.で用意した標準モジュール内に書き込みましょう。
こちらも、2. で作った関数の下に書き込めばOK。
1 2 3 4 |
Sub GetExRate() 'MsgBox getExchangeRateIE 'Current exchange rate(default JPY -> USD) MsgBox getExchangeRateIE("USD", "JPY") 'Current exchange rate End Sub |
後は、ためしにVBEで起動してテストします。
VBEの画面上側にある実行ボタン(緑の三角形のやつ)を押してみましょう(マクロの選択画面見たいなものが出てきたら、「GetExRate」という名前を選択します)。
上の写真のように、メッセージボックスで為替レートが表示されたら成功です。
【参考】
こちらのサイトを参考にさせていただきました。
Qiita 為替レートのAPI: http://qiita.com/RKC/items/5bdec1fc0e526e30adb5
コメント