"LinkMasterFields/リンク親フィールド"プロパティの設定でエラー'このオブジェクトには、 オートメーションオブジェクト' 'は含まれていません。'が発生しました。
ACCESS でこのメッセ―ジが表示されてしまう原因と対処を考えます。
再現の手順
メッセージを再現させるためのサンプルとして、顧客とのやり取りを管理するデータベースを作ってみます。
<↓完成フォームイメージ>
用意するテーブルは T_顧客 と T_やり取り
この2つのテーブルを元にフォームを作ります。
手順1 T_顧客 を選択した状態で [フォーム] ボタンをクリックします。
↓T_顧客テーブルをデータソースに持つフォームが自動作成されます。
手順2 名前を付けて保存で F_顧客 として保存します。
手順3 デザインモードにして T_やり取り をドラッグしてサブフォームを作る
手順4 サブフォームウィザードに沿って操作1
コントロールウィザード[次へ(N)] をクリックします。
手順5 サブフォームウィザードに沿って操作2
サブフォームに名前を付け、 [完了(F)] をクリックします。
これでサブフォーム の完成です。
リンク親フィールドの様子を見ると、 リンク親フィールド:顧客ID; リンク子フィールド:顧客ID; になっています。この状態ならば問題は起きません。
(ACCESS2007以降のディフォルトのフォームのデザインは見ずらい(と思う)ので、 オートフォーマットで見栄えに手を入れています。)
手順6 親フォームのレコードソースを編集する
次に、メッセージを再現する為、親フォームのレコードソースを編集します。
ここから先は失敗する為の手順です。
親フォームのレコードソースのビルドボタンをクリックして、 T_やり取り テーブルを追加して下さい。
ここでは左外部結合で作りましたが、リレーションの種類はなんでも構いません。 用意するフィールドは 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;
クエリビルダを起動し上述のクエリを作成してしまいます。
この状態で リンク親フィールド と リンク子フィールド を見てみると、 何も変化していません。が、画像の左 顧客ID のテキストボックスの左肩に何か警告が表示されるようになります。
エラーを展開表示すると、「指定したフィールドがフィールドリストに存在しません」となっています。
両方のテーブルの 顧客ID があるので ACCESS が判らなくなくならないように、テーブル名を付けて 顧客ID を管理するようになります。
このエラーを無視してデータ入力しようとすると、顧客IDテキストボックスには #Name? が表示されます。 レコードソースにあるフィールドは、T_顧客.顧客IDかT_やり取り.顧客IDであり 顧客IDではないので ACCESS が判らないと言っています。
放っておけないエラーなので、「なんとかしなければ」と試行錯誤が始まります。 リンク親フィールドの設定し直す為、リンク親フィールドプロパティのビルドボタンをクリックします。
メッセージが表示されます。[OK] をクリックします。
サブフォームフィールドリンクビルダが起動します。 リンク親フィールドにT_顧客.顧客IDを設定し、リンク子フィールドには顧客IDを設定します。 リンク親フィールドのドロップダウンには顧客IDの選択肢がありませんので、 解決に一歩近づいたような気分になると思います。
プロパティの表示はこうなります。
しかし、この作業は #Name? を表示するテキストボックスの問題とは直接関係ありませんので、テキストボックスの警告表示は消えません。
「そうだ」と気がついて、顧客IDテキストボックスのコントロールソースも修正します。
エラー表示が消えました。
この状態でフォームビューに切り替えて、サブフォームに何かデータを入力してみてください。 標題のエラーメッセージが表示されれば成功(?)です。
ちなみに、このメッセージは’リンク親フィールドのプロパティの設定エラー’を告げる「情報」であって エラーではあっても入力作業自体は続行する事ができます。
入力は出来てしまうけれど、サブフォームの顧客IDに値が入らない事に注目です。 親と子のリンクが出来ていないようです。 新しいレコードを追加しようとする度にエラーメッセ―ジは表示され続けます。
サブフォームの 顧客ID は隠して作る人が多いでしょうから、 何が起きているのか、さらに訳が判らない状態になると思います。
この顧客ID と関連付けなく入力されたレコードは、レコードを移動すると2度と表示されず、 「入力した筈のデータが表示されない」という状態になります。
手順6 親フォームのレコードソースをそのままの状態でも直せる
リンク親フィールドを設定し直した事が間違いでした。顧客IDのコントロールソースだけを 修正しておけば、そもそもこんなエラーメッセージに悩まされる事は無かったのです。
親フォームのレコードソースに T_やり取り の 顧客ID まで取り込んだ事がトラブルの原因です。
今回は、 T_顧客をレコードソースにフォームウィザードで作り、 後から親フォームの誤ったレコードソースの編集で、不具合を再現しました。
親フォームのレコードソースに最初からクエリを指定して作る事もあるでしょうから、
クエリに 顧客ID が重複していれば、最初から、
この状態で作成され、標題のメッセージに悩まされる事になります。
そしてメッセージを無視して入力したデータは、どの顧客のデータなのかの関連付けをされる事なくデータベースに蓄積される事になります。
ところで、この問題を抱えたフォームも「 リンク親フィールド/リンク子フィールド」の「T_顧客.」の部分を 手作業で Delete してしまうと、メッセージも出ず、問題無く運用できるようになります。
この状態で問題無くデータベースを使っていても、デザインビューで何らかの作業をしたときに、
の状態にしてしまうと、また問題が発症する事になります。ACCESS の表示するドロップダウンから選択した値なのですから、
「間違った操作をした」と、ここで自覚する事は難しいかもしれません。
ACCESS 関連の掲示板で見られる、「今まで問題なく使っていたのに突然メッセージが表示されるようになった」、 とか「なんだか判らないけれど作り直したら解決しました」というのは、こんな状態なのでは、と思います。
親フォームのレコードソースに同じフィールド名の KEYフィールドが複数存在していないかどうか、どうしてもそのSQLでなくちゃダメなのか見直せれば見直しましょう。
標題のエラーの再現と、解決する考え方は以上です。
ACCESS で作成したサブフォームをそのまま使用しても、「入力した筈のデータが表示されない」 という事態を起こす可能性が残されているので、その点についても触れておきます。
サブフォームに入力できてしまう問題
新規レコードを登録する際、親フォームへの入力しない状態で、 サブフォームに入力が出来てしまいます。 せっかく入力しても、親のレコードが無いのですから、フォーム上2度と表示される事はありません。
解決例
VBA を使用した解決の方法をあげておきます。親フォームの レコード移動時 のイベントを設定する
コードビルダを選択します
コードを記述します
Private Sub Form_Current() '新規レコードであれば、 'サブフォームのレコードの追加を許可しない If Me.NewRecord Then Me.Fs_やり取り.Form.AllowAdditions = False Else
Me.Fs_やり取り.Form.AllowAdditions = True
End If End Sub
続いて親フォームの 挿入後処理 のイベントを設定する
コードビルダを選択します
Private Sub Form_AfterInsert()
'レコードが挿入されたら
'サブフォームのレコードの追加を許可する
Me.Fs_やり取り.Form.AllowAdditions = True
End Sub
こうしておけば、親フォームにレコードの無いサブフォームへの入力が出来なくなります。
(`□´) 以上!
コメントを書く