如何参考连续子窗体控制

时间:2010-12-22 21:29:51

标签: ms-access vba access-vba ms-access-2003

我在子窗体控件中有一个Access 2003表单,其中包含一个子表单,设置为连续表单。对于主表单中的一条记录,子表单中将显示1到多条记录。数据显示正确。

主窗体名为窗口小部件,子窗体名为窗口。有5个文本框控件显示子窗体中的数据。有问题的是 ReceiptDate

我想要做的是查看值并确定是否有2009年的收据,如果是,则将该行的背景更改为黄色,以便在用户遇到该条件时突出显示。甚至可以将日期字段的字体更改为粗体..

我尝试了很多方法来引用子窗体的控件。当我尝试Me.Transactions.ReceiptDate时,我只收到该子表单中的第一条记录。我希望能够遍历它们并查看是否满足条件。我尝试了Me.Transactions.ReceiptDate(1)Me.Transactions.ReceiptDate(0)等等。

我也尝试了For Each ctl In Form.Controls路线。它工作了几次迭代,然后我收到一个运行时错误2455“你输入的表达式对属性Form / Report有一个无效的引用”。

我在“数据表”模式下使用了子窗体,但认为这导致我无法读取子窗体控件数组。所以我把它改成了“连续”模式。我也得到了同样的错误。

有没有办法在子表单中引用特定的“行”并根据找到的值执行某些操作?此外,我在On Current事件中执行此操作,因为我不知道在哪里放置代码。子窗体在父窗体之前加载,因此这些控件甚至可能完全“存在”,但是当我在立即窗口中尝试时,我确实获得了第一行的日期。

更新12.23.2010:

在@Remou的亲切帮助下,我能够从RecordSet中调试ReceiptDate字段。这很好,因为现在我可以根据值来评估数据和做某些事情。@ Remou的代码帮我把它放到了OnCurrent事件中:

Dim i As Long
Dim frm As Form
Dim rs As DAO.Recordset

' Get the form and its recordset.
Set frm = Me.Form
Set rs = frm.RecordsetClone

' Move to the first record in the recordset.
rs.MoveFirst

' Move to the first selected record.
rs.Move frm.SelTop - 1

' Enumerate the list of selected records presenting the ReceiptDate field
For i = 1 To rs.RecordCount
    Debug.Print rs![ReceiptDate]
    rs.MoveNext
Next i

所以现在我能够知道子窗体中的哪一行有来自2009的收据,我需要能够突出显示整个行,因为我在for循环中遇到它们。我怎样才能参考实际的行?数据表视图或连续表单视图 - 我已尝试过两者。

条件格式很棒,但它只允许我突出显示一个特定的记录,我宁愿能够通过VBA这样做,因为......从这里我想要使用点击的能力在子表单中的任何记录上,获取收据详细信息并可能打印它们。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在这种情况下,最好使用条件格式。

要引用子窗体上的控件,请按名称引用子窗体控件,然后使用form属性获取包含的窗体,然后按名称控制:

Me.MySubformControlName.Form.MyControl

请参阅:http://www.mvps.org/access/forms/frm0031.htm

答案 1 :(得分:1)

我终于明白了。 frm.SelTop = x将设置所选记录,并从那里我可以设置背景或字体样式等。非常酷。 2009年的简单测试并设置所选记录:

Dim i As Long
Dim frm As Form
Dim rs As DAO.Recordset

' Get the form and its recordset.
Set frm = Me.Form
Set rs = frm.RecordsetClone

' Move to the first record in the recordset.
rs.MoveFirst

' Move to the first selected record.
rs.Move 0

' Enumerate the list of selected records presenting
' the CompanyName field in a message box.
For i = 1 To rs.RecordCount
    If Year(rs![ReceiptDate]) = 2009 Then
        frm.SelTop = i '<-----------------------------
    End If
    rs.MoveNext
Next i

答案 2 :(得分:1)

为了让我从连续表单的底部获取电子邮件,我使用了这么简单的代码(因为我避免使用RecordsetClone代码)

    Me.[email subform].Form.SelTop = Me.[email subform].Form.Count 'selects the last row
    str = Me.[email subform].Form.Email 'capture the value of the last row
    MsgBox str