【问题标题】:How to refer to a table of values in a subform in Microsoft Access如何在 Microsoft Access 的子窗体中引用值表
【发布时间】:2011-05-31 16:33:41
【问题描述】:

我正在为我的数据库开发搜索功能。我创建了一个测试数据库来解决问题,但我被卡住了。当我在同一个表单上时,在一个范围内搜索非常简单,我使用以下 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 编程方面相当不熟练,我的任务是在 2 周内从头开始创建数据库。提前感谢您提供的任何帮助。

【问题讨论】:

  • 你应该认真地尝试给你的组件和变量一些更具自我描述性的名称。
  • 抱歉,我只是在 2 分钟内完成了测试用例,以后我一定会坚持使用更易于理解的命名约定

标签: ms-access search


【解决方案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

我会使用

"([SomeNumberField] < " & Me.Text22

【讨论】:

  • 嗨@HansUp,我为糟糕的命名方案道歉。 Command24_Click 在主窗体中,指的是使用我的 testNumbers 表作为其数据源的子窗体。我已经设法获得了我想要的行为(在一个数字范围内搜索),但我仍然不确定为什么我的上述方法不起作用。我只包括了我改变的行。 Private Sub Command24_Click() If Not IsNull(Me.Text20) Then strWhert = strWhert & "( [testNUm] >= " & Me.Text20 & ") AND " End If Form_test2.Child16.Form.Filter = strWhert Form_test2.Child16. Form.FilterOn = True End If End Sub
  • 嗨 HansUp,我已经从我的原始代码中打印出声明,并且它似乎构造正确。但是,从我之前的 msgbox 调试语句 MsgBox Forms!test2!Child16.Form.testNUm, vbInformation, "wtf" 看来,我原来的方法只会引用与我表中的 testNUm 字段相关的文本框中存储的当前信息.我通过更改字符串的构造方式并使用 Me.Child16.Form.Filter= strWheret 并为其分配相关的过滤器字符串来解决此问题。我仍然不确定为什么我原来比较子表单字段的方法不起作用
  • 非常感谢汉斯,我的调试技巧相当生疏,但你的指点肯定有帮助。再次为我模棱两可的命名方案道歉。
  • 不客气,imrz。 RE调试,我建议了一个Stop语句来触发中断模式。这对我来说很容易描述。您实际上应该做的是在您的代码中设置一个临时断点。单击相应代码行左侧的边距(并非所有语句都支持断点),以便在边距中出现一个红点。或者右键单击代码行并从弹出菜单中选择 Toggle->Breakpoint。无论哪种方式都比 Stop 语句更可取,因为这些断点不会与代码一起保存......所以与 Stop 不同的是,您不需要稍后撤消它。
猜你喜欢
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多