如何检查 textbox.value 是否为数字?

How to check if textbox.value is numerical?

我正在从事一个为仪器控制创建 GUI 的项目。

我创建了一个带有几个文本框的用户表单来调整仪器设置。
这些文本框的条目应该是数字。

由于 textbox.value 存储为变体,我写了一个 sub 来检查条目是否为数字。

下面是我写的子以及我如何在文本框更改事件中调用它。

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 的步长值发生了哪些变化。

我怀疑我的变量范围。尽管我所有的代码都是在用户窗体范围内编写的,并且 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 提供的所有帮助。