- ベストアンサー
IFステートメントの条件式が間違っているのでしょうか?
エクセルVBA初心者です。下記の式を作りましたが、計算した結果が正しい答えになりません。構文エラーが出ないので構文は間違ってはいないと思うのですが、答えが違うので参っています。どなたか何が間違っているのかおしえて下さい。よろしくお願いします。 Cells(6, "E") にある数字時を入れた時の答えをCells(6, "G") に求めるものです。 Sub 計算() Dim my As Long If Cells(6, "E") <= 90 Then my = 50000 * Cells(6, "E") / 30 Cells(6, "G") = my ElseIf 90 < Cells(6, "E") <= 120 Then my = 50000 + 40000 * (Cells(6, "E") - 90) / 30 Cells(6, "G") = my ElseIf 120 < Cells(6, "E") <= 150 Then my = 90000 + 30000 * (Cells(6, "E") - 120) / 30 Cells(6, "G") = my ElseIf 150 < Cells(6, "E") <= 180 Then my = 120000 + 20000 * (Cells(6, "E") -150) / 30 Cells(6, "G") = my ElseIf 180 < Cells(6, "E") <= 210 Then my = 140000 + 10000 * (Cells(6, "E") -180) / 30 Cells(6, "G") = my End If End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 質問の場合は、ElseIf 90< cells(6,"E") とかの 前の部分 <90 は不要です。 それと、Cells(6,"G")=myはどれも同じですから最後にひとつにした方がベターです。 その為には、Dim my As Long を Dim my As Variantとした方がいいでしょう。 それから、210より大きい場合の処理がありませんね。 参考コードを2つほどアップしておきます。 ------------------------------------------------ Sub 計算() Dim my As Variant '●LongをVariantにする If Cells(6, "E") <= 90 Then my = 50000 * Cells(6, "E") / 30 ElseIf Cells(6, "E") <= 120 Then my = 50000 + 40000 * (Cells(6, "E") - 90) / 30 ElseIf Cells(6, "E") <= 150 Then my = 90000 + 30000 * (Cells(6, "E") - 120) / 30 ElseIf Cells(6, "E") <= 180 Then my = 120000 + 20000 * (Cells(6, "E") - 150) / 30 ElseIf Cells(6, "E") <= 210 Then my = 140000 + 10000 * (Cells(6, "E") - 180) / 30 Else MsgBox "210より大きいので計算しません" End If Cells(6, "G") = my End Sub ---------------------------------------------- Sub 計算222() Dim my As Variant '●LongをVariantにする Select Case Cells(6, "E").Value Case Is <= 90 my = 50000 * Cells(6, "E") / 30 Case Is <= 120 my = 50000 + 40000 * (Cells(6, "E") - 90) / 30 Case Is <= 150 my = 90000 + 30000 * (Cells(6, "E") - 120) / 30 Case Is <= 180 my = 120000 + 20000 * (Cells(6, "E") - 150) / 30 Case Is <= 210 my = 140000 + 10000 * (Cells(6, "E") - 180) / 30 Case Else MsgBox "210より大きいので計算しません" End Select Cells(6, "G").Value = my End Sub -------------------------------------------- 210より大きい場合はCells(6,"G")は見た目空白になります。 以上です。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
A条件該当をした場合の処理の後(次、下)では、A条件はその次のステップに入ってこないと考えて、IF ELSEIFを考えること。 したがって 90 < Cells(6, "E") <= 120 の90<は不要。 数学問題の表現と異なります。 CELLS()=MYは最後に1回やればよい。 また、今のままでやるなら、毎回MYに入れてCELLSにセットしなくても cells(6,"G")=50000+・・・とも書ける。
お礼
ありがとうございました。私は初心者で数学での不等号の書式を使いましたが、VBAでは表現が異なっていました。「へえ~」とか「なるほど」といった感覚で驚きでしたが、これからの勉強に役立てていきたいと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 プロパティとWith ステートメントを入れ、エラー値を返すようにすると、こうなりますね。 Sub 計算3() Dim my As Variant With Cells(6, 5) If VarType(.Value) = vbDouble Then Select Case .Value Case Is <= 90 my = 50000 * .Value / 30 Case Is <= 120 my = 50000 + 40000 * .Value / 30 Case Is <= 150 my = 90000 + 30000 * (.Value - 120) / 30 Case Is <= 180 my = 120000 + 20000 * (.Value - 150) / 30 Case Is <= 210 my = 140000 + 10000 * (.Value - 180) / 30 Case Else my = CVErr(xlErrNum) '#Num! のエラー End Select Else my = CVErr(xlErrValue) '#Value! のエラー End If .Offset(, 2).Value = my End With End Sub
お礼
ご教示ありがとうございます。理解はできましたが、知らない関数が出てきて初心者の私にとっては少し難しいご回答でした。分からない所は勉強しながら今後に役立てて行きたいと考えています。
ElseIf 90 < Cells(6, "E") <= 120 Then ではなく、 ElseIf (90 < Cells(6, "E")) AND (Cells(6, "E") <= 120) Then では?
お礼
大変ありがとうございました。参考になりました。普通の数学の不等式ではだめですね。本当に助かりました。
お礼
私が想定していた以上の回答ありがとうございます。 今後にかなり役立つ回答でした。本当にありがとうございました。一つ素朴な疑問なのですが、IFとCASEの使い分けは何か特徴があるのでしょうか?例えば複雑な条件の時にはIFを使うとか・・・?今回のケースではCASEが簡単で良かったと思います。時間のある時で結構ですので教えていただければ幸いです。