連載
» 2003年05月03日 05時00分 UPDATE

Tech TIPS:Excelで万年カレンダーを作成する

ちょっとしたスケジュール管理用などとして、紙ベースの日程表作成が必要になる場合がある。Excelを利用すれば作成可能だが、日付や曜日を手作業で入力するのは面倒である。そこで、規定のフォーマットに該当する年と月を入力するだけで、任意の1カ月分のカレンダーが自動的に作成されるシートを設計してみる。ここで紹介する日付関数のWeekdayやDateと条件付き書式の使い方をマスターすれば、用途に応じて自由なフォーマットにカスタマイズできる。

[山田祥寛,著]
「Tech TIPS」のインデックス

連載目次

対象ソフトウェア:Excel 2000/Excel 2002



解説

 ちょっとしたスケジュール表やプロジェクトの管理表などを作成する際に、OutlookやProject(プロジェクト管理ソフトウェア)、そのほか専用のソフトウェアではなく、Excelで簡単に日程表を作成する、という機会は意外と少なくない。

 そんなとき、定型的であるにもかかわらず、外枠であるカレンダー部分を作成するのは、実は意外と面倒臭い作業でもある。

 そこで本稿では、任意の年月を設定しさえすれば、カレンダーのフォーマットを自動的に作成してくれるExcelテンプレートを作成してみよう。紙に印刷して使用するもよし、メモ欄を設けるなどして電子データ上で使用するもよし、用途に応じて業務、日常生活に役立ててほしい。

作成手順

●手順1:カレンダーのテンプレートを作成する

 まずはExcelを起動して、カレンダーのテンプレートを作成してみよう。

作成したカレンダーのテンプレート 作成したカレンダーのテンプレート
左上に任意の年と月の数値を入力すると、その年月に対応したカレンダーが下側に自動的に表示されるようにする。
  (1)カレンダーを表示したい年を指定する。
  (2)カレンダーを表示したい月を指定する。
  (3)上の(1)(2)でそれぞれ年と月を指定すると、この部分が自動的に変化し、対応する月のカレンダー表示になる。
  (4)曜日の自動化処理に使用する行。通常は非表示にして使用する。
autocalender.xlsのダウンロード

 曜日に対応した数値を「1〜7」の値で6行目にセットしてあるほかは、あまり特筆すべき点はない。上記のリンクから今回ご紹介するExcelシートのデータをダウンロードするか、ないしはご自分でデザインしたカレンダーのテンプレートを作成してみてほしい。

 なお、6行目の数値は、あくまで後述の判定式で使用するだけで、ユーザーには関係のない情報であるので、行ごと非表示にしておくとよいだろう(左端にあるボタンをクリックして行全体を選択し、右クリックで表示されるショートカット・メニューの[非表示]を実行する)。

●手順2:カレンダーの第1週目の数式を設定する

 今回作成するカレンダー・フォーマットは、大きく1行目と2行目以降とで、埋め込まれる数式が異なる。まず1行目の関数を見てみよう。以下は、セルB7にセットされた関数式である(以下のリストでは、式が見やすいよう改行してあるが、実際には1行である)。

= IF(B$6>=WEEKDAY(DATE($B$2,$B$3,1)),
          B$6-WEEKDAY(DATE($B$2,$B$3,1))+1,"" )



 DATE関数は、パラメータとして指定された年月日を表わすシリアル値を返す関数である。例えば、「DATE($B2,$B$3,1)」なら、ヘッダ部で指定された年月の月初の日(ついたち)を表わす($B2と$B$3はそれぞれ、前挙の画面の(1)(2)に対応する)。こうして得られた値をWEEKDAY関数のパラメータに指定して呼び出すことで、指定月1日の曜日(1:日曜〜7:土曜)を取得する。

 最初に考慮すべきポイントは、第1週の1日の曜日までを空欄にすることだ。

第1週の処理 第1週の処理
月の第1週では、1日が始まる曜日までを空欄にしなければならない。これには、上記の式で得られた曜日(今回の例では5)の数値と6行目の数値(曜日表記の直下にある数値)を比較し、6行目の数値の方が小さいときには空欄にする。
  (1)この月で空欄にすべき日。

 上記の式で取得した曜日の数値が、6行目の値より小さい場合には、その月の1日には至っていないことを意味するので、その日の表示では空文字列を出力する。取得した曜日が6行目の値と等しければ、それがその月の1日にあたる日である。この1日を含め、第1週については、6行目の値からWEEKDAY関数の値を引いたものに1を加えることで、実際の日付を決定することができる。

 少々分かりにくいかもしれないので、2003年5月のカレンダーを例に、1行目の数値の変化を見てみることにしよう。以下の表は、5月の第1週(カレンダーの1行目)の数値の変化を表したものである。

セル セルの日付表示 6行目の値 6行目の値−WEEKDAY関数の戻り値
B7 非表示 1 -4
C7 非表示 2 -3
D7 非表示 3 -2
E7 非表示 4 -1
F7 1 5 0
G7 2 6 1
H7 3 7 2
2003年5月第1週の式の値

 2003年5月の場合には、「WEEKDAY(DATE($B$2,$B$3,1))」の値(2003/05/01の曜日番号)は「5=木曜」であるので、セルF7で初めて6行目の値と等しくなる。つまり、ここで「5−F6+1」を計算し、「1」という値が表示される。以降、金曜、土曜と「2」「3」が続いて表示される。

 さて、カレンダーの第1週目が設定されてしまえば、あとは簡単だ。以下のようにセルを設定すればよい。

曜日
B列 =$Hn+1(n:前行の番号)
C〜H列 月〜土 =Xm+1(X:左セルの列番号、m:現在行の番号)
第2週目以降の処理

 例えばセルB8には「=$H7+1」がセットされるし、セルC8には「=B8+1」がセットされる。C8をセットした後、その内容をD8〜H8にもコピーし、さらに8行目の内容を9〜12行目にまでコピーすれば、各セルに対する式の設定を簡単に行える。

●手順3:月の最終日を検出する

 以上で、ほぼカレンダーの体裁は整うのだが、残念ながらまだこれで終わりではない。

 月の最終日は28〜31までの間であるが、現状のままでは、これ以降の数値(32日など)までも表示されてしまう。本サンプルでは、最終日以降の数値をExcelの[書式]−[条件付き書式]メニューを使用して、背景色と同化させることで非表示と同じ効果を実現している。

月の末尾の処理 月の末尾の処理
今回は、背景色と同じ色で日付の文字列を表示することで、実質的に非表示と同じ効果を実現してみた。画面は、12行目のセルを選択状態にして反転表示させたところ。日付の表示自体は行われているので、反転表示させると日付が見える。

 これには、[書式]−[条件付き書式]メニューから表示される[条件付き書式の設定]ダイアログで次のように指定する。

条件付き書式の設定 条件付き書式の設定
月末を越える日については、背景と同じ色で日付を表示するようにする(今回の例では黄色)。
  (1)条件を指定する。
  (2)この式は、来月の0日の日付を求める。つまり、今月の最終日を求める式になる。
  (3)書式を設定し、条件に合致したときには背景と同じ色で文字が表示されるようにする。

 条件式に入力された「=DAY(DATE($B$2,$B$3+1,0))」が大きなポイントだ。

 「DATE($B$2,$B$3+1,0)」は、来月の0日の日付 ―― つまり、今月の最終日を求めている。DAY関数は引数に示された日付の日の部分だけを取り出すので、例えば、2003年5月の場合は31になるはずだ。

 つまりここでは、31よりも数値が大きくなった場合に、文字色を背景色といっしょにすることで数値を非表示にしている。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。