"LinkMasterFields/リンク親フィールド"プロパティの設定でエラー'このオブジェクトには、 オートメーションオブジェクト' 'は含まれていません。'が発生しました。

Msg_2

ACCESS でこのメッセ―ジが表示されてしまう原因と対処を考えます。

再現の手順

メッセージを再現させるためのサンプルとして、顧客とのやり取りを管理するデータベースを作ってみます。

<↓完成フォームイメージ>
Fm1

用意するテーブルは T_顧客T_やり取り

Tables_2

この2つのテーブルを元にフォームを作ります。

手順1 T_顧客 を選択した状態で [フォーム] ボタンをクリックします。

Fm2_2

T_顧客テーブルをデータソースに持つフォームが自動作成されます。

Fm3_2

手順2 名前を付けて保存で F_顧客 として保存します。

Fm4_2

手順3 デザインモードにして T_やり取り をドラッグしてサブフォームを作る

Fm5

手順4 サブフォームウィザードに沿って操作1

コントロールウィザード  Wizard がオンになっていれば、サブフォームウィザードのダイアログが表示されます。

[次へ(N)] をクリックします。

Fm6_2

手順5 サブフォームウィザードに沿って操作2

サブフォームに名前を付け、 [完了(F)] をクリックします。

Fm7_2

これでサブフォーム の完成です。

リンク親フィールドの様子を見ると、 リンク親フィールド:顧客ID; リンク子フィールド:顧客ID; になっています。この状態ならば問題は起きません。

(ACCESS2007以降のディフォルトのフォームのデザインは見ずらい(と思う)ので、 オートフォーマットで見栄えに手を入れています。)

Fm8_2

手順6 親フォームのレコードソースを編集する

次に、メッセージを再現する為、親フォームのレコードソースを編集します。

ここから先は失敗する為の手順です。

親フォームのレコードソースのビルドボタンをクリックして、 T_やり取り テーブルを追加して下さい。

Qrydsign_2

ここでは左外部結合で作りましたが、リレーションの種類はなんでも構いません。 用意するフィールドは T_顧客 の全てと、T_やり取り からは 少なくとも T_やり取り.顧客ID だけは取りこんで下さい。 T_やり取り の他のフィールドはあっても無くてもよいです。


SELECT 
	T_顧客.顧客ID, 
	T_顧客.名前, 
	T_顧客.住所, 
	T_やり取り.やり取りID, 
	T_やり取り.顧客ID, 
	T_やり取り.やり取りメモ, 
	T_やり取り.やり取りした日付
FROM 
	T_顧客 LEFT JOIN T_やり取り 
	ON T_顧客.顧客ID = T_やり取り.顧客ID;

Fm9_2_2

クエリビルダを起動し上述のクエリを作成してしまいます。

Fm10_2

この状態で リンク親フィールド と リンク子フィールド を見てみると、 何も変化していません。が、画像の左 顧客ID のテキストボックスの左肩に何か警告が表示されるようになります。

Fm11_3

エラーを展開表示すると、「指定したフィールドがフィールドリストに存在しません」となっています。

Msg2_2

両方のテーブルの 顧客ID があるので ACCESS が判らなくなくならないように、テーブル名を付けて 顧客ID を管理するようになります。

このエラーを無視してデータ入力しようとすると、顧客IDテキストボックスには #Name? が表示されます。 レコードソースにあるフィールドは、T_顧客.顧客IDT_やり取り.顧客IDであり 顧客IDではないので ACCESS が判らないと言っています。

Fm12_2

放っておけないエラーなので、「なんとかしなければ」と試行錯誤が始まります。 リンク親フィールドの設定し直す為、リンク親フィールドプロパティのビルドボタンをクリックします。

Fm13_2

メッセージが表示されます。[OK] をクリックします。

Msg3_2

サブフォームフィールドリンクビルダが起動します。 リンク親フィールドにT_顧客.顧客IDを設定し、リンク子フィールドには顧客IDを設定します。 リンク親フィールドのドロップダウンには顧客IDの選択肢がありませんので、 解決に一歩近づいたような気分になると思います。

Builder_2

Builder2_2

プロパティの表示はこうなります。

Prp2_3

しかし、この作業は #Name? を表示するテキストボックスの問題とは直接関係ありませんので、テキストボックスの警告表示は消えません。

