3

我有以下代码来检查输入到两个输入框中的值,如果两个值都为零,那么MsgBox应该显示“停止!” (我稍后将更改为退出子,但我使用 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 & "%"
4

3 回答 3

4

两件事情

1)在存储计算输出时声明MinPer, MaxPerasLong或 aDouble而不是 aString

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”在字符串(第二个字符)中有一个“0”,所以两者都评估为真。

试试这个:

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 函数来执行此操作。请参阅此网址:

如果字符串是数字,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 回答