3

2 つの入力ボックスに入力された値をチェックする次のコードがあります。両方の値が 0 の場合、MsgBox"Stop!" と表示されます。(これは後でサブを終了するように変更しますが、テストには MsgBox を使用しています)

テストの結果、次の結果が得られました。

  • 両方の文字列にゼロを指定すると、予想されるメッセージ ボックスが生成されます。

  • 最初の文字列にゼロ以外の値があり、その後に 2 番目の文字列にゼロ以外の値が続くと、(予想どおり) 何もしません。

  • 最初の文字列のゼロの後に 10 以上の 2 番目の文字列値が続くと、メッセージ ボックスが表示されます (予期しない)。

また、2 番目の文字列が 6-9 の場合、 と表示されることにも気付きましたx.00000000000001%。これは浮動小数点の問題であり、関連していると思いますか? この動作は、IF... InStr関数がなくても発生します。

Option Explicit
Sub Models()
    Dim MinPer As String, MaxPer As String, Frmula As String
    Dim Data As Worksheet, Results As Worksheet
    Set Data = Sheets("Data")
    Set Results = Sheets("Results")

    Application.ScreenUpdating = False

    MinPer = 1 - InputBox("Enter Minimum Threshold Percentage, do not include the % symbol", _
    "Minimum?") / 100
    MaxPer = 1 + InputBox("Enter Maximum Threshold Percentage, do not include the % symbol", _
    "Maximum?") / 100


    If (InStr(MinPer, "0") = 0) And (InStr(MaxPer, "0") = 0) Then
    MsgBox "STOP!"
    End If

    ' Remainder of code...

これは、これまで VBA で遭遇した中で最も興味深い問題であり、それについての議論を歓迎します。

編集:このコードを使用して、エンドユーザーが表示するパラメーターを画面に表示します。したがって、.00000000001% の問題にどのように気付いたか:

    .Range("D2").Value = "Min is " & 100 - MinPer * 100 & "%"
    .Range("D3").Value = "Max is " & MaxPer * 100 - 100 & "%"
4

3 に答える 3

4

二つのこと

1)計算からの出力を保存しているので、 aまたは aMinPerではなく aMaxPerとして宣言しますLongDoubleString

2)InputBoxを直接計算に使用しないでください。それらを変数に格納し、入力が有効な場合は計算で使用します

Dim MinPer As Double, MaxPer As Double, Frmula As String
Dim Data As Worksheet, Results As Worksheet
Dim n1 As Long, n2 As Long

Set Data = Sheets("Data")
Set Results = Sheets("Results")

Application.ScreenUpdating = False

On Error Resume Next
n1 = Application.InputBox(Prompt:="Enter Minimum Threshold Percentage, do not include the % symbol", _
Title:="Minimum?", Type:=1)
On Error GoTo 0

If n1 = False Then
    MsgBox "User cancelled"
    Exit Sub
End If

On Error Resume Next
n2 = Application.InputBox(Prompt:="Enter Maximum Threshold Percentage, do not include the % symbol", _
Title:="Maximum?", Type:=1)
On Error GoTo 0

If n2 = False Then
    MsgBox "User cancelled"
    Exit Sub
End If

If n1 = 0 And n2 = 0 Then
    MsgBox "STOP!"
End If

MinPer = 1 - (Val(n1) / 100)
MaxPer = 1 + (Val(n2) / 100)
于 2012-07-10T15:48:50.803 に答える
0

これは、数値「10」の文字列 (2 番目の文字) に「0」が含まれているため、両方が true と評価されるためです。

代わりにこれを試してください:

If (MinPer = "0") And (MaxPer = "0") Then
    MsgBox "STOP!"
End If

追加の制御については、ユーザー入力 ( MinPer 、 MaxPer ) を保存し、それらに対して数学演算を実行する前に有効性を確認するためにテキストを送信します。

于 2012-07-10T15:48:37.613 に答える
0

InStr(MinPer, "0") は、文字列にゼロ文字が含まれているかどうかを確認するだけです。

文字列値を整数に変換する必要があります。これを行うには、IsNumeric および CInt 関数を使用します。次の URL を参照してください。

文字列が数値の場合、VBAは文字列をintに変換します

Dim minPerINT as Integer
Dim maxPerINT as Integer

If IsNumeric(minPer) Then
    minPerINT = CInt(minPer)
Else
    minPerINT = 0
End If
If IsNumeric(maxPer) Then
    maxPerINT = CInt(maxPer)
Else
    maxPerINT = 0
End If

If minPerINT = 0 and maxPerINT=0 Then
    MsgBox "STOP!"
End If

入力できるデータによっては、len() 関数を使用して、データの長さがゼロかどうかを確認することもお勧めします。

于 2012-07-10T15:48:54.957 に答える