「Microsoft GraphをVBAから呼び出してOneNoteのページ内容を取得する」記事で触れていた“Excel REST API”ですが、知らぬ間に使えるようになっていたみたいです。
それならばやることは一つ。
VBAから呼び出してみたいと思います。
下準備
APIを利用するために、Azure ADの設定やらクライアント IDの取得やらが必要になるのですが、作業手順は「Office 365 Unified APIをVBAから呼び出す」で書いていることとほぼ同じなので、ここでは割愛します。
- アプリケーションの種類:ネイティブ クライアント アプリケーション
- リダイレクト URI:http://localhost/WBSample
- 他のアプリケーションに対するアクセス許可:Microsoft Graph
- デリゲートされたアクセス許可:Have full access to user files
取得するWorkbook
今回は下図のように、OneDriveに置いてある「SampleBook.xlsx」の「SampleSheet」シート、セルB3の値を取得してみます。


VBAコード
さっそく書いたコードが下記になります。
authorization code取得
↓
access token取得
↓
OneDriveに保存されたファイルの中からSampleBook.xlsxのIDを取得
↓
Excel REST APIを呼び出してセルの値を取得
処理としては上記のような流れになります。
Option Explicit
Public Sub SampleExcelRestAPI()
'サンプル - Microsoft Graph(Excel REST API)呼び出し
'※ ScriptControlを使っているため、32ビット環境のみ対応
'※ リダイレクト URIをlocalhostにしている場合は、ローカルサーバー(XAMPP他)の起動が必要な場合があります。
Dim url_auth As String
Dim url_token As String
Dim url_api As String
Dim q As String
Dim code As String
Dim js As String
Dim access_token As String
Dim workbook_id As String
Dim dat As Variant
Dim ary As Variant, ary2 As Variant
Dim req As Object
Dim sc As Object
Dim items As Object
Dim item As Object
Dim i As Long
Dim value, values, id, name 'JSONパース用ダミー
Const READYSTATE_COMPLETE = 4
'***********************************
'※ 要変更
'***********************************
Const client_id As String = "(クライアント ID)" 'クライアント ID
Const redirect_uri As String = "http://localhost/WBSample" 'リダイレクト URI
Const workbook_name As String = "SampleBook.xlsx" '取得するWorkbook名
Const worksheet_name As String = "SampleSheet" '取得するWorksheet名
'***********************************
'authorization code取得
code = "" '初期化
url_auth = "https://login.microsoftonline.com/common/oauth2/authorize?response_type=code" & _
"&redirect_uri=" & EncodeURL(redirect_uri) & _
"&client_id=" & client_id & _
"&resource=" & EncodeURL("https://graph.microsoft.com/")
With CreateObject("InternetExplorer.Application")
.Visible = True
.AddressBar = False
.MenuBar = False
.StatusBar = False
.Toolbar = False
.Width = 600
.Height = 480
.Navigate url_auth
While .ReadyState <> READYSTATE_COMPLETE Or _
.Busy = True Or _
(StrComp(Left(.LocationURL, Len(redirect_uri)), redirect_uri) <> 0)
DoEvents
Wend
q = .document.parentWindow.Location.Search
q = Mid(q, 2) '"?"削除
ary = Split(q, "&")
For i = LBound(ary) To UBound(ary)
ary2 = Split(ary(i), "=")
If LCase(ary2(0)) = "code" Then
code = ary2(1)
Exit For
End If
Next
End With
If Len(Trim(code)) < 1 Then Exit Sub
'access token取得
js = "": access_token = "" '初期化
url_token = "https://login.microsoftonline.com/common/oauth2/token"
dat = "grant_type=authorization_code" & _
"&code=" & code & _
"&client_id=" & client_id & _
"&redirect_uri=" & EncodeURL(redirect_uri)
Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
With req
.Open "POST", url_token, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send dat
Select Case .Status
Case 200: js = .responseText
End Select
End With
If Len(Trim(js)) < 1 Then Exit Sub
js = "(" & js & ")"
Set sc = CreateObject("ScriptControl")
With sc
.Language = "JScript"
access_token = .CodeObject.eval(js).access_token
End With
If Len(Trim(access_token)) < 1 Then Exit Sub
'OneDriveのファイル列挙
js = "": workbook_id = "" '初期化
url_api = "https://graph.microsoft.com/beta/me/drive/root/children"
With req
.Open "GET", url_api, False
.setRequestHeader "Authorization", "Bearer " & access_token
.send
Select Case .Status
Case 200: js = .responseText
Case Else: Debug.Print .responseText
End Select
End With
If Len(Trim(js)) < 1 Then Exit Sub
js = "(" & js & ")"
'Workbook ID取得
With sc
.Language = "JScript"
Set items = .CodeObject.eval(js).value
For Each item In items
If item.name = workbook_name Then
workbook_id = item.id
Exit For
End If
Next
End With
If Len(Trim(workbook_id)) < 1 Then Exit Sub
'指定したWorksheetのセルB3の値を取得
js = "" '初期化
url_api = "https://graph.microsoft.com/beta/me/drive/items/" & workbook_id & _
"/Workbook/Worksheets/" & worksheet_name & "/Range(address='B3')"
With req
.Open "GET", url_api, False
.setRequestHeader "Authorization", "Bearer " & access_token
.send
Select Case .Status
Case 200: js = .responseText
Case Else: Debug.Print .responseText
End Select
End With
If Len(Trim(js)) < 1 Then Exit Sub
Debug.Print js 'レスポンス(JSON)確認用
js = "(" & js & ")"
With sc
.Language = "JScript"
MsgBox "Workbook:" & workbook_name & vbNewLine & _
"Worksheet:" & worksheet_name & vbNewLine & _
"セルB3:" & .CodeObject.eval(js).values, vbInformation + vbSystemModal
End With
MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub
Private Function EncodeURL(ByVal Target As String) As String
'URLエンコード
With CreateObject("ScriptControl")
.Language = "JScript"
EncodeURL = .CodeObject.encodeURIComponent(Target)
End With
End Function
問題なくAPIの呼び出しが行われると、下図のようにセルの値がメッセージボックスで表示されます。

