dポイントプレゼントキャンペーン実施中!

テキストボックスを利用して計算する時に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として計算している?)

何かよい構文はありませんでしょうか?

A 回答 (1件)

ryo_ky さん、こんばんわ



Abs(D2)は、正負が分からない変数に対して確実に正の値を取りたい時に利用すると便利です。
今回はD2が負であることが分かっているので(というかそのように条件分岐をしているので)、「-D2」と表記するか、「D2 * (-1)」と表記すれば良いですね。

ただし、そのように書いても問題は解決しないかもしれません。
私が同様な条件にて試してみたところ、問題なく条件分岐に成功しましたので、むしろ実際にD1、D2にどのような値が代入されているか、リアルタイムで確認する必要があるのではないでしょうか。

ソースの If Abs(D2) > D1 Then の行にカーソルを合わせ、F9キーを押してください。その行が茶色に着色されると共に、行頭に茶色の●が表示されるはずです。
この状態でプログラムを実行させると、その位置で実行が一時停止されます。
その状態で、Abs(D2) にカーソルを合わせてみてください。現在のAbs(D2)の値が表示されます。また、D1にもカーソルを合わせてみてください。D1の値が表示されます。この2つの値を実際に見比べてみてください。ひょっとしたらD1とD2の大小関係について、ryo_kyさんが想定していた値とは別の値が入っているかもしれませんよ。

途中で止めることができない場合(このソースでは無いとは思いますが)、「Debug.print」を利用します。
If Abs(D2) > D1 Then の上の行に、以下の2行を追加します。
Debug.Print "D1=" & D1
Debug.Print "Abs(D2)=" & Abs(D2)
その上で、Visual Basic Editor から、「表示(V)」-「イミディエイト ウィンドウ」を選んでもらうか、Ctrlキーを押しながらGを押して、イミディエイトウィンドウを開きます。
その状態で実行すれば、D1とAbs(D2)の結果がイミディエイトウィンドウに表示されます。

それで一度値を確認してみてください。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。返事が遅くなりまして申し訳ございません。

値を確認しましたところ、
D1="5"
D2="-10"
Abs(D2)=10
となりまして、10と"5"の比較になった事が問題の様です。
"数値"と数値での違いについては、まだ調べていませんので、良く分かりませんが、
構文を
If Abs(D2) > Abs(D1) Then
(両方とも絶対値)にする事で解決致しました。

F9で○が付く事は知っていましたが、これが式を途中で止める事とは知りませんでした。
重ねて御礼を申し上げます。

お礼日時:2012/06/18 09:54

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