• ベストアンサー

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/17068)
回答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

  • IFの構文で

    IF の構文を作っていますが Cells(p, 6) がブランクのとき何もしない Cells(p, 6)<= If Cells(p, 7) とき何もしない Cells(p, 6)< If Cells(p, 7) とき その列を削除する という文にしたいのですがうまくできません 自分なりに以下つくったのですが.... お教えいただければと思い投稿しました、どうぞよろしくお願いします。 Sub 削除() Dim p As Long Sheets("前P").Select For p = 200 To 7 Step -1 ’なにもしないで次の処理へ行く ここがうまくいかない If Cells(p, 6) = " " Then   ElseIf Cells(p, 6) < Cells(p, 7) Then Range(Cells(p, 2), Cells(p, 20)).Select Selection.Delete Shift:=xlUp End If Next p End Sub うまくいかないのは上記の構文だとブランクも削除の対象と なってしまうところです。 うまくブランクは残して実行する方法を教えていただきたいのですがよろしくお願いいたします。 .

  • 下記の式の意味が解りません、どなたか解る方がいらっしゃれば訳していただ

    下記の式の意味が解りません、どなたか解る方がいらっしゃれば訳していただけると大変ありがたいです。 当方、初心者なので宜しくお願い致します。 Private Sub CommandButton1_Click() Dim WCnt As Long Dim WIdx As Long Dim WChk As Integer WIdx = 2 WChk = 0 Do While Not WIdx > 65535 If Cells(WIdx, 4) = 1 And Cells(WIdx, 6) = 1 Then WChk = 1 ElseIf Cells(WIdx, 4) = "" And Cells(WIdx, 6) = 1 Then WChk = 0 End If If WChk = 1 Then Cells(WIdx, 3) = 5 End If WIdx = WIdx + 1 Loop Range("C2").Select End Sub Private Sub CommandButton2_Click() Selection.AutoFilter Field:=1 Range("C2:G65536").ClearContents Range("G2").Select End Sub

  • Ifステートメントと条件式を用いた、マクロの記述方式について質問です。(その2)

    Ifステートメントと条件式を用いた、マクロの記述方式について質問です。(その2) 偏差値に対する評価を行う条件式を記述したいのですが。。。  評価基準-偏差値(下限値)  A-60  B-50  C-40  D-それ以下 評価については上述の条件基準に基づきます。 さらに繰り返しにより、セル2~27までの評価を行います。 そこで記述してみたのですが・・・↓ Sub 偏差値評価の出力() Dim x As Integer '偏差値(縦方向) Dim y As Integer '評価(横方向) '偏差値を取得する For x = 2 To 27 偏差値 = Cells(x, 3).Value '偏差値に対する評価を表示する For y = 2 To 27 If 偏差値 < 40 Then '偏差値が40未満 Cells(y, 4) = "D" ElseIf 偏差値 >= 40 Then '偏差値は40以上 Cells(y, 4) = "C" ElseIf 偏差値 >= 50 Then '偏差値は50以上 Cells(y, 4) = "B" ElseIf 偏差値 >= 60 Then '偏差値は60以上 Cells(y, 4) = "A" End If Next y Next x End Sub ↑これだとなぜか、全ての評価が「C」になってしまいます。 どこの記述が間違っているのでしょうか? どなたか教えて頂ければ助かります。

  • 【VBA】 IFの中にIF

    いつもこちらの識者の方々にはお世話になっています。 VBAの質問です。 やりたいことは下記構文を見ていただければわかると思うのですが、 ------------------------------------------------------------------------------ Sub Test() Dim f As Long Dim lRow As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row For f = lRow To 2 Step -1 If Cells(f, 2).Value = "りんご" Then Cells(f, 2).EntireRow.Delete Else Cells(f, 2).Value = Cells(f, 2) & "0" & Cells(f, 3) Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif End If Next f End Sub ------------------------------------------------------------------------------ Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif の部分が解決したい部分になります。 IFで条件分岐したあとの処理にさらにIFで分岐を加えたいのですが、無茶だと思いつつやってみたらやはり通りませんでした。 こういうのはなんというのでしょうか、ネストとも違うと思うのですが・・・ 上記のような場合、どのような構文が適していますでしょうか。

  • IFステートメントの使い方 どちらでもないならば

    「出金も入金も0じゃないならば」としたい場合、どのようなifステートメントを作ればいいでしょう? Sub test() Dim 出金 As Currency Dim 入金 As Currency 出金 = 0 入金 = 0 '(1) If Not (出金 = 0) And Not (入金 = 0) Then MsgBox "出金0入金0ではありません" End If '(2) If (出金 = 0) And (入金 = 0) Then Else MsgBox "出金0入金0ではありません" End If End Sub (1)だとうまくいきません。 (2)のように Elseを使って対応するしかないのでしょうか? (2)でいけますが、今後の勉強の為にelseを使わずに、「どちらでもないならば」の方法を教えてください。

  • 乱数 IFステートメント

    Debug.Print Int((11 - 8 + 1) * Rnd + 8) 「これって8~11までの乱数を発生させますよ」 という意味であってますか? そして、 Sub a() Dim 文字数 As Long 文字数 = Int((11 - 8 + 1) * Rnd + 8) If 8 >= 文字数 <= 10 Then MsgBox 文字数 & "は、8~10の間です" End If End Sub を実行すると、11でも MsgBox 文字数 & "は、8~10の間です" が表示されてしまいます。 「8~10の間なら」メッセージボックスを表示するには、 If 8 >= 文字数 <= 10 Then の部分をどうすればいいですか?

  • マクロif文での条件式について

    マクロ初心者です。Excel2003を使用しています。 仕事上で使用しているエクセル表より、ある値以上の項目を抽出し、その値を用いて計算結果を出すためのマクロを作成いたしました。いろいろなサイトを参考にして自分なりに書いてみたのですが、どうしてもうまくいきません。 表は簡単なもので、以下のようなものです。 1 9 2 24 3 45 4 67 1列目は使用濃度、2列目は測定値です。この測定値が30より大になった項目を抽出し、計算式にその値を代入し計算結果として出したいのです。また、全ての測定値が30以下だった場合は、計算結果の欄に”<30”とのように表示をさせたいと考えています。 以下のようにマクロを書いてみました。 Sub Macro1() For i = 1 to 4 if Worksheets("sheet1").cells(i , 2).value <=30 then Range("A5")=0 '測定値が=<30だった場合は計算をしないので、フラグとして値を入力 Elseif Worksheets("sheet1").cells(i , 2).value > 30 then Range("A5")=Cells(i , 1) Range("B5")=Cells(i , 2) Exit for Endif if Worksheets("sheet1").Range("A5").value > 0 then Range("A6").Formula ="=(50-B5) / A5" Elseif Worksheets("sheet1").Range("A5").value = 0 then Range("A6") ="<30" Else Endif Next i End Sub >30だった項目の抽出まではできたのですが、計算値をだすところがどうしてもうまくいかず、A6セルにはどんな値でも”<30”と入力されてしまいます。 マクロの基本的なルールなどがまだまだ未熟なので、基本的な構文も書けていないと思います。 全然方向性が違うかもしれないので、そういった点も含めてご教示いただけたら幸いです。 分かりにくいかもしれませんが、どうぞよろしくお願いいたします。

  • [VBA] IFと絶対値の組み合わせ

    テキストボックスを利用して計算する時にIF文を利用しているのですが、以下の条件での計算が上手くいきません。 ・テキストボックスは3つ。オブジェクト名はD1、D2、D ・D1とD2に数値が入力されると同時に計算する(Changeイベント) ・D1は正の値のみを持つ ・D2は正、0、負の値を持つ 上手くいかない部分 ・条件:D2が負の値を取る時、絶対値がD1より大きい場合は計算する。                         D1より小さい場合は計算しない。 構文は下記の通りです。 Private Sub D1_Change() Dim R1 As Single Dim R2 As Single Dim R As Single If IsNumeric(D1) And D1 > 0 And D1 <> "" Then R1 = D1 / 2 Else D = "" Exit Sub End If If IsNumeric(D2) Then Else D = "" Exit Sub End If If D2 = 0 Then R = R1 ElseIf D2 > 0 Then R2 = D2 / 2 R = 1 / (1 / R1 + 1 / R2) ElseIf D2 < 0 Then If Abs(D2) > D1 Then R2 = D2 / 2 R = 1 / (1 / R1 + 1 / R2) Else D = "" Exit Sub End If Else D = "" Exit Sub End If D = Format(R * 2, "##.###") End Sub これで計算すると、D2が負の値で且つ絶対値がD1より大きい時、 If Abs(D2) > D1 Then R2 = D2 / 2 R = 1 / (1 / R1 + 1 / R2) Else D = "" Exit Sub End If の部分でElseの方で計算が進んでしまいます。 (Abs(D2)>D1でなく、D2>D1として計算している?) 何かよい構文はありませんでしょうか?

  • 【VBA】IF構文の条件式で範囲が同一の場合

    いつもこちらの識者の方々にはお世話になっています。 VBAの質問です。 IF構文でorを使って複数条件を指定したいのですが、下記のような場合、冗長な気がします。 Sub test() IF Left$(Cells(1, 1), 1) = "あ" or Left$(Cells(1, 1), 1) = ”い" or Left$(Cells(1, 1), 1) = ”う" Then Cells(1, 1).EntireRow.Delete End Sub 条件式で範囲が同一の場合、例えば IF Left$(Cells(1, 1), 1) = ”あ","い","う" Then Cells(1, 1).EntireRow.Delete のように、もっとスッキリした記述方法はありますでしょうか。

  • マクロ 条件分岐の仕方

    いつも回答ありがとうございます。 条件分岐について質問です。 文字に『N 』含まれている時の条件処理と、『N』が含まれていない時の条件処理を記述記述しました。一応、この記述で上手く動作しているので問題ないのですが、他に記述方法はないのでしょうか?宜しくお願い致します。 Sub 色を塗る2() Dim b As Long '仮シートの列 Dim res As Variant '色の設定 Dim c As Variant '最後に定期をした日付のセル番地 Worksheets("仮シート").Activate b = 2 Do While Worksheets("仮シート").Cells(2, b).Value <> "" With Worksheets(Worksheets("仮シート").Cells(2, b).Value) Set c = .Columns("C").Find("定期", , xlValues, 1, , 2).Offset(, -1) If Worksheets("仮シート").Cells(2, b).Value Like "*N*" Then If (Date - 30) <= c And c <= Date Then res = 8 ElseIf (Date - 60) <= c And c <= (Date - 31) Then res = 10 ElseIf c <= (Date - 61) Then res = 3 End If End If If Worksheets("仮シート").Cells(2, b).Value Like "*N*" = False Then If (Date - 10) <= c And c <= Date Then res = 8 ElseIf (Date - 30) <= c And c <= (Date - 11) Then res = 10 ElseIf c <= (Date - 31) Then res = 3 End If End If Worksheets("仮シート").Cells(3, b).Interior.ColorIndex = res End With b = b + 1 Loop End Sub

専門家に質問してみよう