ちなみに、セルを取得(Get Range)した際には下記のようなレスポンスが返ってきます。
{
"@odata.context": "https://graph.microsoft.com/beta/$metadata#range",
"@odata.type": "#microsoft.graph.range",
"@odata.id": "/users('********-****-****-****-************')/drive/items('**********************************')/workbook/worksheets('{00000000-0001-0000-0000-000000000000}')/range(address='B3')",
"address": "SampleSheet!B3",
"addressLocal": "SampleSheet!B3",
"cellCount": 1,
"columnCount": 1,
"columnHidden": false,
"columnIndex": 1,
"formulas": [
["Test"]
],
"formulasLocal": [
["Test"]
],
"formulasR1C1": [
["Test"]
],
"hidden": false,
"numberFormat": [
["General"]
],
"rowCount": 1,
"rowHidden": false,
"rowIndex": 2,
"text": [
["Test"]
],
"values": [
["Test"]
],
"valueTypes": [
["String"]
]
}
私が試した限りでは、まだプレビュー版であるためか上手く結果が返ってこないメソッドもありましたが、出番が多そうなAPIなので今後に期待したいと思います。
参考Webページ
- Microsoft Graph Explorer
- https://graph.microsoft.io/ja-jp/graph-explorer
- Excel REST API
- https://graph.microsoft.io/ja-jp/docs/api-reference/beta/resources/excel
- Workbook resource type
- https://graph.microsoft.io/ja-jp/docs/api-reference/beta/resources/workbook
- Worksheet resource type
- https://graph.microsoft.io/ja-jp/docs/api-reference/beta/resources/worksheet
- Range resource type
- https://graph.microsoft.io/ja-jp/docs/api-reference/beta/resources/range
- microsoft-graph-docs
- https://github.com/OfficeDev/microsoft-graph-docs/tree/master/api-reference/beta/api



















この記事へのコメントはありません。