这是如何返回空值的?

时间:2014-12-17 14:38:03

标签: vba ms-access access-vba ms-access-2010

因此,此代码旨在作为一个简单的搜索系统来转到记录集中的某些记录。我最初拥有它所以他们必须单击btnGoToID按钮才能执行搜索。我决定让它更加用户友好,并使搜索字段听到Enter按钮,这也将执行搜索。

当代码到达strID = Trim(Nz(Me.txtSearch.Value, ""))时,我遇到的问题将随机返回为空字符串,即使在视觉上我可以看到文本框中有值。

在发生此问题时,我无法缩小任何模式。在这一点上,我甚至不知道如何解决这个问题,搜索的话也不会在Google中产生任何结果。我只能说,在记录之间进行更改会影响搜索是否通过。

在我输入txtSearch_KeyPress子过程之前,这一直有效。

'============================================================================
' txtSearch_KeyPress
'============================================================================
Private Sub txtSearch_KeyPress(KeyAscii As Integer)
    'If user pressed enter
    If KeyAscii = 13 Then
        Call btnGoToID_Click
    End If
End Sub



'============================================================================
' btnGoToID_Click
'============================================================================
' <<Purpose>>
' Allow the user to search for a specific ID 
'============================================================================
Private Sub btnGoToID_Click()
On Error GoTo Err_Handler

    Dim rs As Recordset
    Dim strID As String

    Set rs = Me.RecordsetClone

    strID = Trim(Nz(Me.txtSearch.Value, ""))

    If (strID <> "") Then

        'Go to the ID
        rs.FindFirst "ID = '" & strID & "'"

        If rs.NoMatch Then
            MsgBox "ID does not exist"
        Else

            'If we have a match, set the record as the current record
            Me.Bookmark = rs.Bookmark
        End If
    Else
        MsgBox "Please enter a valid ID.", vbOKOnly, "Invalid ID"
    End If


Exit_Handler:
On Error Resume Next

    Me.txtSearch.Value = ""
    rs.Close
    Set rs = Nothing
    Exit Sub

Err_Handler:
    Call LogError(Err.Number, Err.Description, "txtSearch on " & Me.Name)
    Resume Exit_Handler
End Sub

在评论中的谈话之后,我已经缩小了这个问题,使其变得更加简单。即使文本字段中有多个字符,这也会产生“无效使用null”错误消息。为什么会发生这种情况,我该怎么做才能让它获取文本框中的值?

'============================================================================
' txtUnitNoToSearch_KeyPress
'============================================================================
Private Sub txtUnitNoToSearch_KeyPress(KeyAscii As Integer)
    MsgBox Me.txtUnitNoToSearch
End Sub

1 个答案:

答案 0 :(得分:4)

我认为您的问题与文本框有2个属性.Value.Text这一事实有关,这两个属性看似相似但行为不同。

当您在文本框中进行编辑时,可以通过.Text属性更改内容。但是,.Value属性的内容尚未更新以匹配。

在文本框的更新后事件后,.Value将包含新内容。如果焦点已从文本框移开,则其.Text属性将不再可用。

抱歉,我想不出如何更好地解释。但我认为使用 KeyPress 事件过程会更清楚:

Private Sub txtUnitNoToSearch_KeyPress(KeyAscii As Integer)
    Debug.Print "Text: '" & Me.txtUnitNoToSearch.Text & "'"
    Debug.Print "Value: '" & Me.txtUnitNoToSearch.Value & "'"
End Sub

在更改文本框的上下文时,在“立即”窗口中观察Debug.Print的输出。 ( Ctrl + g 将打开立即窗口。)

最后一点是只有Me.txtUnitNoToSearch才能获得默认属性.Value。在处理其余代码时请记住这一点。