Fm14_2

「そうだ」と気がついて、顧客IDテキストボックスのコントロールソースも修正します。

Prp_2

エラー表示が消えました。

Fm15_2

この状態でフォームビューに切り替えて、サブフォームに何かデータを入力してみてください。 標題のエラーメッセージが表示されれば成功(?)です。

Fm16_2


ちなみに、このメッセージは’リンク親フィールドのプロパティの設定エラー’を告げる「情報」であって エラーではあっても入力作業自体は続行する事ができます。

Fm17_2

入力は出来てしまうけれど、サブフォームの顧客IDに値が入らない事に注目です。 親と子のリンクが出来ていないようです。 新しいレコードを追加しようとする度にエラーメッセ―ジは表示され続けます。

サブフォームの 顧客ID は隠して作る人が多いでしょうから、 何が起きているのか、さらに訳が判らない状態になると思います。

この顧客ID と関連付けなく入力されたレコードは、レコードを移動すると2度と表示されず、 「入力した筈のデータが表示されない」という状態になります。

手順6 親フォームのレコードソースをそのままの状態でも直せる

リンク親フィールドを設定し直した事が間違いでした。顧客IDのコントロールソースだけを 修正しておけば、そもそもこんなエラーメッセージに悩まされる事は無かったのです。

親フォームのレコードソースに T_やり取り顧客ID まで取り込んだ事がトラブルの原因です。

今回は、 T_顧客をレコードソースにフォームウィザードで作り、 後から親フォームの誤ったレコードソースの編集で、不具合を再現しました。

親フォームのレコードソースに最初からクエリを指定して作る事もあるでしょうから、 クエリに 顧客ID が重複していれば、最初から、
Prp2_2
この状態で作成され、標題のメッセージに悩まされる事になります。 そしてメッセージを無視して入力したデータは、どの顧客のデータなのかの関連付けをされる事なくデータベースに蓄積される事になります。

ところで、この問題を抱えたフォームも「 リンク親フィールド/リンク子フィールド」の「T_顧客.」の部分を 手作業で Delete してしまうと、メッセージも出ず、問題無く運用できるようになります。

Prp3

この状態で問題無くデータベースを使っていても、デザインビューで何らかの作業をしたときに、 Prp4 の状態にしてしまうと、また問題が発症する事になります。ACCESS の表示するドロップダウンから選択した値なのですから、 「間違った操作をした」と、ここで自覚する事は難しいかもしれません。

ACCESS 関連の掲示板で見られる、「今まで問題なく使っていたのに突然メッセージが表示されるようになった」、 とか「なんだか判らないけれど作り直したら解決しました」というのは、こんな状態なのでは、と思います。

親フォームのレコードソースに同じフィールド名の KEYフィールドが複数存在していないかどうか、どうしてもそのSQLでなくちゃダメなのか見直せれば見直しましょう。


標題のエラーの再現と、解決する考え方は以上です。

ACCESS で作成したサブフォームをそのまま使用しても、「入力した筈のデータが表示されない」 という事態を起こす可能性が残されているので、その点についても触れておきます。


サブフォームに入力できてしまう問題

新規レコードを登録する際、親フォームへの入力しない状態で、 サブフォームに入力が出来てしまいます。 せっかく入力しても、親のレコードが無いのですから、フォーム上2度と表示される事はありません。

Fm18_2

解決例

VBA を使用した解決の方法をあげておきます。

親フォームの レコード移動時 のイベントを設定する

Prp5_2

コードビルダを選択します

Builder3_3

コードを記述します


Private Sub Form_Current()
	
    '新規レコードであれば、
    'サブフォームのレコードの追加を許可しない
    If Me.NewRecord Then
        Me.Fs_やり取り.Form.AllowAdditions = False
    Else
        Me.Fs_やり取り.Form.AllowAdditions = True
    End If End Sub

続いて親フォームの 挿入後処理 のイベントを設定する

Prp6_2

コードビルダを選択します

Builder3_4


Private Sub Form_AfterInsert()
    
    'レコードが挿入されたら
    'サブフォームのレコードの追加を許可する
     Me.Fs_やり取り.Form.AllowAdditions = True
     
End Sub

こうしておけば、親フォームにレコードの無いサブフォームへの入力が出来なくなります。

(`□´) 以上!