4

Access 2003 データベース (Access 2007 で開発中) に、親 -> 子 -> 孫の関係にある 3 つのフォームがあります。子フォームの「Form_Load」サブで、孫のいくつかのプロパティ (フォーム ヘッダー、行ソース、および制御ロジック) を設定します。子フォームを表示すると、すべてが正常に機能します。親フォームを表示すると、次のエラーが表示されます。

実行時エラー '2455': プロパティ Form/Report への無効な参照を含む式を入力しました。

行を参照して:

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

Form プロパティを除く孫フォームのすべてのプロパティにアクセスできますが、エラーは発生しません。誰がこれを引き起こしているのか知っていますか? 私は新しいデータベースでテストケースを作成し、それはうまく機能したので、データベースで継承したレガシーコードに何かがあることに傾いています(これは18年前にアクセス前に戻ると言われていますデータベース システム) が問題を引き起こしていますが、回避策を知っている人がいるかどうかを確認するためにここをチェックすると思いました。

関連する場合、フォームの実際の構造はもう少し複雑で、次のように、孫フォームが子フォームに (異なるコントロール名で) 複数回表示されます。

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

1 つを除くすべての孫フォームを削除しても、問題は解決しません。

孫フォームがどのインスタンスとしてロードされているかを知る方法があれば、おそらく問題を回避するコードを書くことができますが、私が知る限り、それは不可能です。

4

2 に答える 2

3

ParentChild、およびを使用GrandChildして、それぞれのフォーム (データ ソースではありません) を参照します。

通常、Formサブフォーム コントロールのプロパティは、サブフォームが表示された後にのみ「有効な参照」を取得します。したがって、 でコードを実行する場合は、開いたときに が表示されるChild.Form_Loadようにする必要があります。GrandChildParent

解決

あなたのケースでは、開いた場合は表示されますがGrandChild、開いた場合は表示されChildないと想定しているため、UIを変更せずに次の解決策を提案します。ParentGrandChildParent

Child.Form_Loadにアクセスするのコードを に移動しGrandChild.FormますGrandChild.Form_LoadGrandChildロードするたびに、 Child( Me.Parent.Form) またはParent( ) からすべてにアクセスできますMe.Parent.Parent.Form

言い換えると、 を変更して に情報をプッシュするのではなく、(またはGrandChildから) 情報をプルして、それ自体を変更する必要があります。ChildParentChildGrandChildGrandChild

例:

と1:n のParent関係がChildありChild、 と 1:n の関係があるとしGrandChildます。データシートとして表示されるためParent、開いたときに表示されません。この場合、 にアクセスすると、 が表示されていないため、2455 ランタイム エラーが発生します。ChildGrandChildParentGrandChild.FormGrandChild

Childこの例では、データシートの各行に、表示できるプラス記号がありますGrandChild。現在サブParentにあるコードを実行するボタンを配置するとします。Child.Form_Load開いた後にこのボタンをクリックするとParentエラーが発生します (上記を参照)。ただし、プラス記号の 1 つをChildクリックしてからボタンをクリックすると、コードは2455 エラーなしで実行さGrandChildれます。GrandChild.Formアクセスを実行しました。

于 2013-09-28T18:27:03.323 に答える
-1

問題の種類を示す行のすぐ上: On Error Resume Next

それを実行すると、問題が解決します。1回実行した後、ラインを消去して作業を続けることができます.

于 2012-10-07T16:17:33.200 に答える