问题描述
|
我正在为数据库搜索功能。我已经创建了一个测试数据库来解决问题,并且陷入困境。当我使用相同的表单在一个范围内进行搜索时,很简单,我使用以下VBA代码完成了此操作:
Private Sub Command12_Click()
Dim strWhere As String
Dim lngLen As Long
If Not IsNull(Me.Text8) Then
strWhere = strWhere & \"( [testNUm] >= \" & Me.Text8 & \") AND \"
End If
If Not IsNull(Me.Text10) Then
strWhere = strWhere & \"( [testNUm] < \" & Me.Text10 & \") AND \"
End If
lngLen = Len(strWhere) - 5
If lngLen <= 0 Then
MsgBox \"no criteria\",vbInformation,\"Nothing to do\"
Else
strWhere = Left$(strWhere,lngLen)
Me.Filter = strWhere
Me.FilterOn = True
End If
End Sub
上面的代码似乎运行良好,但是,当我尝试将表单放置在选项卡式窗格视图中并将其作为另一个表单的子表单时,我无法正确访问该子表单的表。我尝试使用此处显示的各种方法http://access.mvps.org/access/forms/frm0031.htm,但我似乎无法做到除引用子窗体中的特定文本框外,还能做其他事情。
Private Sub Command24_Click()
Dim strWhert As String
Dim lngLeng As Long
MsgBox Forms!test2!Child16.Form.testNUm,\"wtf\"
If Not IsNull(Me.Text20) Then
strWhert = strWhert & \"( Forms!test2!Child16.Form.[testNUm] >= \" & Me.Text20 & \") AND \"
End If
If Not IsNull(Me.Text22) Then
strWhert = strWhert & \"( Forms!test2!Child16.Form.[testNUm] < \" & Me.Text22 & \") AND \"
End If
lngLeng = Len(strWhert) - 5
If lngLeng <= 0 Then
MsgBox \"no criteria\",\"Nothing to do\"
Else
strWhert = Left$(strWhert,lngLeng)
Forms!test2!Child16.Form.Filter = strWhert
Forms!test2!Child16.Form.FilterOn = True
End If
End Sub
我不太熟练VBA编程,并且只剩下两个星期要从头开始创建数据库的任务。在此先感谢您提供的任何帮助。
解决方法
我不明白哪种形式包含Command24。您可以通过临时更改Command24_Click来查找。
Private Sub Command24_Click()
Debug.Print \"\'Me\' refers to \" & Me.Name
Stop
End Sub
Stop语句将使您进入中断模式。然后,您可以使用“即时窗口”浏览对象路径的变化,直到找到引用正确形式的对象。
但是,鉴于您的特殊情况(很少的VBA经验和紧迫的期限),我鼓励您改用更简单的表单设计。问问自己,是否绝对必须将搜索表单嵌入到选项卡控件的页面上的其他表单中。
编辑:有关命名方案的评论是在IMO上发现的。显然,您同意,并打算在以后更改为有意义的名称。如果现在执行此操作,则可以使故障排除更加容易。尤其是,不愿意将这样的表单名称硬连线:
Forms!test2
\“ test2 \”是表单名称的不佳选择;当然,您将要更改那个。因此,现在使用\“ Me \”来指代包含命令按钮的表格。这样,当您重命名表单时,您的代码将不会中断。这是以后要讲的少一个细节。
仍然不确定我对表单详细信息的理解程度如何,但是建议您在设置子表单的筛选器并检查是否获得所需的信息后进入中断模式。在立即窗口中,尝试以下变化:
? Me.Child16.Form.FilterOn
之所以说变化,是因为我对是否正确设置对象路径表示怀疑。根据需要进行调整。
Edit2:在代码完成strWhere的构造之后,将其打印到立即窗口中,以便可以确认它包含所需的内容(或根据需要在MsgBox中显示)。
Debug.Print \"strWhere: \" & strWhere
Edit3:您正在使用以下语句构建过滤器表达式:
\"( Forms!test2!Child16.Form.[testNUm] < \" & Me.Text22
我会在<字符左侧的表单记录源中使用字段名称。
\"([SomeNumberField] < \" & Me.Text22