エクセルVBAのFunctionプロシージャで祝日判定関数を自作する方法


祝日判定アイキャッチ

みなさん、こんにちは!
フジタニ(@libartweb)です。

エクセルVBAとエクセル関数を組み合わせ、営業日を考慮したスケジュール表自動作成の方法をシリーズでお伝えしております。

前回の記事はこちら

エクセルVBAでカレンダーシートに翌月の日付を反映させる方法
エクセルVBAでスケジュール表を自動で作成する方法を連載しています。今回はカレンダーのシートにエクセルVBAで日付を自動的に反映させる方法をお伝えします。同時にシートの保護の活用などミス防止のための工夫も紹介します。

前回はカレンダーシートにエクセルVBAで自動的に日付を設定する方法をお伝えしました。

翌月の日付が設定されることで、カレンダーの形が見えてきました。

今回は、その日付設定がされたカレンダーに対して、土日祝日の行に色をつける処理を行うために、エクセルVBAのFunctionプロシージャを使って祝日判定関数を自作する方法をお伝えします。

前回までのおさらい

前回までは以下の①~②まで紹介しました。

今回と次回で紹介するのは③の土日祝日を判定し、VBAでその行に色をつける方法です。今回はまず、祝日判定関数の自作方法ですね。

① シート名が「テンプレート」のままなのでVBAでシートをコピーして対象月の名称にしたい。例:「201811」
② A1セルに対象月の「開始日」をVBAで自動入力し、B列全体を対象月の日付として反映させたい。
土日祝日を判定し、VBAでその行に色をつけたい。 ⇒今回と次回で紹介します。
④ 各日付ごとのタスクをVBAで「日付計算」シートから取得して反映させたい。

祝日判定

祝日判定関数を自作する理由

土日祝日の行に色をつけるには当然、それをエクセルVBAで判定する必要がありますが残念ながら

エクセルVBAでは土日を判定することは可能(Weekday関数使用)なのですが祝日は判定できません。

標準ではそういった関数が用意されていないため、祝日を判定するための関数を自作する必要があります。

関数を自作する際に便利なFunctionプロシージャとは

Functionプロシージャとは、呼び出し元に値を返す事ができるプロシージャのことです。

例えばAのSubプロシージャからBというFunctionプロシージャを呼び出したとき、AのSubプロシージャに対してBのFunctionプロシージャは値を返すことができます。

SubプロシージャとFunctionプロシージャの大きな違いは、値を返すかどうか?です。

それでは、以下の最もシンプルなプログラムでイメージしてみましょう。

TestというSubプロシージャでメッセージボックスを出す処理です。

MsgというFunctionプロシージャを呼び出し、Msgはメッセージボックスに出力する内容を返しています。

Functionプロシージャは返り値の型を指定することができます。今回はメッセージの内容なので、String型としています。

今回の例の処理結果は以下の通りです。

Functionテスト

Functionプロシージャを用いた祝日判定関数のサンプルコード

ではFunctionプロシージャを応用し、祝日判定関数を自作してみましょう。

前回までの記事で作成した「日付計算」シートを使用します。

以下のシートですね。I列に祝日一覧があります。

祝日一覧

WORKDAY関数で日付計算を行うために用意した祝日の一覧ですが、これを今回はエクセルVBAで使ってみましょう。

サンプルコードは以下の通り。Functionの返り値によって祝日かどうかを判定する方法です。

holidayTestプロシージャ(Sub)からisHoliday(Function)を呼び出しています。

プロシージャ 種類 引数 機能
holidayTest Sub なし 指定の日付が祝日かどうか?をメッセージボックスでお知らせ
isHoliday Function strDate 祝日かどうかを真偽値で返す

isHolidayには引数としてstrDateを渡しています。このstrDateの中に、祝日かどうか?を判定したい日付を格納します。
isHolidayの返り値がTrueかFalseかで祝日を判定します。

日付計算シート内の祝日一覧の最終行を取得します。

祝日一覧

こちらのI列の、最終行ですね。

最終行の求め方として以下の記事で詳細に説明しております。

【エクセルVBA入門】シートのデータがある最終行番号を求めるステートメントを徹底解説
エクセルVBAを使ってバラバラの経費精算書データを集約するシリーズです。今回は、実行のたびにデータをシートに追加できるようにします。また、最終行番号を求めるステートメントについて徹底的に解説をしていきます。

最終行を求めたら、ループで祝日一覧の日付を1行ずつ読み込んでいき、引数strDateと一致する日付はあるか?

を探っていきます。

※比較処理をする際、Format関数でどちらも同じ書式に変換をかけています。

一致するものがあればisHolidayにTrueを返し、Exit Forでループを抜けています。

isHolidayにはTrueかFalseが返ります。これで祝日判定関数を自作することができました!

まとめ

以上、Functionプロシージャの概要と、それを生かした祝日判定関数の自作方法をお伝えしました。

Functionプロシージャは値を返すことができますので、このように関数を自作する際は非常に便利に活用できます。

次回は今回作成した祝日判定関数である「isHoliday」を使って、カレンダーシートの土日祝日の行に色をつける方法をお伝えします。

どうぞお楽しみに!

連載目次:エクセルVBAで営業日を考慮したスケジュール表を自動で作成する

WORKDAY関数とエクセルVBAを組み合わせ、営業日を考慮したスケジュール表を自動作成する方法をお伝えします。 実務で使いこなすことができればとても便利なツールとして活用できるはずです!
  1. エクセルで営業日判定を実現するWORKDAY関数の使い方
  2. エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩
  3. エクセル関数だけで営業日を考慮した月間スケジュールを作成する方法
  4. エクセル関数でスケジュール自動表示のためのカレンダーを作成する方法
  5. エクセルVBAでテンプレートをコピーし翌月のカレンダーシートを生成する方法
  6. エクセルVBAでカレンダーシートに翌月の日付を反映させる方法
  7. エクセルVBAのFunctionプロシージャで祝日判定関数を自作する方法
  8. エクセルVBAでカレンダーシートの土日祝日の行に背景色をつける方法
  9. エクセルVBAでカレンダーシートに自動でタスクを表示する方法

  投稿者プロフィール

フジタニ
フジタニLibArt代表
手作業でやってるものは何でも自動化したくなる性格。毎日VBAで何でもかんでも自動化しています。
電話が大嫌いなのでビジネスチャットを布教したい!
海外へよく行きます。自転車が大好き。走れるエンジニアです!

コメント