访问以单一形式搜索所有记录

时间:2016-02-24 15:34:16

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

我在单一表单视图中有一个绑定表单。

我想模仿记录导航按钮中搜索框的行为,但也有更多控制权。我面临的问题是,当我的用户搜索记录时,有时他们会在发现记录时意外地开始输入记录(比如在输入3或4个字母后仍然键入搜索词)和原始数据丢失。由于这些字段有时需要输入数据,因此锁定它们实际上并不是一个选项。

我的想法是关闭导航按钮并通过VBA或通过宏模仿此功能,并在找到搜索的值时将焦点设置在另一个锁定的字段上(也可以选择查找下一个或警报某事已经或未被发现。

我已经尝试过使用宏和VBA,但无法使其正常工作。

我有这个代码(并且已经使用了一些参数)但是它只搜索当前记录(而不是所有记录)并且移动到下一条记录,或者如果我注释掉它,则根本没有记录FindNext行。

Private Sub cmdFind_Click()

Dim sText As String
sText = Me.txtSearch 'a text box where user enters search term

DoCmd.FindRecord sText, acAnywhere, False, acDown, True, acCurrent
DoCmd.FindNext

End Sub

显然,我错过了一些东西。有人可以提供一些见解或替代方法。

2 个答案:

答案 0 :(得分:2)

我认为HansUp发布了解决方案......但是由于我想出了一种不同的搜索方式(通过RecordsetCloneFindFirst),我会发布它,也许它是使用。 :)

Private Sub cmdFind_Click()

    Static RS As Recordset
    Static sText As String
    Dim curText As String
    Dim newSearch As Boolean
    Dim sCrit As String

    curText = Nz(Me.txtSearch)
    If curText = "" Then Exit Sub

    ' If text hasn't changed, use FindNext
    If curText = sText Then
        newSearch = False
    Else
        sText = curText
        newSearch = True
    End If

    ' First call?
    If RS Is Nothing Then
        Set RS = Me.RecordsetClone
        newSearch = True
    End If

    ' The field you are searching in
    sCrit = "[Text1] LIKE '*" & sText & "*'"

    If newSearch Then
        RS.FindFirst sCrit
    Else
        RS.FindNext sCrit
    End If

    If Not RS.NoMatch Then
        ' If found, navigate to the record
        Me.Bookmark = RS.Bookmark
    Else
        MsgBox "No (more) matches)", vbInformation
    End If

End Sub

答案 1 :(得分:2)

似乎你想找到任何字段与搜索文本匹配的第一条记录。

在这种情况下,请将acAll代替acCurrent用于第六个参数( OnlyCurrentField )到DoCmd.FindRecord

FindRecord将检查表单的控件,其中包括txtSearch。在调用FindRecord之前立即清除该文本框的值。否则,表单的记录源中的每一行都将被解释为匹配。之所以会发生这种情况,是因为无法告诉FindRecord “在除txtSearch之外的所有控件中查找匹配项。”

如果您使用连续表单视图(暂时)中的表单测试原始代码,则该解释应该更加清晰。使用该代码,FindRecord始终会将您放在第一条记录中。然后DoCmd.FindNext让你进入第二条记录。

无论如何,这里是在Access 2010中进行的代码测试,它可以实现我想要的功能。我使用了文本框的 After Update 事件而不是命令按钮。

Private Sub txtSearch_AfterUpdate()
    Dim strSearch As String

    If Not IsNull(Me!txtSearch.Value) Then
        strSearch = Me!txtSearch.Value 'a text box where user enters search term
        ' txtSearch contains the search text ...
        ' so remove it to avoid matching the first (and every) record
        Me!txtSearch.Value = Null
        DoCmd.FindRecord FindWhat:=strSearch, _
            Match:=acAnywhere, _
            MatchCase:=False, _
            Search:=acDown, _
            SearchAsFormatted:=True, _
            OnlyCurrentField:=acAll ' instead of acCurrent
        ' restore search text to text box
        Me!txtSearch.Value = strSearch
    End If
End Sub