VBAによるAPIの利用


APIとは

APIとはアプリケーションプログラミングインタフェース(Application Programming Interface)のことで、簡単に言えばソフトウェアの機能をほかのプログラムから利用するために用意されたサービスの窓口ようなものです。

普段はあまり意識することがないかもしれませんが、例えばWindowsを使っているとき、ほとんどのアプリケーションがWindowsのAPIを利用しています。

VBAに用意された関数のほかにWindowsAPIを直接呼び出して使うことができます。


簡単なAPIの呼び出し

WindowsAPIにもたくさんありますが、ここでは一つだけSleep関数を使ってみます。


'スリープ関数のテスト
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

Sub sleepTest()
    Dim i As Long
    For i = 1 To 20
        Sleep 400 '※指定のミリ秒スリープさせる
        Cells(i, 1) = i
        DoEvents
    Next
End Sub

先頭に見慣れない記述がありますが、これはWindowsAPIを使ってSleep関数を呼び出すための宣言です。

この宣言を書かずに実行した場合、Sleep関数が定義されていないため、エラーになります。

Declareステートメントがないためエラー

#IF~#END IFの部分(IFDEF:イフデフ)はプリプロセッサ命令と呼ばれ、条件を満たした場合にそれぞれの記述が有効になります。

#IF VBA7 ThenというのはExcelが64bit版か否かを調べています。

WindowsのAPIは32ビットか64ビットかによって使用するための宣言方法が異なるため、両方に対応するためにこのような記載方法をすることがあります。

実行環境等が変わってもプログラム自体を書き換えずにコンパイルできる点が便利なためC言語などでよく見られる書き方ですが、VBAで乱用すると単に可読性を下げかねないため、自分の環境が明らかであればいずれか一方だけ記述するようにして問題ありません。

上記コードを実行すると、Sleep関数で指定した時間(ミリ秒)だけSleep(スリープ)しながら処理が実行されていることが確認できるはずです。


WebAPIの利用

次に、様々なWebサービスにアクセスするために用意されたAPIであるWebAPIを使ってみましょう。

APIとは言っても、前述のように関数形式で呼び出すことができたWindowsAPIのSleep関数とはだいぶ勝手が違います。

APIの利用にあたってはある程度の専門性を前提としていることが多いですが、WebAPIを利用することでWebサイトやアプリ上で行われている処理を自分のプログラムで実現できるようになります。

ただし、Web上の情報を取得するだけであればそう大きな問題になりませんが、証券会社等でオンライン注文や送金等のような手続きをAPIを使って行う場合には十分な注意が必要です。

WebAPIを利用する場合、認証が必要なもの(Private)と必要のないもの(Public)があります。

PrivateAPIを利用する場合にはAPIKeyやパスワードの発行など、PublicAPIに比べて面倒な手続きが必要になりますが、多くの場合その分便利な機能が用意されており、使用する際に考えるべきリスクも大きくなります。

まずはPublicAPIを使って練習をしてみますが、練習とはいってもあまりに使い方の想像ができないものでは意味がありません。

ここでは、2018年1月26日に巨額の仮想通貨NEM(ネム)が流出した事件で話題になったコインチェック(coincheck)のPublicAPIを使って、ビットコインのティッカーを取得するプログラムを作成してみましょう。

コインチェックの取引所API概要

WebAPIを利用するには、所定のパラメータ、ヘッダーを追加したHTTPリクエストを作成して対象のAPIアドレスに送信する必要があります。

取引所API概要に詳しく説明されていますが、今回ティッカーを取得するための要素は以下のようになります。

これらをもとに、VBAからHTTPリクエストを送信するためのプログラムを作成します。

下図のように、参照設定にMicrosoft XMLを追加してください。

XMLの参照設定

なおこのとき上図ではMicrosoft XMLには、v3.0とv6.0が表示されていますが、使用環境によって参照設定すべきバージョンが異なります。

サンプルコードはWindows7で作成したためv6.0を参照しましたが、Windows8以降で作業をする場合、v3.0を参照するか、下記サンプルコードで"MSXML2.XMLHTTP"としているところを"MSXML2.XMLHTTP60"に書き換えてください。

詳しくはWindows 8 以降の MSXML2.DOMDocument の使用方法を参照してください。

コインチェックAPIを利用してビットコインのティッカーを取得するサンプルコード


Option Explicit
Sub apiTest()
    Dim response As String 'レスポンス
    Dim http As New MSXML2.XMLHTTP 'XMLHttpRequest
    http.Open "GET", "https://coincheck.com/api/ticker", False 'リクエスト
    http.send Null '送信
    response = http.responseText '受信メッセージ
    MsgBox response '結果表示
End Sub

上記のように新しいXMLHttpRequestを作成し、メソッド(GET)を指定してビットコインのティッカーを返すAPIのアドレス(https://coincheck.com/api/ticker)に送信すると、以下のように結果が返ってきます。

ティッカーのレスポンス

これだけ単純なプログラムでビットコインのティッカーを取得することができました。

さて、APIからのレスポンスは、多くの場合上のようにJSON形式の文字列になっています。

今回のような単純な結果であれば見ただけで内容が分かりますが、複雑なレスポンスや返ってきたテキストをプログラムで使用したい場合やJSON形式でデータを送信する必要がある場合にはテキストをJSON形式に変換(又はその逆)する必要があります。

JSONを解析するプログラムを自分で作ってみるのも面白いかもしれませんが、既に使いやすいコードが公開されていますので、こちらを使うとよいでしょう。→VBA-JSON

JsonConverter.basをインポートすると、例えば以下のようにJsonConverter.ParseJson関数の引数にJSON形式の文字列を渡せば簡単にJSON形式の文字列を解析してディクショナリに変換することができるようになるなど、VBAからJSONを扱うのが簡単になります。

JSON文字列をDictionaryに変換

なおDictionaryを使用するため、あらかじめ参照設定(※Dictionaryの解説を参照)が必要です。

また、ヘッダーに様々な情報を追加する必要がある場合もあります。上記サンプルではヘッダーを指定していませんが、ヘッダーの指定(setRequestHeader)を含め、HttpRequestについての解説はこちらが分かりやすいです。→解説1. XMLHttpRequest

webAPIの利用にあたっては、APIキーやパスワードの管理などのセキュリティに気を配り、過度なリクエストの送信を行わないようにする、また十分なデバッグとプログラムの実行によって生じる可能性のある問題の事前検討など、くれぐれも注意することを心がけるようにしてください。

APIを利用したプログラムの応用

VBAによるプログラミングに慣れてくると、より高度なプログラムを作成してみたくなるかもしれません。
ちょうどこのページで仮想通貨取引のwebAPIを経験してみたのですから、仮想通貨取引を自動で行ったり、補助してくれるようなプログラムを作ってみるのも面白いでしょう。

もし興味があればこちらのサイト(VBAによる仮想通貨ビットコイン自動売買入門)もご覧になってみてください。

VBAを通じて他のプログラミング言語に興味を持ち、学ぶのも大切なことですがVBAでできることも十分に多いです。

APIを使いこなせるようになれば、VBAで実現できることの幅はさらに広がり、VBAでプログラミングするのがますます楽しくなってくることでしょう。