エクセルVBAでWebAPIを使って祝日を判定する方法【日付変換】

エクセルVBAでWebAPIを使って祝日を判定する方法【日付変換】

こんにちは~。「デザインもできるシステムエンジニア」のあつもり(@atumori17)です。今日も業務効率化のアイデアを発信していきますっ!

前回は「日付の曜日を判定してセルに入れる方法」を紹介しました。

エクセルVBAで日付の曜日を判定してセルに入れる方法【日付変換】
今月の日付と曜日をワークシートに自動で入力するエクセルVBAプログラムの紹介です。日付だけでなく曜日まで入れられるようになるとグッと実用性がアップしてきますよね。スケジュール表や業務進捗表などを作るときに役に立つと思います。縦並びだけでなく横並びも選べるようにしました。

今回はさらにもっと使いやすくするために、「エクセルVBAでWebAPIを使って祝日を判定する方法」を紹介していきます。祝日の判定はエクセルの関数などでできないので、WebAPIを使います。

スケジュール表を作るときなどに、祝日の判定までできるとさらに実用性が上がりますよね。

レクタングル大336×280

祝日を判定するWebAPI

WebAPIは以下のサイトのものを使わせていただきました。

祝日判定web API

シンプルでとってもわかりやすい!こういう便利なものを作ってくれるとホント助かりますよね~。

実際にプログラムで使用するURLは


を使います。

このURLの後ろにパラメーター(日付のデータ)を付加してサーバーにリクエストを送ります。
http://s-proj.com/utils/checkHoliday.php?kind=h&date=20171128

こんな感じでサーバーにhttpリクエストを送ります。

そうするとWebAPIが「20171128」は祝休日なのかを判定してくれます。判定の結果は

  • 平日ならelse
  • 祝休日ならholiday

という値を返してくれます。

日付の曜日を判定してセルに入れるプログラムの作成

前回のプログラムを修正する

それでは実際にプログラムを作っていきます。

前回使用した「今月の日付と曜日を入力.xls」を開いて修正していきます。

UserForm1のSubプロシージャ「CommandButton1_Click」に次の段落で説明するコードを貼り付けます。

サンプルコードを貼り付ける

「CommandButto1_Click()」に貼り付けるコードです。

プログラムコードの解説

それではプログラムコードの解説をしていきます。重要なポイントに絞って説明していきます。

プログラム全体の流れは以下のようになります。

  1. 今月の月末の日にちを取得する
  2. 処理対象の列番号または行番号を取得する
  3. 行か列どちらが選択されたかを調べる
  4. セルに日付を入力する
  5. 日付から曜日を取得して隣のセルに入れる
  6. WebAPIを使って祝日休日の判定を行い、日付の色を変える

1~5では前回の記事で紹介していますので、6のWebAPIを使うところからの説明をしていきます。

それでは早速WebAPIを使っていきます。

XMLHttpRequestオブジェクトを作成する

XMLHttpRequestオブジェクトはサーバーとクライアント間でデータ通信を行なうためのAPIです。

まずはオブジェクト変数をObject型で宣言します。

Dim オブジェクト変数 As Object

続いて先ほど宣言した変数にXMLHttpRequestオブジェクトをセットします。

Set オブジェクト変数 = CreateObject(“MSXML2.XMLHTTP”)

全体のプログラムコードでは81~83行目になります。

ここで注意点が1つあります。XMLHttpRequestオブジェクトをエクセルのVBAで使用するには参照設定を行う必要があるんです。設定しないとエラーが表示されますが、事前に設定しておいたほうが良いでしょう。

openメソッドでHTTPリクエストを作成する

WebAPIを使う準備ができましたので、今度はサーバーに対してHTTPリクエストを送ります。まずサーバーに送る前にリクエストを作成する必要があります。リクエストの作成はopenメソッドを使います。

XMLHttpRequestオブジェクト.Open “GETかPOST”, “URL”, Boolean

第1引数にリクエストの種類を指定します。今回の場合、URLに日付のデータを付加して送るのでリクエストはGETを指定しています。

第2引数にはリクエストを送る先のURLを指定します。さいほど説明したようにURLに日付のデータを付加して指定します。
http://s-proj.com/utils/checkHoliday.php?kind=h&date=20171128
こんな感じになります。

第3引数は同期通信か非同期通信を指定します。Trueで非同期通信、Falseで同期通信になります。今回の場合、Falseで同期通信を指定しています。
つまりサーバーから応答があるまで次の処理は行わないようにしています。

sendメソッドでHTTPリクエストを送る

今度はopenメソッドで作成したHTTPリクストをsendメソッドを使ってサーバーに送ります。

send(サーバーへ送るデータ)

引数にはサーバーへ送るデータを指定します。POSTの場合はここで指定しますが、GETの場合はopenメソッドの第2引数で既に日付を付加したURLを指定していますので、NULLを入れます。

responseTextプロパティで祝日判定結果を取得する

サーバーにリクエストを送ったので、その返答をもらわなければいけませんよね。そのためにはresponseTextプロパティでサーバーから返ってきたレスポンスデータを文字列として取得します。

XMLHttpRequestオブジェクト.responseText

このレスポンスデータを独自関数であるCheckHolidayの戻り値としています。

  • 平日ならelse
  • 祝休日ならholiday

が戻り値として渡されるわけですね。

openメソッドからresponsTextプロパティを使用するところまでの流れは以下になります。全体のプログラムコードでは106~110行目になります。

ColorIndexプロパティで日付の色を変える

CheckHoliday関数の戻り値によって日付の色を変える処理をします。セル内にある文字の色を変えるには次のようにします。

セル番地.Font.ColorIndex = インデックス番号

今回の場合は祝休日の場合は赤文字にするようにします。全体のプログラムコードでは44~47行目、57~60行目になります。

プログラムコードの解説は以上です。

祝休日を判定してセルに入れるプログラムの動作確認

それでは実際に出来上がったプログラムを動かしてみましょう。

ワークシートの起動ボタンを押します。

日付入力ボタンをクリックして、列を選択しOKボタンをクリックします。

今月の日付と曜日が入力されました。祝休日の日付はきちんと赤文字になっていますね。

行を選択した場合はこんな感じになります。

まとめ

いかがでしたか?今回の内容をまとめます。

  • XMLHttpRequestのopenメソッドとsendメソッドを使いサーバーにhttpリクエストを送信する
  • レスポンスデータをresponseTextプロパティを使って文字列で取得する
  • ColorIndexプロパティで祝祭日に色をつける

以上「エクセルVBAでWebAPIを使って祝日を判定する方法」でした。おつかれさまでした~。

レクタングル大336×280
レクタングル大336×280

シェアする

  • このエントリーをはてなブックマークに追加

フォローする