如何在Microsoft Access中引用子窗体中的值表

时间:2011-05-31 16:33:42

标签: ms-access search

我正在为我的数据库进行搜索功能。我已经创建了一个测试数据库来解决问题而且我已经陷入困境。当我在同一个表单上搜索范围时非常简单,我使用以下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, vbInformation, "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", vbInformation, "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编程非常不熟练,而且我已经完成了在两周内从头开始创建数据库的任务。提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

我不明白哪个表单包含Command24。你可以暂时改变Command24_Click。

Private Sub Command24_Click()
    Debug.Print "'Me' refers to " & Me.Name
    Stop
End Sub

Stop语句会让你进入休息模式。然后,您可以使用“立即窗口”探索对象路径变体,直到找到引用正确形式的变体。

但是,鉴于您的特殊情况(VBA体验很少且截止日期很紧),我建议您切换到更简单的表单设计。问问自己,搜索表单是否必须以选项卡控件中的页面上的另一种形式嵌入。

编辑:关于命名方案的评论是现货,IMO。显然你同意,并打算稍后改为有意义的名字。如果你现在这样做,你可以更容易地解决问题。特别是,不愿意硬连接这样一个表单的名称:

Forms!test2

“test2”是表单名称的不良选择;你肯定会改变那个。因此,现在使用“我”来引用包含命令按钮的表单。然后,重命名表单时代码不会中断。这是后来不再赘述的细节。

仍然不确定我对表单详细信息的理解程度,但我建议您在设置子表单过滤器后进入中断模式并检查您是否得到了所需内容。在立即窗口中,尝试以下变体:

? Me.Child16.Form.FilterOn

我说的变化是因为我对是否让对象路径正确持怀疑态度。根据需要进行调整。

Edit2 :代码完成构造strWhere后,将其打印到立即窗口,以便确认它包含您期望的内容(或者如果您愿意,可以在MsgBox中显示)。

Debug.Print "strWhere: " & strWhere

Edit3 :您正在使用以下语句构建过滤器表达式:

"( Forms!test2!Child16.Form.[testNUm] < " & Me.Text22

我会使用&lt;左侧的表单记录源中的字段名称。字符。

"([SomeNumberField] < " & Me.Text22