駅すぱあと VBA SDKを使って、経路探索用の地点データを生成する

**本記事はヴァル研究所の支援として作成された記事です**

[駅すぱあとはAPIを公開](https://api-info.ekispert.com/)しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。

この駅すぱあと APIを利用しやすくするSDKを開発しはじめました。SDKはVBAで作っており、Excelなどから利用できます（Windowsのみ、macOSでは利用できません）。

今回は、スタンダードプランで提供されている地点生成APIに対応しました。この地点生成APIを使うと駅からではなく、施設からの最適な経路検索ができます。

たとえば、通勤手当の算出をするときに、会社の最寄駅が3駅（A駅から徒歩1分、B駅から徒歩3分、C駅から徒歩5分）ある場合、それぞれの従業員の自宅から会社のどの最寄駅を使うのが一番最適なルートかを自動的に判断できるといった具合です。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/0f3c8f2a-550e-211d-e1a2-0113c721aa57.png)


では、使い方を紹介します。

## 必要な情報

SDKを利用する際にはAPIキーが必要です。[無料トライアルがあるので、こちらから取得](https://api-info.ekispert.com/form/trial/)してください。

## 注意点

- SDKはWindowsでのみ動作します
- SDKは非公式です。公式サポートへの問い合わせはご遠慮ください

## ファイルのインポート

[こちらのリポジトリ](https://github.com/EkispertAPIMania/VBA-SDK)にある `*.cls` と `*.bas` ファイルをすべてインポートします。これらは以下のライブラリを含んでいます。

- [VBA-tools/VBA-Dictionary](https://github.com/VBA-tools/VBA-Dictionary)
- [VBA-tools/VBA-Web: VBA-Web](https://github.com/VBA-tools/VBA-Web)
- [VBA-tools/VBA-JSON](https://github.com/VBA-tools/VBA-JSON)

## 初期化

先ほど取得したAPIキーを使ってSDKを初期化します。

```vb
Dim client As Ekispert
Set client = New Ekispert
client.ApiKey = "YOUR_API_KEY"
```
## 地点生成の設定

地点生成を行う際には、まず経路を探索して、そのシリアライズデータが必要です。地点生成は `ToolboxCoursePointQuery` にて行います。

```vb
Dim Query1 As CourseExtremeQuery
Set Query1 = Client.CourseExtremeQuery()

' 出発地、目的地の設定
Query1.ViaList(0) = "高円寺"
Query1.ViaList(1) = "東京"

' 日付の設定
Query1.DateProp = Now

Dim Result1 As ResultSet
Result1 = Query1.Find()
```

そして、レスポンスにある `SerializeData` を使って、定期券の払い戻し計算用のクエリークラスである `CourseRepaymentQuery` にて払い戻し計算を行います。

```vb
Dim Query As ToolboxCoursePointQuery
Set Query = Client.ToolboxCoursePointQuery()

Query.Name = "ランドマーク名"
Query.StationCode(0) = 20001
Query.Time(0) = 5
Query.Fare(0) = 400
Query.Traffic(0) = "徒歩"
```

検索条件は [地点生成 \- 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/toolbox/course/point.html) にあるものを指定できます。

## 検索の実行

検索条件を設定したら、検索処理を実行します。結果は `ResultSet` クラスになります。探索がうまくいったかどうかは `ResultSet.Success` の値で判定してください。

```vb
Dim Result As ResultSet
Result = Query1.Find()

Debug.Print Result.Success ' True または False
```

### エラーだった場合

もし探索がエラーだった場合は `ResultSet.Error` の中にエラー情報があります（駅すぱあと APIからのエラーの場合）。

```vb
If Not Result.Success Then
    MsgBox Result.Error.Message
    Exit Sub
End If
```

### 成功した場合

処理が成功した場合、 `ResultSet.Point.SerializeData` にシリアライズデータが入っています。

```vb
Debug.Print Result1.Point.SerializeData ' 文字列
```

### 探索に利用する

そして、取得したシリアライズデータを使って、経路探索を行います。利用場所としては、 `ViaList` に代入します。

```vb
Dim Query2 As CourseExtremeQuery
Set Query2 = Client.CourseExtremeQuery()

Query2.ViaList(0) = "高円寺"
Query2.ViaList(1) = ResultSet.Point.SerializeData ' ここに代入

Query2.DateProp = Now

Dim Result2 As ResultSet
Result2 = Query2.Find()

If Not Result2.Success Then
    MsgBox Result2.Error.Message
    Exit Sub
End If
Debug.Print Result2.Courses(0).Prices(0).Oneway ' 360
```

## ソースコード

SDKのコードは以下のリポジトリにて公開しています。ライセンスはMIT Licenseです。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK/tree/main)

## まとめ

地点生成を利用することで、ひとつの地点に複数の最寄駅を設定した経路検索を行えるようになります。一例として「会社」という地点を生成し、自宅最寄駅から「会社」へ向かうなら代々木駅（23043）を利用するのが早くて安い経路、出先から「会社」へ向かうなら南新宿駅（22993）を利用するのが早くて安い経路、という検索が可能になります。

経費計算などをシステム自動化する際に、ぜひ駅すぱあと APIを利用してください。SDKを使えば、Excelなどから簡単に利用できます。

何か不具合があれば、Issueにて連絡いただければ対応します（macOSでは動かないので注意してください）。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK)