意外的字符串结果

时间:2012-07-10 15:39:50

标签: excel vba excel-vba

我有以下代码来检查输入两个输入框的值,如果两个值都为零,则MsgBox应显示“停止!” (我稍后会更改它以退出sub但我使用MsgBox进行测试)

从测试中我看到了这些结果:

  • 两个字符串中的零都会生成预期的消息框。

  • 第一个字符串中的非零值后跟第二个字符串中的任何非零值都不会执行任何操作(正如预期的那样)。

  • 第一个字符串中的零后跟第二个字符串值等于或大于10会产生消息框(意外)。

我还注意到,如果第二个字符串是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 & "%"

3 个答案:

答案 0 :(得分:4)

两件事

1)在存储输出时声明MinPerMaxPerLongDouble而不是String从计算

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)

答案 1 :(得分:1)

这是因为数字“10”在字符串中有一个“0”(第二个字符),所以两者都评为true。

请改为尝试:

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

对于其他控制,保存用户输入(MinPer,MaxPer),然后在对它们执行nay数学运算之前将它们发送给它们有效。

答案 2 :(得分:0)

InStr(MinPer,“0”)只是检查字符串是否包含零 字符。

您需要将字符串值转换为整数。使用IsNumeric和CInt函数 要做到这一点。请参阅此网址:

vba convert string to int if string is a number

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()函数,数据为零。