我有以下代码来检查输入两个输入框的值,如果两个值都为零,则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 & "%"
答案 0 :(得分:4)
两件事
1)在存储输出时声明MinPer
,MaxPer
为Long
或Double
而不是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()函数,数据为零。