為替レートを取得しフォームに表示する
為替レートの情報を取得し、フォームに為替ボード風に表示するサンプルです。為替レートはリアルタイム、さらに自動更新します。為替レートのデータは、ヤフーファイナンスから取得するので安心(?)です。
本サンプルはExcel版「
為替レートを取得しワークシートに表示する
」もあります。解説の内容やサンプルの仕様は、ほぼ同じです。
サンプルダウンロード
(2014/01/10更新)
このサンプルのテーマと仕組み
ウェブ上からの情報取得がテーマのサンプルです。情報の取得元は、ヤフーファイナンスの為替情報(
https://fx.yahoo.co.jp/chart/
)にある為替ボードです。ウェブ上から為替レートのデータを取得し、フォームに為替ボードとして表示します。
図 1
サンプルの概要(為替ボードを作成する)
ヤフーファイナンスの為替ボードは、約10秒ごとに新しいレートに更新されます。ただし、ページを再読込するのではなく、為替レートのデータを別な場所から取得しページ内の必要な部分を動的に書き換えて表示する仕組みとなっています。これは、ブラウザの開発者ツールで動作を確認すると一目瞭然です。
そこで、本サンプルでも、同じように為替レートのデータを取得してフォームに表示します。ウェブ上からデータを取得するにはいくつかの方法がありますが、取得するデータの内容が一定の書式に従って定義・作成されたテキスト形式のデータであることと、一定間隔ごとにデータを取得しなくてはならないため、MSXML2.XMLHTTPというコンポーネントを使って取得します。
図 2
開発者ツールでのキャプチャ例
為替データの取得
MSXML2.XMLHTTPを使用してウェブ上のデータを取得する処理です。228〜230行目で参照するページのURLを生成、234行目でMSXML2.XMLHTTPオブジェクトを作成し、236〜255行目で同オブジェクトの機能を使用しウェブページを参照する処理を行います。URL生成時に乱数を組み合わせていますが、これはブラウザのキャッシュを取り出さないようにするためのものです。数字そのものに特に意味はなく、MSXML2.XMLHTTPでダウンロードを行うときによく使うテクニックです。
実際にウェブページを参照するリクエストの実行は246行目のSendメソッドで行いますが、基本的に非同期で実行するものであるため、ページのダウンロードが完了するまで何らかの方法で待機しなくてはなりません。
サンプルでは、248〜251行目で待機用のループ処理を設け、ダウンロードが完了するのを待っています。ダウンロードが完了したかどうかは、readyStateプロパティの値で判定します。4ならダウンロード完了です。また、ダウンロードしたテキストの情報は、responseTextプロパティから取得できます。
リスト 1
為替データの取得処理
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
為替ボード
Private Function getFxRateInfo() As String
Dim sURL As String
Dim dParm As Long
dParm
= 1000000000 +
Int(Rnd * 1147483647)
sURL = "https://" & HTTP_Domain & "/rate_data.js?_=" &
dParm
getFxRateInfo = vbNullString
Set objHttp = CreateObject("
MSXML2.XMLHTTP
")
With objHttp
.abort
.Open "GET", sURL, True
.setRequestHeader "Accept", "text/html, application/xhtml+xml, */*"
.setRequestHeader "Accept-Language", "ja-JP"
.setRequestHeader "Accept-Encoding", "gzip, deflate"
.setRequestHeader "User-Agent", "Mozilla/5.0 (compatible; MSIE
…(略)…
.setRequestHeader "Host", HTTP_Domain
.setRequestHeader "Connection", "Keep-Alive"
.
send
Do Until .
readyState
= 4
Call Sleep(100)
DoEvents
Loop
getFxRateInfo = .
responseText
End With
Set objHttp = Nothing
End Function
注:行番号はモジュール全体の中での行数を表します。これ以降のリストも同様です。
取得した為替データを整える
為替のデータは、一定の書式で定義・作成されています。このままだと少々扱いにくいので、カンマ区切りのデータに整えます。置き換えの方法は次の図の通りです。
図 3
データを加工する
文字列の置き換えは、
RegExp(正規表現)
を使って行いました。本サンプルでは、やや複雑な置き換えを行っているため、Replace関数で置き換えを行うよりもプログラムをシンプルかつ明確にできます。
リスト 2
データの加工を行う処理
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
為替ボード
Public Function LoadFxRateData() As String
Dim strData As String
Dim oRegExp As Object
Dim lStart As Long
LoadFxRateData = ""
Set oRegExp = CreateObject("
VBScript.RegExp
")
strData = getFxRateInfo()
oRegExp.Global = True
oRegExp.Pattern = "(\:\{)"
strData = oRegExp.Replace(strData, ",")
oRegExp.Pattern = "(\""\:\"")"
strData = oRegExp.Replace(strData, ",")
oRegExp.Pattern = "[\{\}\""]"
strData = oRegExp.Replace(strData, vbNullString)
LoadFxRateData = strData
Set oRegExp = Nothing
End Function
為替データをフォームに表示する
為替データをカンマ区切りに加工する処理までが終われば、あとは簡単です。Split関数を使いデータをカンマごとに分解し、データを配列化した中から必要な部分をフォーム上のテキストボックスに表示します。
為替レートデータを配列化すると、各通貨ペアの先頭要素が1、27、53…のように26個おきに現れます。そこで、For〜Nextのカウンターの値を各通貨ペアの先頭をたどるようにし、レート情報などの必要な情報は先頭から相対位置で(何個目かで)参照しています。
また、表示先のテキストボックスは、コントロール名を工夫し「名称+行」の書式で参照できるようにしています。1つ目の通貨ペアを1行目として考え、Bidであれば「txtBid」に 1(行目)を組み合わせた「txtBid1」というテキストボックスに値を保存します。それ以降は、2つ目の通貨ペアであれば「txtBid2」、3つ目の通貨ペアであれば「txtBid3」というように、コントロール名の末尾の数字を変えると、目的のテキストボックスに値を保存できる仕組みです。
リスト 3
フォームのテキストボックスに表示する処理
72
:
:
:
90
91
92
93
94
95
96
97
97
99
100
101
:
:
:
116
117
118
:
:
:
為替ボード
Private Sub getFxRate()
:
(省略)
:
lRow = 1
For i = 0 To UBound(cRateList) - 26
Step 26
'通貨ペア名
Me(
"txtPairs" & lRow
).Value = Left(cRateList(
i + RATE_PAIR
), 3) _
& "/" _
& Right(cRateList(
i + RATE_PAIR
), 3)
'Bidとティック記号
Call UpDownStatus(Me(
"txtBid" & lRow
), cRateList(
i + RATE_BID
))
Me(
"txtBid" & lRow
).Value = cRateList(
i + RATE_BID
)
:
(省略)
:
lRow = lRow + 1
Next
:
(省略)
:
図 4
フォームの構造
タイマーの設定と管理
為替レートの取得処理は、約10秒ごとに定期的に取得します。そこで、フォームのタイマー機能を使い、定期的にデータを取得するようにしています。
フォームのタイマーイベントは250ミリ秒ごとに実行されるように設定し、次のデータ取得時間になったら、プロシージャ「getFxRate」を実行し為替レート情報の取得を行います。なお、フォームのタイマーイベントでは、レート変化時の点滅の管理も行っています。点滅表示は、レートが変化してから約1秒後にクリアします。
リスト 4
フォームのタイマーイベント
60
61
62
63
64
65
66
67
68
69
70
為替ボード
タイマ時
Private Sub Form_Timer()
If Now() >=
dteTimer
Then
'為替レート取得
Call getFxRate
End If
If Now() >=
dteClearSt
Then
'点滅のクリア
Call ClearStatus
End If
End Sub
リスト 5
次回の取得時刻を決める部分
72
:
:
:
79
80
81
82
83
:
:
:
123
為替ボード
Private Sub getFxRate()
:
(省略)
:
'次回のレート取得を実行する時刻
dteTimer
= DateAdd("s", TIMER_SEC, Now())
'点滅をクリアする時刻
dteClearSt
= DateAdd("s", TIMER_STATUS, Now())
:
(省略)
:
End Sub
サンプルプログラムの実行例
フォームを表示し<開始>ボタンをクリックすると、フォーム上に為替レートの一覧が表示されます。為替レートは、10秒おきに自動的に最新の情報に更新されます。また、レートに変化があった部分は、いわゆる「ピコピコ」で知らせます。
為替レートの更新を停止するときは、フォームを閉じるか<停止>ボタンをクリックしてください。このサンプルは、フォーム単独で動作します。他のツールへ流用するときは、フォームをコピーするだけの簡単仕様です。
図 5
サンプルプログラムの実行結果
注1:画像クリックで拡大します。拡大画像の左右をクリックすると、次や前の画像が表示されます。本サンプルは Access 2000以降に対応しています。
注2:データ取得元の仕様変更に対応しました(2014/01/10)。
Access VBA Tips+α
■VBA プログラミングサンプル
◆Access プログラミングサンプル
・
VBAでExcelを起動する/終了する
オートメーションによるExcel操作
・
VBAでExcelブックとワークシートを操作する
オートメーションによるExcelとブック/シートの操作
・
住所をもとにウェブブラウザで地図を開く
Shell関数とrundll32.exeを応用
・
ハイパーリンクを使って住所をもとに地図を開く
ラベルとハイパーリンクの応用
・
Accessウィンドウの位置や大きさを取得・変更する
API/MoveWindow関数とGetWindowRect関数
・
株価情報を取得しフォームに表示する
IEオートメーションとの合わせ技
・
株価時系列データを取得しテーブルに保存する
IEオートメーションとDAOデータ操作
・
為替レートを取得しフォームに表示する
MSXML2.XMLHTTP、タイマー処理、正規表現など
・
郵便番号検索ツールのサンプル(キット)
データは日本郵便が提供する「郵便番号データ」を使用
・
接続結果やSQL実行結果のチェックをする
・
完結しているMDBでテーブルを扱うためのクラス
◆VBA プログラミングサンプル
・
ミリ秒(1/1000秒)を求める
Timer関数の応用
・
シリアル値の時刻を求める
JavaScriptのDate/getTimeと同等
1970/1/1 0:0:0からの経過秒数
・
文字列中に含まれる単語の数を数える
自作関数「StrCount」
・
配列の実要素数や次元数を求める
自作関数「RBound」「DimSize」
・
汎用チェックディジット計算機
自作関数「getCheckDigit」
バーコード・口座番号など幅広く利用可能
・
現在値と前日値の差が何パーセントかを求める
自作関数「getChangePer」
・
現在値と変化量から何パーセント差かを求める
自作関数「getChangePerB」
・
時間を十進表記/時刻表記に変換する
1.5時間などの十進表記⇔1:30:00表記
自作関数「HourToDecimal」「DecimalToHour」
・
距離と速度から所用時間を求める
自作関数「getHourBySpeed」
・
距離と所用時間から平均時速を求める
自作関数「getSpeedByDistance」
・
平均速度と所用時間から距離を求める
自作関数「getDistanceBySpeed」
◆VBA アインシュタイン系サンプル
・
光速で何分かかるかを求める
自作関数「getHourByLightSpeed」
※[DL]にはサンプルファイルがあります
■DAOデータアクセス編
■ADOデータアクセス編
■クエリー(SQL)編
■フォーム・サブフォーム編
■レポート編
■Printerオブジェクト編
■コントロール基本編
■テキスト/コンボ/リストボックス活用編
■メニューバー・ツールバー編
■マクロ(DoCmd)編
■複数値と添付ファイル編
■Accessの操作と便利な機能編
■プログラミングサンプル編
■番外編1.HTTPやFTPを使うには
■サイト内を検索
Happy! Happy! Islandその他のコンテンツ
■
VBAプログラミング系
Access VBAのTipsとサンプル
Excel VBA(エクセルマクロ)のTipsとサンプル
VBScript/JScriptのTipsとサンプル
プログラミング基礎・入門
■
入門と使い方
Access入門と使い方講座97~2003/2007/2010/2013
Access VBAプログラミング入門 2013/2010/2007/2003
Excel入門と使い方講座2013/2010/2007
■
ダウンロードコーナー
AccessとExcelのフリーソフト
■
その他
質問受け付けコーナー「管理人に聞いてみよう♪」
BBS過去ログ広場
HTMLの書き方
管理人プロフィール
┗
twitter(外部サイト)
管理人へメール
■
別館(海外向けサイト)
Excel Games and Access Games
VBAプログラミング&Tips集の
"Happy! Happy! Island"トップページへ
[PR]管理人が心を込めて書いた本
■
最速攻略 AccessVBAサンプル大全集
Access 2013/2010/2007対応版
■
速効!ビジネスPC Accessマクロ&VBA
Access2013/2010/2007対応
■
最速攻略Accessクエリ テクニック大全集
Access2013/2010/2007対応
■
AccessVBAマクロ超入門講座 Access2010/2007対応
■
ExcelVBA超入門講座 Excel2010/2007対応
■
ExcelVBAでできる RPGゲーム作成入門
■
[改訂新版]実践COBOLプログラミング入門
■
最速攻略 VBScriptサンプル大全集
Windows7/Vista/XP/2000対応
(
アマゾン
へジャンプします)
[PR]注目の情報
転職成功の秘訣はサイトに公開されない求人にあった
採用人数が少ない・専門性が高い・競合他社に知られたくないなど、魅力的な求人情報ほど一般には公開できないのです。
株デビューするなら SBI証券!
業界屈指の格安手数料と業界最高水準のサービスで口座数はネット証券 No.1!口座開設料・管理料は無料。
GDOゴルフショップ
ゴルフ用品のオンラインメガストア。品揃え10万点!
アスタリフトコラーゲンドリンク
毎日続けるものだから・・まとめ買いで最大10%OFF!集中コラーゲンケアで、ハリと潤いの溢れる毎日へ。
[リンク]IT関連情報サイトなど
gihyo.jp
技術評論社提供のIT関連コンテンツサイト
Copyright(C) 1999-2015
結城圭介
(Ver.3.51) All rights reserved