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.
Solution
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
.
Example:
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.