- ベストアンサー
代数を使った条件分岐の方法
- if文を使った条件分岐をする際に、共通部分のある条件文を代数を使ってまとめる方法について考えています。条件C1において、Note_on_cかつMOD(I1,1)が0の場合は、F1に6を足した値を最大値124で制限します。また、Note_on_cかつMOD(I1,1)が0.25の場合は、F1から5を引いた値を最小値60で制限します。それ以外の場合は、F1の値をそのまま使用します。現在は入れ子のif文で書いていますが、もっとスマートな方法があれば教えてください。
- 条件分岐で共通部分のある条件文をまとめる方法について悩んでいます。条件C1において、Note_on_cかつMOD(I1,1)が0の場合は、F1に6を足した値を最大値124で制限します。Note_on_cかつMOD(I1,1)が0.25の場合は、F1から5を引いた値を最小値60で制限します。それ以外の場合は、F1の値をそのまま使用します。現在は入れ子のif文で書いていますが、もっと効率的な方法があれば知りたいです。
- if文の条件分岐で共通部分が多いため、代数を使ってまとめたいと考えています。条件C1において、Note_on_cかつMOD(I1,1)が0の場合は、F1に6を足した値を最大値124で制限します。また、Note_on_cかつMOD(I1,1)が0.25の場合は、F1から5を引いた値を最小値60で制限します。それ以外の場合は、F1の値をそのまま使用します。現在はif文を入れ子にして書いていますが、よりスマートな方法があれば教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
補足:論理式とIF文との関係 if a="あ" Then b=10 elseif a="い" Then b=20 else b=0 end if このような if 文はCHOOSE関数と論理式とで書くことで簡略化できます。 =CHOOSE(1+(a="あ")*1 + (a="い")*2, 0,10, 20) 1 + (a="あ")*1 + (a="い")*2 の論理式の値は、 (a="あ")が真ならが、1+1*1=2。偽ならば、1+0*1=1 (a="い")が真ならが、1+1*2=3。偽ならば、1+0*2=1 このことから判るように、上記の論理式の値は、1、2,3のいずれかになります。 if 文のネストを避ける手段として論理式を使うことが可能ですが、先の回答では、論理式の説明を割愛していましたので少し補足しておきます。
その他の回答 (6)
- MackyNo1
- ベストアンサー率53% (1521/2850)
>ここがI1ではI5を用いた理由を教えて頂けませんか? 単純に私の入力間違いです。 C1セルが「 Note_on_cで、かつI1セルの値が0.25の倍数なら、CHOOSE関数の値を引っ張ってくるという条件式です。
お礼
そうですか。ありがとうございます。結局choose式を使わせていただくことになりました。ありがとうございます。
- ken-nosuke
- ベストアンサー率36% (56/154)
条件&答えを下記記号で書くと a:C1=Note_on_c" b:MOD(I1,1)=0 c:MOD(I1,1)=0.5 d:MOD(I1,1)=0.25 e:MOD(I1,1)=0.75 ア:MIN(124,F1+6) イ:MAX(60,F1-5) ウ:MIN(120,F1+6) エ:MAX(90,F1-5) オ:F1 貴式は IF((a and b),ア,IF((a and c),イ,IF((a and d),ウ,・・・・ これで、a が何回も出るのがスマートじゃないということですね。 これを、IFの位置を変えると下記のようになりスマートになります。 IF(a,IF(b,ア,IF(c,イ,IF(d,ウ,IF(e,エ,オ)))),オ)
お礼
ああ、こうやって自分で記号化してしまうと楽ですね。 これは盲点でした。ありがとうございます。どこでも使えそうな技ですね。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! あまり簡潔な式にではないですが・・・ Excel2007以降をお使いだとして =IF(G1="Note_on_c",IFERROR(CHOOSE(MATCH(MOD(I1,1),{0,0.25,0.5,0.75},0),MIN(124,F1+6),MIN(120,F1+6),MAX(60,F1-5),MAX(90,F1-5)),F1),"") こんな感じではどうでしょうか?m(_ _)m
お礼
IFERRORとchoose関数の合わせ技ですね!シンプルですし、わかりやすいです!ありがとうございます。
- KURUMITO
- ベストアンサー率42% (1835/4283)
MOD関数の値によっていろいろと条件が変わりますのでつぎのように作業の列と行を用意して対応するのがよいでしょう。 例えば使用中の表はM列までとして2行目から下方にデータが入力されているとします。 そこで作業のための表ですがN1セルには0、O1セルには0.5、P1セルには0.25、Q1セルには0.75と入力します。 N2セルには =IF(F2="","",MIN(124,F2+6)) O2セルには =IF(F2="","",MAX(60,F2-5)) P2セルには =IF(F2="","",MIN(120,F2+6)) Q2セルには =IF(F2="","",MAX(90,F2-5)) をそれぞれ入力します。 その後にN2セルからQ2セルを選択してそれらの式を下方にドラッグコピーします。 お求めの式は2行目のいずれかのセルに次の式を入力し下方にドラッグコピーすればよいでしょう。 =IF(C2="","",IF(OR(C2<>"Note_on_c",COUNTIF(N$1:Q$1,MOD(I2,1))=0),F2,INDEX(N2:Q2,MATCH(MOD(I2,1),N$1:Q$1,0))))
お礼
なるほど、これは、一つの列で何とかしようとしないで、作業用の行列を作って、そこから情報をとってくるって感じですんね。参考になります。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
<式1> 1+ (C1="Note_on_c" * MOD(I1,1)=0) *2+ (C1="Note_on_c" * MOD(I1,1)=0.25)*3+ (C1="Note_on_c" * MOD(I1,1)=0.5) *4+ (C1="Note_on_c" * MOD(I1,1)=0.75) *5 1--->F1 2--->MIN(124,F1+6) 3--->MIN(120,F1+6) 4--->MAX(60,F1-5) 5--->MAX(90,F1-5) 式1が1ならF1 式1が2ならMIN(124,F1+6) よって、 =CHOOSE(式1,F1,・・・・MAX(90,F1-5)) と書けます。
お礼
これも直感的で非常にわかりやすいですね。ありがとうございます。
- MackyNo1
- ベストアンサー率53% (1521/2850)
例示のように0.25単位で条件分類するなら、CHOOSE関数を使って結果を羅列する、以下のような関数にするのがわかりよいかもしれません。 =IF(AND(C1="Note_on_c",MOD(I5,0.25)=0),CHOOSE(MOD(I1,1)/0.25+1,MIN(124,F1+6),MAX(60,F1-5),MIN(120,F1+6),MAX(90,F1-5)),F1)
お礼
これは大変、シンプルかつ美しい式ですね!最初は意味がわかなかったんですが、計算してみておおっとなりました笑 追加で質問ですが、 MOD(I5,0.25)=0), ここがI1ではI5を用いた理由を教えて頂けませんか?
お礼
うーん、これはすごいですね。 Chooseを数式ではなく、真偽値にすることでどんな非常に応用性のある式になってますね。 昨日までif文も知らなかったんですが、皆様のおかげで今日一日で、随分色々なパターンを覚えられました。