
- 操作環境(*):
- OS:Windows 11
- Webブラウザー:Edge
- 使用プラン:Microsoft 365 Business Premium
*SharePoint Online上のExcelファイルおよびMicrosoft Graph REST APIにアクセスできる組織アカウントでサインインしていること
なお、この記事では、VBAの使用許可や開発メニュー表示といった初期設定や、VBAエディタの使い方の説明は割愛いたします。
- ExcelOnline操作用APIについて
- Entra管理C API初期設定
- SharePoint Online上のExcelファイル用意
- 実行用Excelファイル用意
- 認可コード取得
- PostmanによるサイトID・ファイルID・トークン取得
ExcelOnline操作用APIについて
ExcelOnline(テーブル未使用)のAPIによる操作は、Microsoft Graph REST APIで実施できます。この記事で参考にした公式記事を以下に列挙します。
- OAuth2.0認証(ユーザー委任によるアクセストークン取得):
ユーザーの代わりにアクセスを取得 - Microsoft Graph | Microsoft Learn - セッション(永続セッション):
Excel の操作:セッション - Microsoft Graph v1.0 | Microsoft Learn - エラー処理:
Excel の操作:エラー処理 - Microsoft Graph v1.0 | Microsoft Learn - データ検索(使用範囲):
範囲:UsedRange - Microsoft Graph v1.0 | Microsoft Learn - データ追加・変更(セル範囲):
範囲を更新する - Microsoft Graph v1.0 | Microsoft Learn - データ削除(セル範囲):
範囲:削除 - Microsoft Graph v1.0 | Microsoft Learn*データ削除は動作上の問題があり今回のVBAでは使用しませんが、次の記事でPostmanの設定とコメントアウトしたソースのみ紹介します
Entra管理C API初期設定
以前の記事で紹介したSharePointリスト×APIの設定と流れは同じです。
WebブラウザーよりMicrosoft Entra管理センターにアクセスし、左メニューの[Entra ID>アプリの登録]を選択し、[新規登録]を選択します。

図表2-1 Entra管理センターのアプリ登録へ
以下の通り設定し、[登録]を選択します。
- 名前:(ExcelOnlineのAPIの接続用アプリであることが分かる名前)
- アカウントの種類:この組織ディレクトリのみに含まれるアカウント
- リダイレクトURL(選択肢):Web
- リダイレクトURL(値):https://localhost

登録が完了し、サブメニューの[概要]画面に遷移したら、以下の値を控えておきます。
- アプリケーション(クライアント)ID
- ディレクトリ(テナント)ID

サブメニューの[APIのアクセス許可]を選択し、[アクセス許可の追加]を選択します。

[Microsoft API]タブを選択し、[Microsoft Graph]を選択します。
この記事の最初の方で紹介した使用APIに関する公式記事によると、委任されたアクセス許可のFiles.ReadWriteが必要です。また、今回はSharePoint Online上のExcelファイルを操作するため、SharePointサイトの権限Sites.ReadWrite.Allも必要です。この後設定します。

以下の通り設定し、[アクセス許可の追加]を選択します。
- アプリケーションに必要なアクセス許可の種類:委任されたアクセス許可
- アクセス許可:Files>Files.ReadWrite、Sites>Sites.ReadWrite.All

[xxxxxに管理者の同意を与えます]を選択します。
管理者の同意確認に関するメッセージが表示されたら、[はい]を選択します。

サブメニューの[証明書とシークレット]を選択し、[クライアントシークレット]タブを選択し、[新しいクライアントシークレット]を選択します。

以下の通り設定し、[追加]を選択します。
- 説明:(SharePoint APIの接続用シークレットであることが分かる名前)
- 有効期限:(適宜設定)
元の画面で今追加したクライアントシークレットの値を控えておきます。

最後に、エンドポイントを確認しておきます。
サブメニューの[概要]を選択し、[エンドポイント]を選択します。
この記事では、[Oauth 2.0 承認エンドポイント (v2)]と[Oauth 2.0トークン認エンドポイント (v2)]を使用します。

SharePoint Online上のExcelファイル用意
前の記事の工程1で使用したExcelファイルに削除フラグ(del_flg)列を追加し、流用します。削除フラグの追加理由は、データ更新VBAの紹介時に説明します。

