从表单中的文本框中捕获文本时,如何修复运行时错误?

Posted

技术标签:

【中文标题】从表单中的文本框中捕获文本时,如何修复运行时错误?【英文标题】:How can I fix a run-time error when capturing text from a textbox in a form? 【发布时间】:2020-02-25 14:31:19 【问题描述】:

我正在尝试捕获输入到使用以下模块代码创建的表单实例的文本框中的值:

Public myForm As Form_Form1    
'Dim myForm As Form_Form1       ' tried this

Sub test()
'Dim myForm As New Form_Form1   ' tried this

Set myForm = New Form_Form1
With myForm
    .Visible = True
'    .SetFocus          ' tried this
'    .Modal = True      ' tried this

    If .IsCancelled Then
        Exit Sub
    End If

    Debug.Print .RptDt

End With

表单非常基本,带有一个确定和取消按钮以及一个名为 Text7 的文本框。表单代码隐藏为:

Private cancelling As Boolean

Public Property Get RptDt() As String
    RptDt = Text7.Text
End Property

Public Property Get IsCancelled() As Boolean
    IsCancelled = cancelling
End Property

Private Sub Command2_Click()
    'DoCmd.Close acForm, Me.Name
    Me.Visible = False
    'Me.Visible
End Sub

Private Sub Command4_Click()
    cancelling = True
    'DoCmd.Close acForm, Me.Name
    'MsgBox Me.Name
    'MsgBox Me.OpenArgs

    'Me.Hide
    Me.Visible False
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = VbQueryClose.vbFormControlMenu Then
        cancelling = True
    Me.Visible = False
    End If
End Sub

当我按原样运行代码时:

“运行时错误 '2185' 除非控件具有焦点,否则无法引用控件的属性或方法”

我也试过了:

 Public Property Get RptDt() As String
    RptDt = Text7.Value
End Property

然后我得到运行时错误 '94' Invalid use of null。上面的代码是从可比较的 Excel VBA 代码修改而来的,该代码在 Sub Test() 中使用 Userform Show 方法(仅适用于 Excel)而不是 .Visible = True

【问题讨论】:

也许在.Visible = True下试试DoEvents 错误发生在哪一行? 在 ``` Debug.Pring .RptDt`` 行出现错误。 【参考方案1】:

只是补充一点,但在 Command4_Click 事件中更改以下行以添加等号:

Me.Visible = False

这可以改变语法并且是与预期不同的功能。

.Text 属性只能在控件获得焦点时调用。同样,当文本框为空时,如果您在其位置使用.Value,则会调用null 异常。

有两种解决方法:

选项 1 - 处理 NULL 值

Public Property Get RptDt() As String
    If IsNull(Text7.Text) = True Then
        RptDt = "EmptyString"    'Or whatever string you want to set this to
    Else
        RptDt = Text7.Text
    End if
End Property

选项 2 - 设置焦点

Public Property Get RptDt() As String
    Text7.SetFocus
    RptDt = Text7.Text
End Property

【讨论】:

谢谢 - 好地方。我试过这个。仍然不能解决问题。 Debug.print .RptDt 代码行抛出错误。 感谢这已修复运行时错误,但不幸的是,现在代码一直运行到完成(打开表单,保持打开状态)但没有暂停以允许用户在在代码完成之前形成。 很高兴在解决问题的基础上升级您的解决方案。我可以捕获 Text7 值,但只能通过声明一个模块级变量然后创建另一个子来以现在隐藏的形式显示该值。我会做进一步的调查,试图找到更好的方法。非常感谢您的帮助

以上是关于从表单中的文本框中捕获文本时,如何修复运行时错误?的主要内容,如果未能解决你的问题,请参考以下文章

C#如何从表单中的文本框中获取文本,从不同的类调用

以编程方式设置文本框值但返回运行时错误 2115

在页面加载时修复文本框中的日期格式

如何更正错误未捕获的 typeError 验证器未定义并防止我的表单在错误时发布

当用户从 MS Access 的组合框中选择“其他”时,如何显示输入表单?

键入文本时在运行时从文本框中删除空格