访问VBA:子窗体无法从其他子窗体获取值

时间:2014-03-04 10:21:18

标签: forms ms-access ms-access-2010 subforms

我有3个表格。表单是父表单,其他表单作为父表单的子表单插入:

     f_p            form parent
    /  \
f_c1    f_c2        forms childs 1 and 2

我已经以f_c1格式编写了“当前”事件,因此当用户更改f_c1中的选定行时,应将某些数据复制到f_c2:

Private Sub Form_Current()

    Me.Parent("f_c2").Form("field_in_f_c2") = Me("field_in_f_c1")

End Sub

但是返回错误2455:

You specified an expression that contains a non valid reference to the Form/Report property.

错误似乎出现在“.Form”部分,因为这有效:

Debug.Print Me.Parent("f_c2").Name

但这不起作用:

Debug.Print Me.Parent("f_c2").Form.Name

换句话说,看起来不可能进入父母的孩子。

可能会发生什么?

注意:f_c1通过公共字段绑定到父级,f_c2未绑定到父级。我使用f_c2作为控件的可滚动容器。

注2:我做了一个测试:在一个新的空白表格(“f_p_test”)中,我已经插入了两次f_c2表格(“f_c2_a”和“f_c2_b”)。我在f_c2的复选框上配置了“Click”事件(因此事件在f_c2_a和f_c2_b中均可用)。在此测试中,我可以从f_c2_b字段访问f_c2_a字段,反之亦然。


更新:我刚尝试了一个技巧,但它不起作用:我在父表单中添加了一个按钮,并向其指定了一个事件,所以当我点击按钮时,显示“f_c2”文本框的值。结果:如果我手动单击按钮,则显示值。但是,如果我向表单f_c1的“当前”事件添加单击模拟,则不显示信息,发生相同的旧错误。不可思议!


更新2 :解决了,这是竞争条件。父表单由其他表单打开,其中包含:

DoCmd.OpenForm "f_p"

所以子项(子表单f_c1和f_c2)在父项后面打开,但子项不会同时加载。加载子f_c1时,会运行其“Current”事件,并尝试访问f_c2,但仍未加载f_c2,因此folloging代码失败:

Private Sub Form_Current()                  ' "Current" event for f_c1
    Dim f_c2 As Form
    set f_c2 = Me.Parent("f_c2").Form       ' f_c2 could be not loaded
    ' rest of code
End Sub 

解决方案是检测f_c2是否仍未加载:

Private Sub Form_Current()                  ' "Current" event for f_c1
    Dim f_c2 As Form
    On Error Resume Next
    Set f_c2 = Me.Parent("f_c2").Form
    If Err <> 0 Then                        ' if f_c2 is still not loaded, then return
        Exit Sub
    End If
    On Error GoTo 0
    ' rest of code
End Sub 

幸运的是,当打开父窗体f_p时,f_c1的Form_Current()事件被自动调用两次:第一次,f_c2仍未加载;第二次,f_c2已经加载,因此f_c1数据被成功复制到f_c2的控件。

1 个答案:

答案 0 :(得分:1)

子表单位于子表单(或子控件)中。

如果要引用子表单,则必须通过子表单控件执行此操作。

而不是:Me.Parent("f_c2").Form("field_in_f_c2")

应该是:Me.Parent.<name of subform control>.Form.field_in_f_c2