- ベストアンサー
うるう年の条件(表計算のif)
- 表計算のif関数を使ってうるう年の条件式を作成する際、(1)と(2)は正解を導くことができるが、(3)から(6)は導くことができない。
- 条件式のandとorの順番を入れ替えただけで、結果が変わってしまった理由として、(3)から(6)の条件が条件式で導けない内容である可能性がある。
- 詳しい理由は質問者の知識が足りなかったために導き出せなかったため、具体的な内容についてはわからない。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
(3)がうまくいかないのは、条件が間違っているからではなくて、単純にAND,OR関数の使い方(特にOR関数)で勘違いしているからです。こうすればうまくいきます。 =IF(OR(AND(MOD(A2,4)=0,MOD(A2,100)<>0),(MOD(A2,400)=0)),"うるう年","平年") 文章で「A かつ B」や「A または B」と書いてあるものをAND,ORで書くと、「AND(A,B)」「OR(A,B)」になります。つまり関数の括弧の中に条件が入るわけで、A AND Bや、A OR Bとは書けません。なので「or(mod(a1,400)=0)」と言う式は、条件が一つしかない「OR(A)」と同じです。よってAND,ORを組み合わせる場合も、括弧内に記述します。文章の「A かつ B または C」をAND,ORで書くと、「OR(AND(A,B),C)」になります。 きっとこれを見て「うわ~、判りづれぇ」と思われたでしょうから、以下のURLのような直接数式に書いてしまう方法も提示しておきます。ただしこれはExcelやLibreOffice CALCのTRUE,FALSEをきちんと理解せずに真似すると落とし穴にはまる危険がありますが、ビジュアル的にはAND,OR関数よりも見やすい。 http://www.relief.jp/itnote/archives/001180.php (4)は条件が間違っています。100で割り切れて4で割り切れない数って、存在しませんよね?その逆はありますが。 (5)も条件間違いです。400で割り切れるけど100では割れない数はありえません。 (6)もまた条件違いですが、ちょっと様子が違っていて、FALSEと表示される要因は、式が成立しなかった時の値が指定されていないからです。ただもっと根本的問題として、最初の400で割り切れたら次のIFで4で割り切れるかを判定していますが、このIFの括弧の中に後続のIFが入ってないため、おかしなことになっています。どうしてこれがエラーにならないのか不思議なくらい・・・それに400で割り切れれば4でも割り切れるから、この判定方法は無意味です。うまくやるには、 1)最初に4で割り切れるかを見る。割り切れなければ平年。 2)次に100で割り切れるかどうかを見る。割り切れなければうるう年。 3)上の2)で割り切れたら、400で割り切れるか見て、割り切れればでうるう年、そうでなければ平年。 と言う順序になり、これをまとめると以下のような式になります。こちらの方がAND,OR関数を使うよりも思考順序に近く、理解しやすいのでは? =IF(MOD(A1,4)<>0,"平年",IF(MOD(A1,100)<>0,"うるう年",IF(MOD(A1,400)=0,"うるう年","平年")))
その他の回答 (3)
- don_go
- ベストアンサー率31% (336/1059)
■誤 真(True)→うるう年となるが、条件2で100で 割りきれる年のmod(a1,100)の値は=0となる ↓ ■正 真(True)→うるう年となるが、条件2で400で 割りきれる年のmod(a1,100)の値は=0となる
お礼
don_go様、訂正のため、追加でのご回答 ありがとうございました。 ためになりましたんで また、質問した際はよろしくおねがいします。
- don_go
- ベストアンサー率31% (336/1059)
■OR関数の書式 OR(条件1,条件2,・・・) 条件1 または 条件2 または・・・の場合 真(True)を返し、そうでない場合は偽(False) を返す。 ■AND関数の書式 =AND(条件1,条件2,・・・) 条件1 かつ 条件2 かつ・・・の場合真(True) を返し、そうでない場合は偽(False)を返す。 (3) 条件1:mod(a1,4)=0 条件2:mod(a1,100)<>0 条件3:or(mod(a1,400)=0)→mod(a1,400)=0 #OR関数の中の条件が1個だけの場合は、 #OR()が無い場合と同じ結果になる。 and()の中の条件1~3が全て満たされる場合 真(True)→うるう年となるが、条件2で100で 割りきれる年のmod(a1,100)の値は=0となる ので偽(False)となり、結果としてうるう年 にはならず平年となる。 (4)(5)も同様な考え方で判定して下さい。 ■IF文の書式 =IF(条件式,値1,値2) 値1は条件式が満たされている場合真(True) 値1は条件式が満たされていない場合偽(False) (6)条件式と値を順に与えると =if(mod(a1,400)=0,"うるう年",値2) 値2=if(mod(a1,100)=0,"平年",値3) 値3=if(mod(a1,4=0,"うるう年","平年") となり、全てをひとまとめにすると下記の 結果になります。 1)値2を代入 =if(mod(a1,400)=0,"うるう年",if(mod(a1,100)=0,"平年",値3)) ↓ 2)値3を代入 =if(mod(a1,400)=0,"うるう年",if(mod(a1,100)=0,"平年",if(mod(a1,4=0,"うるう年","平年")))
お礼
don_go様、ご回答ありがとうございます。 >OR関数の書式 >AND関数の書式 >IF文の書式 →それぞれわかりやすく綺麗にまとめて下ったので 自分のノートにこれをきっちりメモして もっと基礎力をつけようと思いました。 >(6)条件式と値を順に与えると 下記の結果になります →そうか! 私の式でFAUSEが出たのは値2の前と値3の前にある条件を 書かなかったからFAUSEと出たんですね。 なるほど、FOUSEがでた意味がスッキリしました。 本当に助けて頂いて ありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! あまり難しく考えなくてもよいと思います。 A列には1600・1700・・・と入っているというコトですね。 100または400で割り切れる年は必ず4で割り切れますので、 結局100で割り切れるか、400で割り切れるかだけの問題かと・・・ =IF(MOD(A1,400)=0,"うるう年","平年") だけで良いと思います。 (3)(4)の数式 「Excelの場合ですが、関数の引数ダイアログボックス」を使用して OR関数もしくはAND関数の中にOR関数やAND関数を使用するとエラーと判断されます。 (5)の数式 AND条件で100で割り切れ、4で割り切れた場合 → A列すべてが「TRUE」となります。 次のIF関数で100で割り切れない!という条件にしていますで ここで「FALSE」となり、「平年」という結果が返ります。 (6)の数式 IF関数のネストは2番目までは「TRUE」です。 3番目のIF関数で「100で割り切れない」という条件にしていますので、 最終的にIF関数の結果は「FALSE」となり「平年」が返ります。 あと「FALSE」と表示されるのは、どこかのIF関数の「偽の場合」の条件が未記入だと思われますので おそらくそういった表示になっているのではないかと思います。m(_ _)m
お礼
tom04様、ご回答ありがとうございます。 >こんにちは! →こんにちは^^ >結局100で割り切れるか、400で割り切れるかだけの問題かと →条件式とか組み立てばかりに気を取られて それぞれの数字には無頓着で 自分の考えに全く無いご指摘だったのには ものすごく新鮮な感動を覚えました。 >Excelの場合ですが OR関数もしくはAND関数の中に OR関数やAND関数を使用するとエラーと判断されます →そうなんですか?! 同じ機能ならタダの方で… とlibreを使ってましたが、やはりちょっと違うんですかね… >(5)の数式 >(6)の数式 →文章がとてもわかりやすいので ゆっくり、しっかり声に出して読むと 何とか理解することができました。 いやぁ、日本語ってずっと考えると混乱が起こりやすいですね(汗) >「FALSE」と表示されるのは、 どこかのIF関数の「偽の場合」の条件が未記入だと思われます →未記入…んー… 条件の組立てそのものがおかしいってことですね(汗) んー…まだまだ私はifの条件や組み立てを 根本的に勉強する必要がでてきました。 本当に今回も助けていただいて ありがとうございました。
お礼
RandenSai様、ご回答ありがとうございます。 >(3)がうまくいかないのは、条件が間違っているからではなくて、 単純にAND,OR関数の使い方(特にOR関数)で勘違いしているからです →なるほど、丁寧に説明して下さったので ORの使い方が特に変だったことが理解できました。 そして、教えてもらった組み立てでやってみると ちゃんと導けました。 >きっとこれを見て「うわ~、判りづれぇ」と思われたでしょう →いえいえ、ゆっくり一個一個教えてくれるから とてもわかりやすいですよ^^ 張ってくれた内容も読みましたが ANDは『積』で、ORは『和』にあたるんだなぁと 0をかける、足すと例があったので、 なんとなーく理解できました。 >(4)は条件が間違っています >100で割り切れて4で割り切れない数って、存在しませんよね? →確かに存在しない…でも、んー?って思いました。 なぜなら、ちゃんと導けた(2)の条件がそれだったからです。 なので、先ほど教えてもらった方法で(4)を組みなおして =if(or(and(mod(a1,100)=0,mod(a1,4)<>0),(mod(a1,400)<>0)),"平年","うるう年") で検証してみました。 そしたら、導くことできました。 でも、『100で割り切れて4で割り切れない数』なんて存在しないし どうなってんのかわからなかったので そんな存在しないものは自動的にその部分が消されて 最終的に、400で割れたら平年、割れなかったらうるう年ということに なってしまってるのか?と考え 1600から1700年のうるう年を検証してみようと考えました。 結果、考えが当たってたようで 400で割れる1600年しかうるう年になりませんでした。 (1600、1620、1640、1660、1680がうるう年に本来なる) つまり、唯一正解してると思ってた(2)ですら 残念ながら私は正解していなかったんです。 >うまくやるには、以下のような式になります →すごい!すごくスッキリした内容のわかりやすい式です! 式の内容自体がすごく理解しやすいです。 今回も本当に助けていただいて ありがとうございました。
補足
今回の問題は何回も日本語を声に出し読み直し、考え、 考えすぎたため、軽いゲシュタルト崩壊状態になりましたが、 今回も皆様のおかげで一つまた問題を解決することが できました。 それぞれのご回答、それぞれにいいところがあり 私自身、納得する部分も多く、また 気付いてない点に気付かされることもたくさんありました。 ベストアンサーを一人しか選べないのが心苦しいですが 唯一正解したと思った(2)ですら正解でなかったという 事実に気付かせてもらったので RandenSaiさんに決めました。 また、どうしても私では問題が解決できない時は 皆様のお力は頼りになりますので よろしくお願いします。