連載第11回の目的
連載第11回では、前回の続きとしてExcel VBAにおけるYouTube APIの活用について紹介します。前回で、APIの概要を紹介し、APIキーの取得やAPI呼び出しをテストしました。今回はワークシートを準備してスクリプトを作成し、サンプルを完成させます(図1)。
▼完成サンプルのExcelファイル
https://github.com/wateryinhare62/mynavi_excelvba_webservice
なお、本連載では動作確認をWindows 10 Pro(64bit)、Microsoft 365(Excel 16.0、VBA 7.1)で行っています。旧バージョンや単体のExcelで試す場合にはご注意ください。今回はWebブラウザも使用しますが、Google Chromeに限定しています。他のWebブラウザは考慮していませんのでご注意ください。
ワークシートの準備
APIが使えることを確認できたら、ワークシートを用意し、基本的なデザインを行っていきましょう。配置および書き込むものは、以下の通りです。
- アプリケーションのタイトル(セルのテキスト)
- 「キーワード検索する」ボタン(SearchCommandButton)
- 「動画を再生する」ボタン(PlayCommandButton)
- キーワードと検索結果を収納する表(セルのテキスト)
上記のテキストおよびコントロールを、図2を参考に書き込み、配置してください。具体的な手順は、第6回などを参考にしてください。
コントロールを配置する
2つのコントロール(コマンドボタン×2)をワークシート上部に配置して、プロパティを設定します。これらのプロパティの内容は、表1のとおりです。
表1:各コントロールに設定するプロパティ
コントロール | プロパティ | 値 |
---|---|---|
「キーワード検索する」ボタン | Name | SearchCommandButton |
Caption | キーワード検索する | |
「動画を再生する」ボタン | Name | PlayCommandButton |
Caption | 動画を再生する |
キーワードと検索結果を収納する表
表は、以下の構成とします。とりあえず、10個のキーワードを登録することにします。
- 「No」(番号、プログラム上は意味はありません)
- 「キーワード」(検索する動画のキーワード)
- 「タイトル」(検索で取得した動画のタイトル)
- 「ID」(検索で取得した動画のID)
ここで、ブックを保存します。ブック名は何でもよいですが、形式を「Excel マクロ有効ブック (*.xlsm)」にしてください。マクロを有効にしておかないと、VBAのスクリプトを実行できないからです。このあとも、適当なタイミングでブックを保存してください。
ライブラリ等を準備する
スクリプトを書き始める前に、必要なライブラリ等の準備をしておきます。
VBA-JSON
Data APIは、基本的に結果をJSONデータで返します。このようにVBAからJSONデータを使いますので、そのために必要なライブラリを準備します。第3回などと同様に、「VBA-JSON」というサードパーティのライブラリを使用します。第3回の記事を参照して、「Microsoft Scripting Runtime」への参照設定を有効にすることを含めて、VBA-JSONを準備してください。
Selenium Type Library
VBAから、第10回でインストールしたSelenium Basicを利用するために、タイプライブラリである「Selenium Type Library」への参照を有効にしておきます。参照設定の方法は上記の「Microsoft Scripting Runtime」と同様です。以下の画面を参考に、有効にしてください。
[NOTE]オートメーションエラーが発生する場合
--------------------------------------------------------------------------------
Seleniumの呼び出しで、「オートメーションエラー」が発生することがあります。これは、.NET Framework 3.5がインストールされていないことが原因です。Windows 10では、.NET Framework 3.5が有効になっていないことがありますので、エラーが発生する場合には有効化してください。具体的には、スタートメニューから「設定」(歯車アイコン)を開き、[アプリ]から[プログラムと機能]をクリックします。ここから[Windowsの機能の有効化または無効化]をクリックして表示される画面で、「.NET Framework 3.5(.NET 2.0および3.0を含む)」にチェックを入れて[OK]をクリックします。これで.NET Framework 3.5が有効になります。
--------------------------------------------------------------------------------
スクリプトを書いていく
ここから、Visual Basic Editorを使って、以下の順番でスクリプトを書いていきます。左ペインの「Microsoft Excel Objects」の「Sheet1 (Sheet1)」をダブルクリックして開くファイルに、以下のスクリプトを記述していきます。
- エンドポイントURLやAPIキーの定数を定義するスクリプト
- APIにアクセスするスクリプト
- キーワードから動画名とIDを取得するスクリプト
- IDから動画を再生するスクリプト
エンドポイントURLやAPIキーの定数を定義するスクリプト
エンドポイントURLやAPIキーといった、アプリケーションの実行中に変化しない文字列は、定数として定義しておきます。なお、定数の定義とは直接の関係はないですが、安全のために冒頭でOption Explicit文によって未定義の変数を使えないようにしています(リスト1)。ApiKeyには、おのおの取得したAPIキーを設定してください。
[リスト1]エンドポイントURLやAPIキーの定数を定義
' 未定義の変数を使えないようにする
Option Explicit
' エンドポイントURLを定数で共有
Const EndPoint = "https://www.googleapis.com/youtube/v3/"
' APIキーを定数で共有
Const ApiKey = "AIzaS…"
' 作成するHTMLファイルのベース名
Const VideoFilenameBase = "video$$$.html"
APIにアクセスするスクリプト
続けて、APIにアクセスするスクリプトを書いていきます。拡張性を考慮して、APIへのアクセスは関数として独立させます。APIを呼び出すスクリプトは、KickWebServiceという関数にします。KickWebServiceは、引数にパス(APIの種類を表すエンドポイントの一部)とクエリパラメータを受け取って、結果としてのJSON文字列を返す関数です(リスト2)。
[リスト2]KickWebService関数
' APIを呼び出す(引数はAPIの種類とパラメータ、戻り値はJSON文字列)
Private Function KickWebService(ByVal Path As String, _
ByVal Param As String)
' URLを作成する
Dim Url As String
Url = EndPoint & Path & Param & "&key=" & ApiKey '(1)
' リクエストを送信する
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP") '(2)
With http
.Open "GET", Url, False '(3)
.send
' リクエスト結果を取得する
KickWebService = .responseText '(4)
End With
End Function
変数Urlに、エンドポイント、パス、クエリパラメータ、そしてAPIキーをセットします(1)。HTTPアクセスに必要なMSXML2.XMLHTTPモジュールのオブジェクトを作成後(2)、HTTPメソッドとURLを指定してOpenメソッドを呼び出し、必要なリクエストパラメータを設定した後、sendメソッドで実際に呼び出します(3)。呼び出した結果はResponseTextプロパティで取得できます(4)。これが空なら何らかのエラーが発生していますが、これをそのまま関数の戻り値として返します。
キーワードから動画名とIDを取得するスクリプト
次に、キーワードから動画名とIDを取得するスクリプトを書いていきましょう。このスクリプトは、「キーワード検索する」ボタンをクリックした際に呼び出されるイベントハンドラとして記述します。コンボボックスにイベントハンドラを追加した要領で、イベントハンドラSearchCommandButton_Clickを作成してください(リスト3)。以下のような流れで、キーワードを検索して結果をセルに書き込んでいます。
①アクティブなセルからキーワードを取り出して空でないか判定する
③キーワードを指定してAPIを呼び出す
③結果がJSONか判定する
④JSONをディクショナリに変換する
⑤ディクショナリから必要な情報を取り出してセルに書き込む
[リスト3]キーワードから動画名とIDを取得するスクリプト