SharePointサイトのドキュメントに用意したExcelファイルをアップロードします。

実行用Excelファイル用意
VBAを実行するExcelファイルを用意します(拡張子はxlsm)。
- Menuシート:各ボタン(ActiveXコントロール)を押すと、SharePoint Online上のExcelファイルに接続し、データの検索や更新を行います。

- Searchシート:Menuシートの[書籍データ検索]ボタンを押すと、SharePoint Online上のExcelファイルのデータ検索結果をこのシートに出力します。

- Renewシート:このシートに追加・変更・削除対象(Action列で識別)のデータを入力しておき、Menuシートの[書籍データ反映]ボタンを押すと、SharePoint Online上のExcelファイルに反映されます。

- paramシート:工程2で控えたクライアントID・テナントID・クライアントシークレットの値を定義しておきます。サイトID・ファイルID、初回のアクセストークン・リフレッシュトークンは工程6で確認してこのシートに定義します。なお、アクセストークン・リフレッシュトークン・セッションIDは、Mainシートでボタンを押すと更新されます。

- VBAプロジェクト:Mainシート上にソースを実装します。画面に表示されているのは検索・更新ボタンクリック時にデータ検索・更新の関数を呼び出すソースです。

Web APIのデータのやり取りはJson型というデータフォーマットを使用します。こちらのサイトにVBA用の変換モジュールJsonConverter.basがあるので、ダウンロードします。

ダウンロードしたZIPを展開しておきます。VBAのプロジェクトエクスプローラ上で右クリックし、[ファイルのインポート]を選択します。
展開したファイル内のJsonConverter.basを選択します。
VBAのプロジェクトエクスプローラー上に、[標準モジュール>JsonConverter]が表示されます。

[ツール>参照設定]を選択し、[Microsoft Scripting Runtime]のチェックをオンにします。
これが未実施の場合、API呼び出し時のHTTPリクエストオブジェクトの作成でエラーが発生します。

認可コード取得
公式記事を参考に、テキストエディター等で認可コード取得用URLを作成し、WebブラウザーのURL欄に貼り付けて[Enter]キーを押します。
https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize?
client_id={client_id}&response_type=code&redirect_uri=https%3A%2F%2F2.zoppoz.workers.dev%3A443%2Fhttps%2Flocalhost%2F&
response_mode=query&scope=offline_access%20user.read%20Files.ReadWrite&state=12345

認証を要求されたら、組織のアカウントでサインインします。

Webブラウザー上でエラーが表示されたら、URLをテキストエディター等にペーストします。
URLの・・・code=xxx&state=・・・のxxx部分が認可コードです。次の工程で使いますので、この値を抽出しておきます。

PostmanによるサイトID・ファイルID・トークン取得
API開発ツール「Postman」を使い、認証およびデータ検索・更新時に必要となる値を取得します。Postmanの入手方法は以前の記事を参考にしてください。
環境設定
まずは環境を新規作成します。コレクションに直接設定値をベタ打ちもできますが、同じ接続先に色々なリクエストを試したい場合、ここで設定を変数化しておくと便利です。セキュアな情報はタイプをシークレットにします。
- auth_url:https://login.microsoftonline.com/{{tenant_id}}/oauth2/v2.0/token
*工程2の最後に確認した[Oauth 2.0トークン認エンドポイント (v2)]の値です
- tenant_id:工程2で控えたディレクトリ(テナント)ID
- client_id:工程2で控えたアプリケーション(クライアント)ID
- client_secret:工程2で控えたクライアントシークレット
- scope: https://graph.Microsoft.com/.default
- grant_type:authorization_code
- callback:https://localhost
*図表2-2で設定したリダイレクトURLの値です
- url: https://graph.microsoft.com/v1.0/sites/{{site_id}}
/drive/items/{{file_id}}/workbook/worksheets/data*上記URLは表示の都合で改行が入っていますが、使用時は改行を削除します*一番最後のdataはデータソースとなるExcelファイルのシート名です - site_id:この工程で取得するサイトID
- file_id:この工程で取得するファイルID
- code:工程5で取得した認可コード

