# 利用TaiCOL API服務在EXCEL中依物種taxon_id查詢高階分類地位資料
###### tags: `Excel VBA` `TaiCOL API`
>* 我們這邊會引用到的TaiCOL的API服務是--**較高階層 API - higherTaxa**
服務網址:https://api.taicol.tw/v2/higherTaxa
(詳細的請見 https://taicol.tw/api TaiCOL的API服務說明)
>* 前面有寫過一篇用中文名查詢學名和taxon_id的文章
>-->由此去: https://hackmd.io/@hsinju/vba_001
### 1. 在VBA上,我們需要先準備好下列東西
1. 導入VBA中所需使用的 VBA-JSON - JsonConverter
a.至https://github.com/VBA-tools/VBA-JSON 下載 VBA-Json
(我這邊下載的版本是VBA-JSON v2.3.1)
b.在VBA>插入(I)>檔案 中,選取 VBA-Json資料夾內的JsonConverter.bas檔案
成功後如下圖所示(就可以看到一個名為JsonConverter的模組)

2. 引用 **"Microsofit WinHTTP Services, version 5.1"**, **"Microsofit Scripting Runtime"**, 和 **"mscorlib.dll"**
說明: 於 工具>設定引用項目 勾選上述3個項目....如下圖所示:

### 2. 開始編寫程式碼
```r=1
Sub HigherTaxaTaiCOL() '將這個巨集命名為HigherTaxaTaiCOL'
Dim idCode As String
Dim rank As String
Dim common_name_c As String
Dim apiUrl As String
Dim xhr As New WinHttpRequest
Dim json As Object
'設定選取範圍,針對選取範圍內的儲存格作業'
Selection.Select
Dim Rng As Range
For Each Rng In Selection
For Each cell In Rng
'取得儲存格內的名稱'
idCode = cell.Value
'取得對應名稱的API服務位置'
apiUrl = "https://api.taicol.tw/v2/higherTaxa?taxon_id=" & idCode
'請求回送'
xhr.Open "GET", apiUrl & Parameters
xhr.Send
'解析數據'
Set json = JsonConverter.ParseJson(xhr.ResponseText)
Dim datas As Collection
Set datas = json("data")
'下面這邊要利用ArrayList將所查尋到的內容,歸納整理我們要的資料'
Dim ranks As ArrayList, name_c As ArrayList, name_f As ArrayList
Dim rk As Variant
Set ranks = New ArrayList
Set name_c = New ArrayList
Set name_f = New ArrayList
'這定一組資料rk,依序放入"Species", "Genus", "Family", "Order", "Class", "Phylum"'
'須注意,第一筆資料序號是0,因此序號對應的資料依序是 0=speices, 1= genus, 2= family,3= order, 4=class, 5= phylu'
rk = Array("Species", "Genus", "Family", "Order", "Class", "Phylum")
Set ranklist = New ArrayList
'可在即時資訊視窗顯示回傳部分結果,此行可省略也沒關係'
Debug.Print rk(0), rk(4)
'開始寫入各階層的對應資料'
Dim data As Dictionary
For Each data In datas
ranks.Add data("rank")
name_c.Add data("common_name_c")
name_f.Add data("formatted_name")
Next data
'回傳資料並輸出資料'
Dim k0 As Integer, k1 As Integer, k2 As Integer, k3 As Integer, k4 As Integer, k5 As Integer
'如果找到ranks這個資料裡面有"指定階層",則在旁邊欄位寫入學名和中文名'
If ranks.Contains(rk(5)) = True Then
k5 = ranks.IndexOf(rk(5), 0)
cell.Offset(0, 1).Value = name_f(k5)
cell.Offset(0, 2).Value = name_c(k5)
End If
If ranks.Contains(rk(4)) = True Then
k4 = ranks.IndexOf(rk(4), 0)
cell.Offset(0, 3).Value = name_f(k4)
cell.Offset(0, 4).Value = name_c(k4)
End If
If ranks.Contains(rk(2)) = True Then
k2 = ranks.IndexOf(rk(2), 0)
cell.Offset(0, 5).Value = name_f(k2)
cell.Offset(0, 6).Value = name_c(k2)
End If
If ranks.Contains(rk(0)) = True Then
k0 = ranks.IndexOf(rk(0), 0)
cell.Offset(0, 7).Value = name_f(k0)
cell.Offset(0, 8).Value = name_c(k0)
End If
Next
Next
End Sub
```
### 執行成果
**這樣就成功啦!!**
以t0081496為例,執行這個巨集,會傳回來的資訊會長這樣

如果學名的部分,不想要有格式記號,可以把第72行的name_f.Add data("formatted_name"),改成name_f.Add data("simple_name")就可以了
by *Hsin-Ju*
*2024.11.20*
---
推薦YT上的學習影片:
**Use Excel VBA to Read API Data**
by **Excel Macro Mastery**
https://www.youtube.com/watch?v=KZeYKZJzQIk&t=527s
感謝 TaiCOL 團隊解惑
感謝 timhall 於 github 釋出的 VBA-JSON v2.3.1