• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんばんは。 質問の場合は、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")は見た目空白になります。 以上です。

crypto
質問者

お礼

私が想定していた以上の回答ありがとうございます。 今後にかなり役立つ回答でした。本当にありがとうございました。一つ素朴な疑問なのですが、IFとCASEの使い分けは何か特徴があるのでしょうか?例えば複雑な条件の時にはIFを使うとか・・・?今回のケースではCASEが簡単で良かったと思います。時間のある時で結構ですので教えていただければ幸いです。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

A条件該当をした場合の処理の後(次、下)では、A条件はその次のステップに入ってこないと考えて、IF ELSEIFを考えること。 したがって 90 < Cells(6, "E") <= 120 の90<は不要。 数学問題の表現と異なります。 CELLS()=MYは最後に1回やればよい。 また、今のままでやるなら、毎回MYに入れてCELLSにセットしなくても cells(6,"G")=50000+・・・とも書ける。

crypto
質問者

お礼

ありがとうございました。私は初心者で数学での不等号の書式を使いましたが、VBAでは表現が異なっていました。「へえ~」とか「なるほど」といった感覚で驚きでしたが、これからの勉強に役立てていきたいと思います。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 プロパティと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

crypto
質問者

お礼

ご教示ありがとうございます。理解はできましたが、知らない関数が出てきて初心者の私にとっては少し難しいご回答でした。分からない所は勉強しながら今後に役立てて行きたいと考えています。

noname#11594
noname#11594
回答No.1

ElseIf 90 < Cells(6, "E") <= 120 Then ではなく、 ElseIf (90 < Cells(6, "E")) AND (Cells(6, "E") <= 120) Then では?

crypto
質問者

お礼

大変ありがとうございました。参考になりました。普通の数学の不等式ではだめですね。本当に助かりました。

関連するQ&A

専門家に質問してみよう