Microsoft Access runtime error 2455 when trying to access grandchildren forms from child form

▼魔方 西西 提交于 2019-12-01 21:27:49


I have three forms in an Access 2003 database (developing in Access 2007) that sit in a parent -> child -> grandchild relationship. In the 'Form_Load' sub of the child form, I set some properties of the grandchild (form header, row source, and control logic). When I view the child form, everything works properly. When I view the parent form, I get the error:

Run-time error '2455': You entered an expression that has an invalid reference to the property Form/Report.

in reference to the line:

Me.GrandchildFormName.Form.Foo.Caption = "bar"

I can access any property of the grandchild form except the Form property without throwing any errors. Does anyone know what might be causing this? I made a test case in a new database and it worked fine, so I'm leaning towards there being something in the legacy code I inherited with the database (which, I've been told, goes back 18 years to a pre-Access database system) that is causing the problem, but I figured I'd check here to see if any of you might know a work-around.

If it's relevant, the actual structure of the forms is a bit more complicated, with the grandchild form appearing multiple times (under different control names) in the child form, like this:

| A            |
|  |----------||
|  | B        ||
|  |  |------|||
|  |  | C[1] |||
|  |  |------|||
|  |          ||
|  |  |------|||
|  |  | C[2] |||
|  |  |------|||
|  |----------||

Eliminating all but one of the grandchild forms does not fix the problem.

I could probably write code to work around the problem if there was a way for the grandchild form to know which of the instances it is being loaded as, but as far as I am aware, that isn't possible.


I will use Parent, Child, and GrandChild for referring to the respective forms (not the data sources).

Generally the Form property of a subform control gets a "valid reference" only after the subform is shown. Thus, if you want to execute the code in Child.Form_Load, you have to make sure that GrandChild is visible when Parent opens.


Since I assume that in your case GrandChild is visible if you open Child (without opening Parent) but GrandChild is not visible when you open Parent, I would suggest the following solution without changing your UI:

Move the code of Child.Form_Load, which accesses GrandChild.Form, into GrandChild.Form_Load. Whenever GrandChild loads it can access everything from Child (Me.Parent.Form) or even Parent (Me.Parent.Parent.Form).

In other words GrandChild has to pull the information (from Child or Parent) and change itself instead of Child pushing the information down to GrandChild by changing GrandChild.


Let's say Parent has an 1:n relationship to Child and Child has an 1:n relationship to GrandChild. Parent presents Child as a datasheet thus GrandChild is not not shown when Parent opens. In this case any access to GrandChild.Form results in a 2455 runtime error since GrandChild is not shown.

In this example each line of the Child datasheet would have a plus-symbol which allows to show GrandChild. Let's say you put a button on Parent which executes the code you currently have in your Child.Form_Load sub. Clicking on this button after Parent opens results in an error (see above), but if you click on one of the plus-symbols in Child and then click on the button the code would execute without the 2455 error since in this case GrandChild was made visible before the GrandChild.Form access was executed.


Just above the line giving the problem type: On Error Resume Next

Run it and that will solve your problem. After one run you can erase the line and will keep working.