ますたあの遊び部屋

パソコンのソフト・ハード関連、写真、イラスト他のブログです。

ExcelのMOD関数で遊ぶ?

2017年05月26日 | パソコンソフト

商工会議所のパソコン教室でテストが有りました。

色々と沢山あった問題の中で、万年カレンダーの出題があった。

昔からこの手の問題は、随分解いてきましたが

久々に向き合うと、やっぱちょっと考えてしまって...。(^^;

作業セル無しでとなると

さすがに瞬殺とはいかなかったな~。(^^ゞ

こんな感じの万年カレンダー、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関数の意味がほとんどないけど...。(^^;

コメント (4)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 受精卵の採取 | トップ | Excelのマクロの記録で遊んで... »
最新の画像もっと見る

4 コメント

コメント日が  古い順  |   新しい順
MOD関数 (ふうたん)
2017-05-30 00:14:45
MOD関数。
懐かしい。
けれど、難しそうで、解読できません。というか、解読する気が・・・

新人さんも入ったので、また基礎から少しづつレベルを上げて、
みんなで関数を習いたいなあ。
返信する
関数の講習 (ますたあ)
2017-05-30 18:43:08
>新人さんも入ったので、また基礎から少しづつレベルを上げて、
>みんなで関数を習いたいなあ。
はい、ゆくゆくはそうにしていきたいと考えています。

時間がかかるでしょうけどね。(^^;
返信する
新人さん (tenjin)
2017-06-08 21:55:23
やめないで頑張っているので一安心です
ある日突然来ないとマスターに申し訳なくてと言う気がしてぜひ関数迄到達することを願っています
皆さんよろしく
返信する
ぜひ続けてほしいですよね。 (ますたあ)
2017-06-18 12:12:23
>やめないで頑張っているので一安心です
ですよね。

私の方も、テキストやら講習内容やら、
全くの初心者用を用意してますので
是非継続して欲しいですよね。

そう、できれば関数くらいまでね。
返信する

コメントを投稿