エクセル関数とVBAで和暦西暦対応カレンダー作成

目次

カレンダー作成でのエクセル関数の設定

それでは、ユーザーフォームの「年」「月」を入力して【表示】ボタンを押すと日付が変わる為に、カレンダーの基本の日付を設定しましょう。

カレンダー日付一覧

セルA2はTextBox1の値(年)が、セルB2はTextBox2の値(月)が転記されます。【表示】ボタンに設定。

セルC2には「DATE関数」で1日が表示

セルC3にも「DATE関数」で月末日が表示

セルD2は「MONTH関数」で前月表示

セルD3にも「MONTH関数」で翌月表示

曜日列(A5~A41)は「WEEKDAY関数」で曜日数値化

日列(B5~B41)は「IF関数とDAY関数」で当月外非表示

日付列(C5~C41)は「WEEKDAY関数」で日付表示

祝日列(D5~D41)は「VLOOKUP関数とIFERROR関数」で祝日検索

DATE関数で日付を自動表示

セルA2が年(2018)セルB2が月(10)がユーザーフォームから転記されます。

そして初日(1日)をセルC2に表示させるためには「1」が必要になりますので、セルC2に設定するエクセル関数はこのようになります。

=DATE(A2,B2,1)

このようにエクセル関数DATEを使えば、2018/10/1と表示されます。

次に月末表示ですが、同じ要領で31としたいところですが、月末は必ず31日ではないのでこの方法では月末日が正確に表示されません。

そこで、月末日の翌日は必ず1日なので、当月に+1して翌月の1日から-1をすれば、月末になりますのでセルC3に設定するエクセル関数はこのようになります。

=DATE(A2,B2+1,1)-1

これで、指定された年月により1日と月末の設定が終わりましたので、次に前月と翌月の設定をしましょう。

MONTH関数で年月日から月のみ取得

セルD2に前月、セルD3に翌月を取得させておきましょう。

これにより、ユーザーフォームに配置した【前月】【翌月】ボタンが使えるようになります。

「前月」とは、セルC2に表示されている2018/10/1の1日前になるので-1をすれば2018/9/30になります。

そして年月日から月だけを取得させるのでMONTH関数を使うと完成します。

=MONTH(C2-1)

次に翌月ですが、セルC3に月末日が表示されている2018/10/31の1日後になるので+1をすれば、2018/11/1となります。

=MONTH(C3+1)

これで、前月・翌月のエクセル関数の設定が終わりました。

WEEKDAY関数で曜日を数値化

今のところ曜日を数値化しても使っていないのですが、今後使用するの為に用意だけしてあります。

WEEKDAY関数には曜日を数値化でき、基本的に下記のようになっています。

日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日
1 2 3 4 5 6 7

それでは、セルA5~A41にはこのようにWEEKDAY関数を入れていきます。

下記は、セルA5に入れた関数なので、A6にはC5がC6になりますよ。

=VALUE(WEEKDAY(C5,1))

曜日を数値化だけならば「=WEEKDAY(C5)」で十分ですし「,1」は省略できます。

あえてVALUE関数を加えているのは、数式で導き出された値は「文字列」扱いになっているので、VALUE関数で数値化しているだけです。

この作業を繰り返し行えば、曜日を数値化完了です。

「日」B列は年月日から当月の日だけ表示する

ここは、ユーザーフォームに配置した37個の日にち表示用のコマンドボタンに反映させるために重要な項目になっています。

当然日付ボタンには「日」だけ表示させたいので、年月日から「日」だけ取得するDAY関数を利用します。

セルB5には2018/9/30と年月日が表示されているセルC5から日(30)だけ取得するのでこのようになります。

=DAY(C5)

このままでも「30」と表示されるので構わないのですが、ユーザーフォームのコマンドボタンに表示させるには文字列表示ではなく数値化させなくてはいけないので、VALUE関数で囲ってあげます。

=VALUE(DAY(C5))

さらに、当月以外の日はカレンダーには不要なので、2018年10月以外は非表示にします。

前月になる可能性のある最初の7日間(セルC5~セルC11)には、当月1日(セルC2)よりも小さくなるのでIF関数で小さかったら空欄にしましょう。

=IF(C5<$C$2,””,VALUE(DAY(C5)))

繰り返しセルC11まで終わったら、次は翌月になる可能性のある最後の12日間(セル30~セル41)には、当月月末(セルC3)よりも大きくなるので同じくIF関数で大きかったら空欄にしましょう。

=IF(C30>$C$3,””,VALUE(DAY(C30)))

IF関数をVBAでやる方法もありますよ

祝日を設定して日付を赤色表示

住所録や顧客名簿作成などでは、祝日設定の必要はないと思いますが一応難しくはないので準備だけしておきました。

GoogleやYahooカレンダーなどと連携させる知識や技術は無いので、祝日を付け加えれば対応できる方式です。

カレンダー祝日

実際の使用では、必要性がないのでざっくりとしか用意していません。

祝日をただ単に並べて記載しただけです。

その為前年や翌年に対応していないので、祝日にしたい場合は、セルJ25・K25以下に追加で記載すれば祝日が増えるので対応可となっています。

D列の祝日は、この日付を読み取って一致すると祝日と認識するようにしてあります。

使うエクセル関数は、VLOOKUP関数とIFERROR関数の組み合わせです。

セルD5にはセルC5の2018/9/30を上記表(祝日一覧表)J5:K28の範囲から探して、表の1列右と一致すれば、値で返しています。(書式設定で日付表示せず標準のまま)

当然2018/9/30は祝日ではないので、祝日一覧表には無いのでエラー(#N/A)となります。

このままでは検索不能なので、IFERROR関数を使ってエラーの時は「0」で返すようにします。

そうするとこのような数式になります。

エラー表示を数値化するIFERROR関数

=IFERROR(VLOOKUP(C5,$K$5:$K$28,1,0),0)

これをセルD41まで繰り返し記載すれば、2018/10/8が体育の日で祝日と一致するので43381と表示されます。

あとは、VBAで数値が0ならば平日(黒色日付表示)0でなければ、祝日(赤色日付表示)に指定すれば完成です。

この項目の最後に、ユーザーフォーム上で日付を押した日が選択されるようにするセルを用意しておきます。

カレンダー選択日付

ユーザーフォームに配置した日付を押すと、セルJ2に転記されて「YYYY/MM/DD」で表示させます。

当然ながら、少し面倒なのですが37個全てのコマンドボタンに同じコードを記載します。

そして日付のセルK2には、選択日付(画像上「10」)に対応する日付をVLOOKUPで見つけて表示させます。

=VLOOKUP(J2,B5:C41,2,0)

このエクセル関数の検索範囲B5~C41は、この項目の最初の画像のカレンダー表の範囲となっています。

ここまでで、オリジナルカレンダーを作るのに最低限必要なエクセル関数を書きました。

波乗りアヒル

次のページでユーザーフォームを使ったVBAの設定を説明いたします。

スポンサーリンク

1 2 3

2024年5月11日からマイルと楽天ポイントとの相互交換提携開始!

交換レート0.5:1なので半分になってしまいますが、使い方次第で実質3倍の価値まで引き上げられる方法です。

目次