如何检查 textbox.value 是否为数字?
How to check if textbox.value is numerical?
我正在从事一个为仪器控制创建 GUI 的项目。
我创建了一个带有几个文本框的用户表单来调整仪器设置。
这些文本框的条目应该是数字。
由于 textbox.value 存储为变体,我写了一个 sub 来检查条目是否为数字。
- 如果是这样,将字符串转换为双精度类型变量。
- 如果不是,发送错误消息并清除条目。
下面是我写的子以及我如何在文本框更改事件中调用它。
- 对于数字条目,代码正确执行并将 textbox.value 中的字符串转换为双精度类型变量。
- 对于非数字条目,textbox.value 没有变化。
我看到错误消息弹出,所以我知道 if 语句正在执行。
Private Sub cast_Val(user_in As String, user_out As Double) 'Cast User Input'
If IsNumeric(user_in) = False Then
user_in = ""
MsgBox ("Not Numeric")
Else
user_out = CDbl(user_in)
End If
End Sub
Private Sub dwell_txt_AfterUpdate()
Call cast_Val(cont_ui.dwell_txt.Value, pulse_wid)
'Dim in_txt As String
'in_txt = cont_ui.dwell_txt.Value
'Call cast_Val(in_txt, pulse_wid)
'cont_ui.dwell_txt.Value = in_txt
End Sub
在调试模式下,我检查了 user_in、user_out、dwell_txt.Value 和 pulse_wid 的步长值发生了哪些变化。
- 当数值时,pulse_wid 和 user_out 都在同一步改变。
因为我的 sub 正在处理数字条目,所以我假设在同一步骤中更改值是它应该如何工作的。
- 对于非数字条目,我可以看到 user_in 值发生变化,但是 dwell_txt.Value 保持不变。
我怀疑我的变量范围。尽管我所有的代码都是在用户窗体范围内编写的,并且 dwell_txt(我的文本框的名称)也应该包含在它下面,但我尝试将我的所有过程和变量声明为 Public。这也不起作用。
我尝试在 cast_Val 过程中更改 dwell_txt 的值。使用这种方法,我设法清除了,但这不是可靠的方法,因为我的 GUI 中还有几个其他文本框,我必须以类似的方式使用 cast_Val 过程。
我尝试将 cast_Val 过程的参数声明为 byVal 和 byRef。在这两个选项中,dwell_txt 中的值没有改变。
最后,我将我的 dwell_txt.Value 分配给一个过程级变量,并将该变量输入 cast_Val。
这种方法似乎是一个很好的解决方法。我在更改事件代码的末尾包含了这个方法。请参阅评论部分以供参考。
我仍然很好奇为什么我的第一种方法不起作用。为什么我不能像使用常规变量那样在过程中输入 textbox.value?
还有一个有点不相关的话题,有没有办法将文本框输入类型更改为 integer/double 而不是变体?
感谢 Tim Williams 的所有支持,我已经设法解决了这个问题。问题在于我对 user_in
参数的声明。
早些时候我尝试过 String、Int、Double 和 Variant 类型。但是,这导致程序传递了文本框 属性 的副本,并且不允许我在过程中更改 属性 本身。当我将 user_in
声明为 Object 类型并传递 cont_ui.dwell_txt
时,我能够更改 cont_ui.dwell_txt.Value
以下是原始条目中发布的代码的工作版本。
Private Sub cast_Val(user_in As Object, user_out As Double) 'Cast User Input'
If IsNumeric(user_in.Value) = False Then
user_in.Value = CStr(user_out)
MsgBox ("Not Numeric")
Else
user_out = CDbl(user_in.Value)
End If
End Sub
Private Sub dwell_txt_AfterUpdate()
Call cast_Val(cont_ui.dwell_txt, pulse_wid)
End Sub
再次感谢 Tim Williams 提供的所有帮助。
我正在从事一个为仪器控制创建 GUI 的项目。
我创建了一个带有几个文本框的用户表单来调整仪器设置。
这些文本框的条目应该是数字。
由于 textbox.value 存储为变体,我写了一个 sub 来检查条目是否为数字。
- 如果是这样,将字符串转换为双精度类型变量。
- 如果不是,发送错误消息并清除条目。
下面是我写的子以及我如何在文本框更改事件中调用它。
- 对于数字条目,代码正确执行并将 textbox.value 中的字符串转换为双精度类型变量。
- 对于非数字条目,textbox.value 没有变化。
我看到错误消息弹出,所以我知道 if 语句正在执行。
Private Sub cast_Val(user_in As String, user_out As Double) 'Cast User Input'
If IsNumeric(user_in) = False Then
user_in = ""
MsgBox ("Not Numeric")
Else
user_out = CDbl(user_in)
End If
End Sub
Private Sub dwell_txt_AfterUpdate()
Call cast_Val(cont_ui.dwell_txt.Value, pulse_wid)
'Dim in_txt As String
'in_txt = cont_ui.dwell_txt.Value
'Call cast_Val(in_txt, pulse_wid)
'cont_ui.dwell_txt.Value = in_txt
End Sub
在调试模式下,我检查了 user_in、user_out、dwell_txt.Value 和 pulse_wid 的步长值发生了哪些变化。
- 当数值时,pulse_wid 和 user_out 都在同一步改变。
因为我的 sub 正在处理数字条目,所以我假设在同一步骤中更改值是它应该如何工作的。 - 对于非数字条目,我可以看到 user_in 值发生变化,但是 dwell_txt.Value 保持不变。
我怀疑我的变量范围。尽管我所有的代码都是在用户窗体范围内编写的,并且 dwell_txt(我的文本框的名称)也应该包含在它下面,但我尝试将我的所有过程和变量声明为 Public。这也不起作用。
我尝试在 cast_Val 过程中更改 dwell_txt 的值。使用这种方法,我设法清除了,但这不是可靠的方法,因为我的 GUI 中还有几个其他文本框,我必须以类似的方式使用 cast_Val 过程。
我尝试将 cast_Val 过程的参数声明为 byVal 和 byRef。在这两个选项中,dwell_txt 中的值没有改变。
最后,我将我的 dwell_txt.Value 分配给一个过程级变量,并将该变量输入 cast_Val。
这种方法似乎是一个很好的解决方法。我在更改事件代码的末尾包含了这个方法。请参阅评论部分以供参考。
我仍然很好奇为什么我的第一种方法不起作用。为什么我不能像使用常规变量那样在过程中输入 textbox.value?
还有一个有点不相关的话题,有没有办法将文本框输入类型更改为 integer/double 而不是变体?
感谢 Tim Williams 的所有支持,我已经设法解决了这个问题。问题在于我对 user_in
参数的声明。
早些时候我尝试过 String、Int、Double 和 Variant 类型。但是,这导致程序传递了文本框 属性 的副本,并且不允许我在过程中更改 属性 本身。当我将 user_in
声明为 Object 类型并传递 cont_ui.dwell_txt
时,我能够更改 cont_ui.dwell_txt.Value
以下是原始条目中发布的代码的工作版本。
Private Sub cast_Val(user_in As Object, user_out As Double) 'Cast User Input'
If IsNumeric(user_in.Value) = False Then
user_in.Value = CStr(user_out)
MsgBox ("Not Numeric")
Else
user_out = CDbl(user_in.Value)
End If
End Sub
Private Sub dwell_txt_AfterUpdate()
Call cast_Val(cont_ui.dwell_txt, pulse_wid)
End Sub
再次感谢 Tim Williams 提供的所有帮助。