サイトID取得
工程3でExcelファイルをアップロードしたサイトのIDを取得します。
- メソッド:GET
- URL:https://graph.microsoft.com/v1.0/sites/(ドメイン○○.comの○○部分).sharepoint.com:/sites/(サイト名)
- Headers>Content-type:application/json
- Authorization>Auth Type:OAuth2.0

Postmanでは、[Authorization]タブ下部の認証設定を行うことにより、サイトID取得時に必要となるアクセストークン取得も一緒に実施できます。
- Callback URL:{{callback}}
- Auth URL:{{auth_url}}/authorize
- Access Token URL:{{auth_url}}/token
- Client ID:{{client_id}}
- Client Secret:{{client_secret}}
- Scope:{{scope}}
- Token Request>grant_type:{{grant_type}}:Request Body
設定が完了したら、[Get New Access Token]を選択します。

[Authentication complete]と表示されたら、 [Proceed]を選択します。
アクセストークンが表示されたら、[Use Token]を選択します。

[Send]を選択し、画面下部に結果が表示されたら、"id":"xxx"のxxx部分がサイトIDとなります。
この値を図表6-1のPostman環境変数と、図表4-4の実行Excelのparamシートに定義します。

ファイルID取得
工程3でサイトにアップロードしたExcelファイルのIDを取得します。サイトのドライブIDを取得した後、この値を使用してファイルIDを取得する流れとなります。
工程6-2で追加したサイトID取得の設定で[・・・>Duplicate]を選択し、ドライブID取得の設定を追加します。
- メソッド:GET
- URL: https://graph.microsoft.com/v1.0/sites/{{site_id}}/drive
*{{xxx}}はxxxという変数として扱われます
サイトID取得時と同様に[Authorization]タブでアクセストークン取得を経て、[Send]を実行します。
画面下部に結果が表示されたら、最上位層の"id":"xxx"のxxx部分がドライブIDですので、この値を控えておきます。

工程6-2で追加したサイトID取得の設定で[・・・>Duplicate]を選択し、ファイルID取得の設定を追加します。
- メソッド:GET
- URL: https://graph.microsoft.com/v1.0/drives/(前の画面で控えたドライブIDの値)/root:/(工程3のチャネル名)/(工程3のファイル名)
*URL内のカッコ( )は不要です
サイトID取得時と同様に[Authorization]タブでアクセストークン取得を経て、[Send]を実行します。
画面下部に結果が表示されたら、最上位層"id":"xxx"のxxx部分がファイルIDとなります。
この値を図表6-1のPostman環境変数と、図表4-4の実行Excelのparamシートに定義します。

認可コードによるトークン取得
工程6-2,工程6-3では認可コードを使用しませんでしたが、APIでExcelファイルを操作する場合、初回は認可コードによるトークン取得(公式記事)が必要です。
- メソッド:POST
- URL:{{auth_url}}/token
- Headers>Content-Type:application/x-www-form-urlencoded
- Body>
- client_id:{{client_id}}
- client_secret:{{client_secret}}
- scope:https://graph.microsoft.com/.default
- grant_type:authorization_code
- code:{{code}}
- redirect_uri:{{callback}}

画面下部の実行結果内にaccess_tokenとrefresh_tokenの値が表示されます。
データ検索・更新で使用するアクセストークンは有効期間が短いです。VBAで実行する際は、リフレッシュトークンを使ってアクセストークンを更新し(公式記事)、更新されたアクセストークンを使ってデータ検索・更新を実施する形になります。
この後、VBAでの実装イメージ確認のため、このリフレッシュトークンを使ってアクセストークン更新用の設定を試してみます。

リフレッシュトークンによるトークン更新
以下の通り設定します。
- メソッド:POST
- URL:{{auth_url}}/token
- Headers>Content-Type:application/x-www-form-urlencoded
- Body>
- client_id:{{client_id}}
- client_secret:{{client_secret}}
- scope Files.ReadWrite
- grant_type:refresh_token
- refresh_token:工程6-4で取得したリフレッシュトークン

ここで得られたアクセストークンとリフレッシュトークンを、図表4-4の実行Excelのparamシートに定義します。

次の記事(ソースの紹介)に続きます。
当ブログ内の連載記事
当ブログ内の関連記事