Monex Joo API のExcel Vba 見本をつくってみました。
動作の内容は、小さなフォームを表示しボタンを押すと貼り付けてあるラベルのそれぞれに、USDJPYの通貨ペア(bid/ask)をリアルで出力する。というものです。発注機能などはありません。簡単な流れを説明すると、マネックスFXサーバーから自宅PCのMonex Jooに為替データが送信される。データが更新されるタイミングは概ね数百ミリ秒前後かな。これより短い場合も長い場合もある。このデータをCOMを経由してバッファにとりにいく。Windows APIの setTimer()関数 に所定の値をセットして、ぐるぐるまわすイメージ。例えばバケットが等間隔についているベルトコンベアで順繰りに水を汲みトレイに流してやるようなイメージなら理解可能だろうか。vb2008とかvc#2008なら自動でもらい続けることができるけど、ExcelVbaとかvb6は自前でとりにいかなければいけないのだ。以下はExcel2007のvbaで試しましたが、多分Excel2000でも動くはず。当然のことながら Monex Joo が起動していて、かつ設定でその他の [マネックスJoo利用規約に同意し、マネックスJooトレーディングAPIを使用する。]にチェックを付けておく必要があります。--------------------------------### 各モジュールの名称と種類 ###--------------------------------1.ThisWorkbook ThisWorkbook2.フォーム UserForm1 フォームにはbit/askのレート表示用ラベルを2個貼り付けて、 ラベルのオブジェクト名をそれぞれ USDJPYbid,USDJPYask, に変更しておく。 レート取得開始用ボタンと停止用ボタンを2個貼り付けておく。3.標準モジュール 以下のように名称を変更してください。 変更しなくても動くとおもうがわかりやすいので。 Module1 → userAPISetTimer Module2 → userJooChk Module3 → useVariable上記の解説1.は規定のThisWorkbook フォームを自動起動したり、MonexJooのAPIが起動しているかどうかを判定する。2.はユーザーフォームなので右クリックしてサブメニューの挿入(N)→ユーザーフォーム(U) から選び追加しておく。ラベル2個とボタン2個を追加しておく。3.は標準モジュールを右クリックしサブメニューから挿入(N)→標準モジュール(M)で Module1,Module2,Module3,の3つを追加しておき名称変更する。しなくてもよい。'/// 以下はそれぞれのモジュールに貼り付けるvbaの内容である ///1.------- ThisWorkbook 以下に貼り付ける内容 ---------Option Explicit'開いたときに自動実行Sub workbook_open() UserForm1.Show Call ChkAPISV ' API起動チェック Call realtimeRateStart ' 開始準備End Sub2.------- UserForm1のコード部分に貼り付ける内容 ----------Option Explicit'レート取得開始Private Sub CommandButton1_Click()Dim id As Integer ' hwnd = フォームまたはコントロールのハンドルを返します。 '+--- ハンドル, ? , ミリ秒の値, タイマー呼び出しするプロシージャ名 -----+ 'id = SetTimer(hwnd, 31000&, 250&, AddressOf realtimeRateDisp) 'タイマーProc呼び出し id = SetTimer(Application.hwnd, 31000&, 10&, AddressOf realtimeRateDisp) 'タイマーProc呼び出しEnd Sub'レート取得停止Private Sub CommandButton2_Click() Call kills 'KillTimer hwnd, 31000& 'id タイマー停止 Call realtimeRateStop 'レート取得停止End Sub3.------- 標準モジュール名ごとに貼り付ける内容 -------------'-----------------------------------------'### 標準モジュール名:userAPISetTimer ###'-----------------------------------------Option Explicit'(標準モジュール)Public Declare Function SetTimer Lib "user32" _ (ByVal hwnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib "user32" _ (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long' タイマーを止めるSub kills() ' Application.hwnd は最上位のWinハンドル取得 'Debug.Print Application.hwnd KillTimer Application.hwnd, 31000& 'idEnd Sub'------------------------------------'### 標準モジュール名:userJooChk ###'------------------------------------Option Explicit' APIサーバ起動チェックPublic Function ChkAPISV() As BooleanDim chkprice ChkAPISV = False 'sWkProcess = "APIサーバ起動チェック" '+--- レート取得関数: GetRealtimeRateCache() ---+ chkprice = omFXAPI.GetRealtimeRateCache("USD/JPY", "bidPriceValue") If Left(chkprice, 16) = "APIサーバを起動してください。" Then sWkDescription = chkprice Exit Function Else Debug.Print "API_ok" End If ChkAPISV = TrueEnd Function' サンプル1 (リアルタイムレート受信開始を設定します。)' 開始準備ボタンから呼び出される。Sub realtimeRateStart()Dim omFXAPI As New Joo_FXAPI.ComApiDim oWkPairResult As PairResultEntityDim oWkCurrencyPair(0) As Variant Const error_message As String = "エラーが発生しました。" & ", " oWkCurrencyPair(0) = ECurrencyPair_USDJPY '+--- Set oWkPairResult = omFXAPI.RealtimeRate(oWkCurrencyPair, True, Nothing) '+--- 通貨ペアの項目にvbNullString=(0)を指定すると全部の通貨ペアになる ---+ 'Set oWkPairResult = omFXAPI.RealtimeRate(vbNullString, True, Nothing) If oWkPairResult.returnCode 0 Then MsgBox error_message & oWkPairResult.returnCode & ", " _ & oWkPairResult.returnMessage, vbOKOnly + vbCritical End If Set omFXAPI = NothingEnd Sub'サンプル2(リアルタイムレート受信停止を設定します。)'このサンプル2を実行することにより、リアルタイムレートの受信が停止されます。Sub realtimeRateStop()Dim omFXAPI As New Joo_FXAPI.ComApiDim oWkPairResult As PairResultEntityDim oWkCurrencyPair(0) As VariantConst error_message As String = "エラーが発生しました。" & ", " oWkCurrencyPair(0) = ECurrencyPair_EURJPY Set oWkPairResult = omFXAPI.RealtimeRate(oWkCurrencyPair, False, Nothing) If oWkPairResult.returnCode 0 Then MsgBox error_message & oWkPairResult.returnCode & ", " _ & oWkPairResult.returnMessage, vbOKOnly + vbCritical End IfSet omFXAPI = NothingEnd Sub'-------------------------------------'### 標準モジュール名:useVariable ###'-------------------------------------Option ExplicitPublic omFXAPI As New Joo_FXAPI.ComApiPublic oWkPairResult As PairResultEntityPublic prevContract As ContractNoticeEntityPublic nIDEvent As Long'Public sWkProcedure As String'Public sWkProcess As StringPublic sWkDescription As StringPublic USDJPY_bidPrice As String, USDJPY_askPrice As String 'USDJPYSub realtimeRateDisp()On Error Resume Next '←必須。これがないとExcelが落ちる。 Dim iWkorderPrice As New PriceUnitEntity '●現在値など Set iWkorderPrice = omFXAPI.GetRealtimeRateCache("USD/JPY", "bidPrice") '変数にレートを受け取る USDJPY_bidPrice = omFXAPI.GetRealtimeRateCache("USD/JPY", "bidPriceValue") 'USDJPY USDJPY_askPrice = omFXAPI.GetRealtimeRateCache("USD/JPY", "askPriceValue") ' 'ラベルに変数のレートを出力する UserForm1.USDJPYbid.Caption = Format(USDJPY_bidPrice, "##0.##0") 'bid UserForm1.USDJPYask.Caption = Format(USDJPY_askPrice, "##0.##0") 'askEnd Sub注意)APIは注意しないと暴走の恐れがあるので自己責任で扱って下さい。Windows のAPIは標準モジュールでないと動かない。Error処理は考慮されていません。独自に付加して下さい。基本的にはMonexJooのマニュアルを参照して下さい。上記は私個人の判断で公表されているサンプルを抜粋したものですから動作しない可能性もあります。WindowsXP sp3 Excel2007 の環境で試しました。