商工会議所のパソコン教室でテストが有りました。
色々と沢山あった問題の中で、万年カレンダーの出題があった。
昔からこの手の問題は、随分解いてきましたが
久々に向き合うと、やっぱちょっと考えてしまって...。(^^;
作業セル無しでとなると
さすがに瞬殺とはいかなかったな~。(^^ゞ
こんな感じの万年カレンダー、B2セルに年を、C2セルに月を入力し
その年月に合わせて7曜日の該当するマス目に日付が自動的に表示されるように作ります。
作業セルを使えばあっという間にできちゃいますが、、、
G2セルにDATE関数で日付を作ります。
=DATE(B2,C2,1)
I2セルに曜日をTEXT関数で作ります。
=TEXT(G2,"aaa")
J2セルに月末をEOMONTH関数で作ります。
=EOMONTH(G2,0)
B4セル=IF(B3=$I$2,1,"")
C4セル=IF(B4="",IF(C3=$I$2,1,""),IF(B4>0,B4+1,""))
C4の式をH4セルまでフィルコピー。
B5セル以降は=セル+1
J2セルに月末が有りますので、B8セル以降に=IF(H7>=DAY($J$2),"",H7+1)
みたいなエラー処理を施した式を作ります。
これが、作業セル無しになると、ぐっと難易度が上がる。
まずはB4セルに定番になると考えられる式
=IF(WEEKDAY(DATE($B$2,$C$2,1),1)=COLUMN(A1),1,"")
C4セル=IF(B4="",IF(WEEKDAY(DATE($B$2,$C$2,1),1)=COLUMN(B1),1,""),IF(B4>0,B4+1,""))
C4の式をH4セルまでフィルコピー。
これをMOD関数で出来ないかってので考えてみた。
B4セル=IF(MOD(DATE($B$2,$C$2,1),7)=COUNTBLANK($A$4:A4),1,"")
C4セル=IF(B4="",IF(MOD(DATE($B$2,$C$2,1),7)=COUNTBLANK($A$4:B4),1,""),IF(B4>0,B4+1,""))
できたかなと思ったのですが、この式には致命的な欠陥があることが
検証を行って判明した。"(-""-)"
日付は、Excelの中ではシリアル値という1900年1月1日から1日を1としての連続番号で管理されている。
これを7で割った序数は、1~6が残る。
7は割り切れてしまうので0が返される。
つまり、7=土曜日という判定ができなかった。
月初めの1日が、日曜日~金曜日は正しく表示されるんだけど、
土曜日が1日の時は不可だった。
H4セルには、苦肉の策で
=IF(G4="",IF(MOD(DATE($B$2,$C$2,1),7)+7=COUNTBLANK($A$4:G4),1,""),IF(G4>0,G4+1,""))
MOD関数の意味がほとんどないけど...。(^^;
懐かしい。
けれど、難しそうで、解読できません。というか、解読する気が・・・
新人さんも入ったので、また基礎から少しづつレベルを上げて、
みんなで関数を習いたいなあ。
>みんなで関数を習いたいなあ。
はい、ゆくゆくはそうにしていきたいと考えています。
時間がかかるでしょうけどね。(^^;
ある日突然来ないとマスターに申し訳なくてと言う気がしてぜひ関数迄到達することを願っています
皆さんよろしく
ですよね。
私の方も、テキストやら講習内容やら、
全くの初心者用を用意してますので
是非継続して欲しいですよね。
そう、できれば関数くらいまでね。