Ms access 如何引用连续子窗体控件

Ms access 如何引用连续子窗体控件,ms-access,vba,ms-access-2003,Ms Access,Vba,Ms Access 2003,我有一个Access 2003表单,在子表单控件中有一个子表单,设置为连续表单。对于主窗体中的一条记录,子窗体中将出现1到多条记录。数据显示正确 主窗体名为Widgets,子窗体名为Transactions。有5个文本框控件显示子窗体中的数据。有问题的是ReceiptDate 我想做的是查看这些值并确定是否有2009年的收据,如果有,则将该行的背景更改为黄色,以便在用户遇到该情况时突出显示。甚至可以将日期字段的字体改为黑体 我尝试了多种引用子窗体控件的方法。当我尝试Me.Transactions

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

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

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

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

我对表单中的每个ctl尝试了
。控件也尝试了
路线。它运行了几次,然后我收到一个运行时错误2455“您输入的表达式对属性表单/报表的引用无效”

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

是否有方法引用子窗体中的特定“行”,并根据找到的值执行某些操作?此外,我正在当前事件中执行此操作,因为我不知道还要将代码放在哪里。子窗体在父窗体之前加载,因此这些控件甚至可能不完全“在那里”,但当我在即时窗口中尝试时,确实会得到第一行的日期

2010年12月23日更新:

在@Remou的慷慨帮助下,我能够调试并打印记录集中的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实现这一点,因为。。。。。。从这里,我想让用户能够单击子表单中的任何记录,获取收据详细信息,并可能打印它们


有什么想法吗?

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

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

Me.MySubformControlName.Form.MyControl

看:

我终于拿到了。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
Dim i尽可能长
作为形式的Dim frm
Dim rs作为DAO.Recordset
'获取表单及其记录集。
设置frm=Me.Form
设置rs=frm.RecordsetClone
'移动到记录集中的第一条记录。
先走一步
'移动到所选的第一条记录。
rs.移动0
'枚举所选记录的列表
'消息框中的CompanyName字段。
对于i=1到rs.RecordCount
如果年份(rs![ReceiptDate])=2009,则

frm.SelTop=i'为了让我从连续表单的底部获取电子邮件,我使用了这个简单得多的代码(因为我避免了RecordsetClone代码)


我将检查该URL。我想我正确地引用了它,因为我得到了一个日期,但它总是第一个日期,可能有10个子表单“行”要检查。。是否没有可用于迭代的控件“数组”?或者其他类似的方法?正如我提到的,使用条件格式。对子窗体控件的任何引用都将返回当前选定行中的行,但是,条件格式将执行您想要的操作。您可以在此处找到条件格式:非常好。这很有效。非常感谢。如果我想检索并使用同一行上的ReceiptDate值和ReceiptNumber,我该怎么做?是否缺少引用该子窗体中控件数组的内容?如果希望使用活动行中的一个控件或多个控件,可以使用上述语法按名称引用每个控件或绑定字段。也可以使用用户定义的选择()或记录集或记录集克隆(Me.MySubformControlName.Form.recordset),如果单击一条记录,该记录将成为当前记录,您可以对其执行任何操作,包括打印(例如在主窗体
DoCmd.OpenReport“MyReport”,“ID=”&Me.MySubformControlName.Form.ID
)有些人还喜欢在子窗体上放置一个按钮,tgis将显示在每一行上,并向用户清楚地显示正在打印的记录(
DoCmd.OpenReport“MyReport”,“ID=”&Me.ID
)。突出显示整个当前记录的最简单方法是使用隐藏的标题字段、少量vba和条件格式。如果你想知道详细情况,请告诉我。我知道报告的打印。我换成了一个连续的表单,并为此设置了一个cmd按钮。很好!至于“突出显示整个当前记录的最简单方法是使用隐藏的标题字段、一点vba和条件格式。如果需要详细信息,请告诉我。”,我想看一个例子,当然。根据你上面的评论,我正在尝试一些对我不起作用的东西,所以我很确定
    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