Vba 在Access中使用FindNext

Vba 在Access中使用FindNext,vba,ms-access,Vba,Ms Access,我在MS Access中有一个非常基本的应用程序来检查一些数据。 我有一个文本框和一个按钮。 我的简单目标是:我只想在测试框中写一些东西,单击按钮并检索与该搜索匹配的第一条记录。所以我可以检查所有字段。然后我再次单击并获取下一条记录,等等。 如果我在点击按钮事件中写一些基本代码 DoCmd.FindRecord "XXX", , True, , True 它起作用,并找到了与XXX的第一条记录 但是,当我替换固定的“XXX”并使用Texbox(称为ProjectBox)中

我在MS Access中有一个非常基本的应用程序来检查一些数据。 我有一个文本框和一个按钮。 我的简单目标是:我只想在测试框中写一些东西,单击按钮并检索与该搜索匹配的第一条记录。所以我可以检查所有字段。然后我再次单击并获取下一条记录,等等。 如果我在点击按钮事件中写一些基本代码

DoCmd.FindRecord "XXX", , True, , True 
它起作用,并找到了与XXX的第一条记录

但是,当我替换固定的“XXX”并使用Texbox(称为ProjectBox)中的文本时,它不起作用 比如说

DoCmd.FindRecord ProjectBox.Value, , True, , True  
DoCmd.FindRecord ProjectBox.Text, , True, , True  
两个陈述都失败了。。。你能建议点什么吗?
提前谢谢你

好吧,您可以编写代码来搜索并检查数据记录,但为什么不在现有表单上添加一个文本框呢。您输入一些搜索,如XXX,然后在文本框旁边放置一个按钮

那么,假设你有:

于是我打开了一个文本框(txtSearch)和一个按钮

所以,现在我点击按钮时的代码可以是:

Private Sub Command13_Click()

  Me.Filter = "HotelName like '*" & Me.txtSearch & "*'"
  Me.FilterOn = True
  
  
End Sub
现在表单被过滤了,你可以在所有匹配的REOCRD中来回导航。我的意思是,你想过滤一些数据,但是你想在哪里,什么时候,如何处理结果?如果说提取一些数据并在代码中进行过滤是没有意义的,那么您(或用户)如何处理生成的数据呢

当然,在任何形式下,用户都可以点击control-F,此对话框将弹出:

所以,这并不是你经常需要为之编写代码的事情,因为它是内置的

也许您想知道如何遍历、搜索和处理数据,但不使用UI(用户界面),而只使用VBA代码

那么,您可以编写以下代码,从上面的文本框中获取输入,并执行以下操作:

  Dim strSQL        As String
  
  strSQL = "SELECT ID, HotelName FROM tblHotels WHERE HotelName LIKE '*" & Me.txtSearch & "*'"
  
  Dim rst     As DAO.Recordset
  
  Set rst = CurrentDb.OpenRecordset(strSQL)
  
  Do While rst.EOF = False
  
     Debug.Print "ID and Hotel name match = " & rst!ID & "," & rst!HotelName
     
     rst.MoveNext
  Loop
  
  rst.Close
所以上面是纯代码-不使用表单。因此,如果我在上面输入了Banff,那么debug.print(ctrl-g-immedate窗口)将显示以下输出:

Output:
ID and Hotel name match = 153,Banff Springs
ID and Hotel name match = 188,Banff Hotelling
ID and Hotel name match = 206,Banff Inn
ID and Hotel name match = 292,Best of Banff

因此,问题不在于编写代码来搜索或过滤数据,而在于何时何地将数据呈现给用户


由于您要在文本框中键入一些搜索,因此构建表单非常有意义,但如前所述,表单具有内置的搜索功能,但您当然可以在表单上设置过滤器,然后所有移动下一个或上一个的“动作”都由表单中内置的简单下一个/上一个功能处理。因此,您只需编写少量代码进行筛选,但表单内置的导航功能使您无需编写所有下一个/上一个代码。

最后,以下代码似乎工作正常

Me!comboProject.SetFocus
DoCmd.FindRecord ProjectBox.Value, acEntire, False, acSearchAll, True, acCurrent, True
首先,我需要专注于现场 然后我使用acCurrent参数运行DoCmd.FindRecord 由于某些原因,其他参数(如acAll等)不起作用


感谢您给我的所有建议。

如果您在代码行上放置断点,调用事件,并在即时窗格类型中,
?ProjectBox.Value=“XXX”
或任何值
XXX
实际是什么,会发生什么?出于某种原因,如果我放置断点,此即时窗格不会出现。。我使用一个365分贝的存取。。。我可以添加一个名为“Watches”的窗格,在那里我可以看到一些表达式,并确认我的值。在watch窗格中,我看到:watch::ProjectBox。值:“XXX”:Variant/String:Form_等。如果按CTRL+G,应该可以进入即时窗格。是的,现在我看到即时窗格。但是,如果我将此语句放在MsgBox“Go to”&ProjectBox.Value中,我可以看到正确的值,在本例中为H76。但在即时窗格中,我有:?ProjectBox.Value=“H76”False