はてなブックマークに追加
Facebookでシェア
Google+でシェア
Twitterでシェア
為替レートを取得しフォームに表示する
為替レートの情報を取得し、フォームに為替ボード風に表示するサンプルです。為替レートはリアルタイム、さらに自動更新します。為替レートのデータは、ヤフーファイナンスから取得するので安心(?)です。
本サンプルはExcel版「為替レートを取得しワークシートに表示する」もあります。解説の内容やサンプルの仕様は、ほぼ同じです。

サンプルダウンロード(2014/01/10更新)
このサンプルのテーマと仕組み
 ウェブ上からの情報取得がテーマのサンプルです。情報の取得元は、ヤフーファイナンスの為替情報(https://fx.yahoo.co.jp/chart/)にある為替ボードです。ウェブ上から為替レートのデータを取得し、フォームに為替ボードとして表示します。

図 1サンプルの概要(為替ボードを作成する)
ウェブページ上の為替ボードと同等のものを、Accessのフォーム上に再現します。

 ヤフーファイナンスの為替ボードは、約10秒ごとに新しいレートに更新されます。ただし、ページを再読込するのではなく、為替レートのデータを別な場所から取得しページ内の必要な部分を動的に書き換えて表示する仕組みとなっています。これは、ブラウザの開発者ツールで動作を確認すると一目瞭然です。
 そこで、本サンプルでも、同じように為替レートのデータを取得してフォームに表示します。ウェブ上からデータを取得するにはいくつかの方法がありますが、取得するデータの内容が一定の書式に従って定義・作成されたテキスト形式のデータであることと、一定間隔ごとにデータを取得しなくてはならないため、MSXML2.XMLHTTPというコンポーネントを使って取得します。

図 2開発者ツールでのキャプチャ例
IEの開発者ツールは{F12}キーで起動できます。
為替データの取得
 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)。


Copyright(C) 1999-2015 結城圭介(Ver.3.51) All rights reserved