為替レートを取得しワークシートに表示する
為替レートの情報を取得し、ワークシートに為替ボード風に表示するサンプルです。為替レートはリアルタイム、さらに自動更新します。為替レートのデータは、ヤフーファイナンスから取得するので安心(?)です。
本サンプルはAccess版「
為替レートを取得しフォームに表示する
」もあります。解説の内容やサンプルの仕様は、ほぼ同じです。
サンプルダウンロード
(2014/01/10更新)
このサンプルのテーマと仕組み
ウェブ上からの情報取得がテーマのサンプルです。情報の取得元は、ヤフーファイナンスの為替情報(
https://fx.yahoo.co.jp/chart/
)にある為替ボードです。ウェブ上から為替レートのデータを取得し、ワークシートに貼り付けて、為替ボードとして表示します。
図 1
サンプルの概要(為替ボードを作成する)
ヤフーファイナンスの為替ボードは、約10秒ごとに新しいレートに更新されます。ただし、ページを再読込するのではなく、為替レートのデータを別な場所から取得しページ内の必要な部分を動的に書き換えて表示する仕組みとなっています。これは、ブラウザの開発者ツールで動作を確認すると一目瞭然です。
そこで、本サンプルでも、同じように為替レートのデータを取得してワークシートに表示します。ウェブ上からデータを取得するにはいくつかの方法がありますが、取得するデータの内容が一定の書式に従って定義・作成されたテキスト形式のデータであることと、一定間隔ごとにデータを取得しなくてはならないため、MSXML2.XMLHTTPというコンポーネントを使って取得します。
図 2
開発者ツールでのキャプチャ例
為替データの取得
MSXML2.XMLHTTPを使用してウェブ上のデータを取得する処理です。199〜201行目で参照するページのURLを生成、205行目でMSXML2.XMLHTTPオブジェクトを作成し、207〜226行目で同オブジェクトの機能を使用しウェブページを参照する処理を行います。URL生成時に乱数を組み合わせていますが、これはブラウザのキャッシュを取り出さないようにするためのものです。数字そのものに特に意味はなく、MSXML2.XMLHTTPでダウンロードを行うときによく使うテクニックです。
実際にウェブページを参照するリクエストの実行は217行目のSendメソッドで行いますが、基本的に非同期で実行するものであるため、ページのダウンロードが完了するまで何らかの方法で待機しなくてはなりません。
サンプルでは、219〜222行目で待機用のループ処理を設け、ダウンロードが完了するのを待っています。ダウンロードが完了したかどうかは、readyStateプロパティの値で判定します。4ならダウンロード完了です。また、ダウンロードしたテキストの情報は、responseTextプロパティから取得できます。
リスト 1
クラスのインスタンス生成と取得処理の起動
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
222
223
224
225
226
227
228
229
230
Module1
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
データの加工を行う処理
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
Module1
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のカウンターの値を各通貨ペアの先頭をたどるようにし、レート情報などの必要な情報は先頭から相対位置で(何個目かで)参照しています。
リスト 3
ワークシートに貼り付ける処理
42
:
:
:
58
59
60
61
62
63
64
65
66
67
68
69
70
71
:
:
:
Module1
Private Sub getFxRate()
:
(各種処理)
:
For i = 0 To UBound(cRateList) - 26
Step 26
'通貨ペア名
objSheet.Cells(lRow, 1).Value = Left(cRateList(
i + RATE_PAIR
), 3) _
& "/" _
& Right(cRateList(
i + RATE_PAIR
), 3)
'Bidとティック記号
Call UpDownStatus(objSheet.Cells(lRow, 2), cRateList(
i + RATE_BID
))
objSheet.Cells(lRow, 2).Value = cRateList(
i + RATE_BID
)
'Askとティック記号
Call UpDownStatus(objSheet.Cells(lRow, 4), cRateList(
i + RATE_ASK
))
objSheet.Cells(lRow, 4).Value = cRateList(
i + RATE_ASK
)
:
(各種処理)
:
さらに、Application.OnTimeメソッドを使って、次回の為替レート取得処理を実行します。Application.OnTimeメソッドは、指定した時間に、指定したプロシージャを実行するメソッドです。サンプルでは、現在の時刻から10秒後にプロシージャ「getFxRate」を実行するようにしています。自分自身(getFxRate)を繰り返し実行することで、ワークシート上の為替レートが常に更新されるという仕組みです。
リスト 4
次回の為替レート取得(タイマーの設定)
42
:
:
:
89
90
91
:
:
:
99
Module1
Private Sub getFxRate()
:
(各種処理)
:
'次回実行タイマーをセット
dteTimer = DateAdd("s", TIMER_SEC, Now())
Application.
OnTime
dteTimer, TIMER_PROC, , True
:
(各種処理)
:
End Sub
サンプルプログラムの実行例
プロシージャ「FxRate」を実行、もしくは
{Ctrl}+{R}
キーを押すと、ワークシート上に為替レートの一覧が表示されます。為替レートは、10秒おきに自動的に最新の情報に更新されます。また、レートに変化があった部分は、いわゆる「ピコピコ」で知らせます。
為替レートの更新を停止するときは、プロシージャ「TimerStop」を実行するか
{Ctrl}+{Q}
キーを押してください。
図 4
サンプルプログラムの実行結果
注1:画像クリックで拡大します。拡大画像の左右をクリックすると、次や前の画像が表示されます。本サンプルは Excel 2000以降に対応しています。
注2:データ取得元の仕様変更に対応しました(2014/01/10)
エクセルマクロTips
応用技・その他編
◇その他の便利な機能
1.カーソルは今何どこにいる?
・何行目、何列目にいるかを知る
2.データがある最終行を知る方法
・最終列も同じ要領で
3.ワークブックの名前を知る方法
・ワークシートの名前やワークシート数も
・もちろん開いているワークブック数も
4.ワークシートの関数を使う方法
・Worksheetfunctionオブジェクト
5.並べ替えをしてみよう
6.開いたときに自動で実行!
・Workbook/Openイベント
・Auto_Openプロシジャ
・自動実行を回避する場合
7.マクロの記録機能を使ってVBAの記述を調べる
8.ワークブックのパスを取得
9.新しいメニューを追加する
10.追加したメニューを変更する
11.追加したメニューを削除する
12.アドインを作る
・XLAのアプリケーション
13.アドインを組み込む、解除する
・AddIns()
・ダミーの処理Auto_Remove?!
14.Offsetプロパティ
・基準の位置から指定した分ずらした場所
15.ワークシートの背景に画像を設定する・解除する
16.ワークシート上のコントロールを操作する
・テキストボックスなどを作成・操作する方法
17.列番号から列名を求める
・Addressプロパティを応用したテクニック
18.列番号から列名を求める究極の技
・26進法に変換して求めるテクニック
19.シート見出しを自動的に並べ替える
・バブルソートとModeメソッドの組み合わせ
20.ワークブックを開いているかどうか調べる
・Workbooksコレクションを調べる
21.株価情報を取得しワークシートに表示する
・IEオートメーションとの合わせ技
22.株価時系列データを取得しワークシートに表示する
・IEオートメーションとユーザーフォーム
23.為替レートを取得しワークシートに表示する
・MSXML2.XMLHTTP、タイマー処理、正規表現など
24.フォルダ内を検索する(FileSearch非互換対策1)
・Dir関数を使ってフォルダを検索する方法
25.フォルダ内を下の階層まで検索する
(FileSearch非互換対策2)
・ShellとFolderItemsオブジェクトを使う方法
26.誕生日(生年月日)から年齢を求める
・DateDiff関数と論理式を応用する
27.ハイパーリンクを使って住所から地図を表示する
・Hyperlinks.AddとURLの編集
L1.不要な行/列を全て削除する
・いらないデータも一網打尽!で削除する[L]
L2.コード値から名前を取得する
・VLookup関数の応用技[L]
*その他の便利な機能のコンテンツは、整理・踏襲時に別カテゴリへ移動する場合があります。[L]の項目は、他のカテゴリの項目です。
◇処理効率の向上に関する事例
1.SelectやSelectionは使わない
2.オブジェクト変数の方が速い!?
・セルをオブジェクト変数経由で使う
3.データの最後を探す場合
4.合計や平均を求める場合
5.大量のデータを取り出す、書き込む
・配列を使った方法
6.単純なコピペはDestination:=で
・切り取り→貼付けも同じ要領で
7.連続した領域はオブジェクトで
・For Each In〜Nextを使う
8.トドメは画面描画をOFF!
◇その他
「Excel VBAでできるRPGゲーム作成入門」の紹介/前編
・付属ゲーム「真・魔討伝」について
「Excel VBAでできるRPGゲーム作成入門」の紹介/後編
・本書の内容と、CD-ROM特典について
「真・魔討伝」のトラブルシューティング
・ゲームがうまく動かない場合
■ブック・シート操作編
■セル・行・列操作編
■セル検索編
■Applicationオブジェクト・イベント編
■オートシェイプ操作編
■グラフ操作編
■応用技・その他編
■サイト内を検索
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