プロが教える店舗&オフィスのセキュリティ対策術

ボタン押下でサブフォームのレコードソースを変更
する方法を探しています。
元とするテーブルは同じですが、拾うべきフィールドが全く異なるため2つのクエリを作成しました。
元テーブル「メンバー一覧」
クエリ「q_1組のみ」「q_女性のみ」
フォームヘッダーにコンボボックスでどちらかのクエリを選択し、ボタンを押したら
サブフォームが表示されるようにしたいのですが、
現在のところ、「閉じているかまたは存在しないオブジェクトを参照」というエラーが出てしまっています。
Me.でもForms("検索ウィンドウ").でも結果は同じでした。
ソースはクエリを指定しています。

Access2007

---------------------------------
Private Sub 検索ボタン_Click()
If [Forms]![検索ウィンドウ]![申込形態] = "1組のみ" Then
Me.検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ1"
Else
Forms("検索ウィンドウ").検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ2"
End If

A 回答 (3件)

> 現在のところ、「閉じているかまたは存在しないオブジェクトを参照」という


> エラーが出てしまっています。

サブフォームコントロールには、フォームの他、テーブルやクエリなども
表示させることができます(確かAccess2002か2003で追加された機能)。

こちらで検証したところ、サブフォームコントロールの『ソース オブジェクト』
(プロパティシートの『データ』タブにあります)でフォームを指定していない
状態で、「~.Forms.RecordSource」を参照すると、ご質問と同じエラーが
発生することが確認できました。

クエリを直接表示する場合は、以下のような構文にします:
(作成したクエリ名とコード上のクエリ名が異なっていたので、双方載せて
 みました)

  If [Forms]![検索ウィンドウ]![申込形態] = "1組のみ" Then
    Me.検索結果サブフォーム.SourceObject = "クエリ.q_しぼりこみ1"
    'Me.検索結果サブフォーム.SourceObject = "クエリ.q_1組のみ"
  Else
    Me.検索結果サブフォーム.SourceObject = "クエリ.q_しぼりこみ2"
    'Me.検索結果サブフォーム.SourceObject = "クエリ.q_女性のみ"
  End If

【注意するべきポイント】
 ・「.SourceObject」の場合、「.RecordSource」と違って、その前に「.Form」は
  入れません(入れるとエラーになります)。
 ・フォームをSourceObjectにする場合は、使用するフォーム名を「"」で括る
  だけですが、クエリを使用する場合はクエリ名の前に「クエリ.」をつけた
  上で、「"」で括る必要があります。
  (テーブルの場合は、同様に「テーブル.」をつけます)

【余談/今後のために】
テーブルやクエリをソースオブジェクトに指定した場合、マクロやVBAで
動作を制御することができません。
(例えば、「通常は編集を制限しつつ、コマンドボタンで特定フィールドのみ
 編集を一時的に許可する」といった要望に対応できない)

何らかの制御を行いたい場合は、それぞれのクエリを元にしてフォームを
作成し、そのフォームの『既定のビュー』(フォームのプロパティシートの
『書式』タブにあります)を「データシート ビュー」にし、それらのフォームを
ソースオブジェクトに指定するようにすれば、クエリと同様の見た目ながら
VBA/マクロでの制御も可能にできます。

※なお、クエリの使い分けが、表示フィールドの違いだけで、絞り込みや
  並べ替えは行っていないなら、当該テーブルをレコードソースにした
  フォームを2つ作成し、『フィールドリスト』から必要なフィールドだけを
  ドラッグ&ドロップ、という方法もありますので、併せて参考まで。
  (現在、クエリで行っている使い分けを、フォームに対して行う、と)
    • good
    • 0
この回答へのお礼

御丁寧にありがとうございました!
なんとか解決しました。
まとめてですいません。

お礼日時:2010/10/28 13:14

#1です。



Me!サブフォーム表示コントロール名.Form.RecordSource = "q_しぼりこみ1"

Me!サブフォーム表示コントロール名.Form.RecordSource = "q_しぼりこみ2"

のように、Me. ではなく、Me!としたほうがいいかもしれません。
    • good
    • 2

Me.検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ1"



において、

検索結果サブフォーム

のところは、メインフォームのサブフォームを表示する
コントロール名で、サブフォームの名前そのもではなく、
初期値は「埋め込み0」のような名前になっています。
もしウィザードなどで作るとサブフォーム名と同じに
なっているかもしれませんが、一度確かめてみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A