電子書籍の厳選無料作品が豊富!

LibreOfficeの表計算のifの条件で
わからない点があります。

問題は
【A1からA10まで1600から100とばしに2600まで入ってます。
 そして、それぞれうるう年であるか平年であるかを調べます。
 条件は、
 西暦の年数が4で割り切れ数字は原則『うるう年』
 例外として、西暦が100で割り切れる年は『平年』とする
 さらに例外として西暦が400で割り切れる年は『うるう年』とする】

という内容です。
ちなみに1600、2000、2400でうるう年と表示されれば正解です。

導き方がわからなかったので解答をみたら
(1)が解答でした。

そこで、(2)から(6)まで導けそうな日本語文を考えて、それを
条件としてあてはめてみました。

しかし、(1)と(2)以外は導けませんでした。
なぜ、(3)~(6)は導くことができなかったのでしょう?

orとandの順番を入れ替えただけで何故導けなくなったのでしょう?
これはifで導こうと思ったら、(1)または(2)でしか
導けない内容なのでしょうか?

あまり知識がないので、噛み砕いて教えてくださるとより
ありがたいです。

是非、よろしくお願いします。

(1)、400で割り切れるか、あるいは(or)、
  4で割り切れて、そして(and)、100で割り切れない場合
  『うるう年』、そうでない年を『平年』とする。
 =if(or(mod(a1,400)=0,and(mod(a1,4)=0,mod(a1,100)<>0)),"うるう年","平年")
 →ちゃんとなる。

(2)、400で割り切れない、あるいは(or)
  100で割り切れ、そして(and)4で割り切れない場合
  『平年』、そうでない年を『うるう年』とする。
 =if(or(mod(a1,400)<>0,and(mod(a1,100)=0,mod(a1,4)<>0)),"平年","うるう年")
 →ちゃんとなる。((1)を元に平年とうるう年の条件を入れ替えてみた)


(3)、4で割り切れて、そして(and)、100で割り切れない
  あるいは(or)400で割り切れる場合
  『うるう年』、そうでない年を『平年』とする。
 =if(and(mod(a1,4)=0,mod(a1,100)<>0,or(mod(a1,400)=0)),"うるう年","平年")
→全部平年になる((1)のandとorを入れ替えただけ)

(4)、100で割り切れ、そして(and)4で割り切れない
  あるいは(or)400で割り切れない場合
  『平年』、そうでない年を『うるう年』とする。
 =if(and(mod(a1,100)=0,mod(a1,4)<>0,or(mod(a1,400)<>0)),"平年","うるう年")
→全部うるう年になる((2)のandとorを入れ替えただけ)


(5)、400で割り切れ、そして(and)4で割り切れ、
  かつ(and)100で割り切れない場合
  『うるう年』、そうでない年を『平年』とする。
 =if(and(mod(a1,400)=0,mod(a1,4)=0,mod(a1,100)<>0),"うるう年","平年")
 →全部平年になる。
  ifとandで作ってみた。

(6)、400で割り切れ、そして(and)4で割り切れ、
  かつ(and)100で割り切れない場合
  『うるう年』、そうでない年を『平年』とする。
 =if(mod(a1,400)=0,if(mod(a1,4)=0,if(mod(a1,100)<>0,"うるう年","平年")))
 →1600,2000,2400年は平年になり、それ以外はFALSEと表示される。
  ifの中にifを入れる文を作ってみた。

A 回答 (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,"うるう年","平年")))

この回答への補足

今回の問題は何回も日本語を声に出し読み直し、考え、
考えすぎたため、軽いゲシュタルト崩壊状態になりましたが、
今回も皆様のおかげで一つまた問題を解決することが
できました。

それぞれのご回答、それぞれにいいところがあり
私自身、納得する部分も多く、また
気付いてない点に気付かされることもたくさんありました。

ベストアンサーを一人しか選べないのが心苦しいですが
唯一正解したと思った(2)ですら正解でなかったという
事実に気付かせてもらったので
RandenSaiさんに決めました。

また、どうしても私では問題が解決できない時は
皆様のお力は頼りになりますので
よろしくお願いします。

補足日時:2014/09/17 13:14
    • good
    • 0
この回答へのお礼

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)ですら
 残念ながら私は正解していなかったんです。


>うまくやるには、以下のような式になります
→すごい!すごくスッキリした内容のわかりやすい式です!
 式の内容自体がすごく理解しやすいです。


今回も本当に助けていただいて
ありがとうございました。

お礼日時:2014/09/17 13:09

■誤


真(True)→うるう年となるが、条件2で100で
割りきれる年のmod(a1,100)の値は=0となる
  ↓
■正
真(True)→うるう年となるが、条件2で400で
割りきれる年のmod(a1,100)の値は=0となる
    • good
    • 0
この回答へのお礼

don_go様、訂正のため、追加でのご回答
ありがとうございました。

ためになりましたんで
また、質問した際はよろしくおねがいします。

お礼日時:2014/09/17 13:13

■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,"うるう年","平年")))
    • good
    • 0
この回答へのお礼

don_go様、ご回答ありがとうございます。

>OR関数の書式
>AND関数の書式
>IF文の書式
→それぞれわかりやすく綺麗にまとめて下ったので
 自分のノートにこれをきっちりメモして
 もっと基礎力をつけようと思いました。

>(6)条件式と値を順に与えると
 下記の結果になります
→そうか!
 私の式でFAUSEが出たのは値2の前と値3の前にある条件を
 書かなかったからFAUSEと出たんですね。
 なるほど、FOUSEがでた意味がスッキリしました。


 本当に助けて頂いて
 ありがとうございました。

お礼日時:2014/09/17 13:11

こんにちは!


あまり難しく考えなくてもよいと思います。
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
    • good
    • 0
この回答へのお礼

tom04様、ご回答ありがとうございます。

>こんにちは!
→こんにちは^^

>結局100で割り切れるか、400で割り切れるかだけの問題かと
→条件式とか組み立てばかりに気を取られて
 それぞれの数字には無頓着で
 自分の考えに全く無いご指摘だったのには
 ものすごく新鮮な感動を覚えました。

>Excelの場合ですが
 OR関数もしくはAND関数の中に
 OR関数やAND関数を使用するとエラーと判断されます
→そうなんですか?!
 同じ機能ならタダの方で…
 とlibreを使ってましたが、やはりちょっと違うんですかね…

>(5)の数式
>(6)の数式
→文章がとてもわかりやすいので
 ゆっくり、しっかり声に出して読むと
 何とか理解することができました。
 いやぁ、日本語ってずっと考えると混乱が起こりやすいですね(汗)
 
>「FALSE」と表示されるのは、
 どこかのIF関数の「偽の場合」の条件が未記入だと思われます
→未記入…んー…
 条件の組立てそのものがおかしいってことですね(汗)
 んー…まだまだ私はifの条件や組み立てを
 根本的に勉強する必要がでてきました。

 本当に今回も助けていただいて
 ありがとうございました。

お礼日時:2014/09/17 13:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!