【要旨】
OpenFormメソッドのWhereCondition引数は、実際にフォームが
開かれる時にのみ、有効になります。
(既に開かれているフォームを指定した場合は有効になりません)
ですので、対処方法としては
a)一旦フォームAを閉じた後(→DoCmd.Close)、再度開くか
b)フォームAを指定して、フィルタを適用する
(「DoCmd.ApplyFilterを使用する方法」と、「フォームのFilter
プロパティ及びFilterOnプロパティを使用する方法」があります)
といった方法をとることになるかと思います。
【詳細】
今回のご質問の場合、やりたいこととしては「(既に開いているフォーム
に)絞り込み(フィルタ)を掛けたい」ということになるかと思います。
ところが、DoCmd.OpenFormの第4引数(WhereConditions)は、
フォームが開かれる時にのみ適用され、既に展開済みのフォームを
指定した場合には適用されません。
ですので、他の手段が必要となります。
> こういう場合は、どのあたりを手掛かりに調べればよろしいのでしょうか。
私の場合、まず頼りにするのはAccessの「ヘルプ」です。
例えば、今回の件では、
1)Accessのメニューで「ヘルプ(H)→Microsoft Access ヘルプ(H)」を、
またVisual Basic Editor(=VBE:コード入力画面)のメニューで
「ヘルプ(H)→Microsoft Visual Basic ヘルプ(H)」を選択
2)検索条件として「フィルタ」や「絞り込み」を指定して、該当項の内容を
確認
といった手順を踏んで、「ApplyFilter」メソッドや「Filter」メソッドにたどり
着く・・・というのが、j-foremanさんがご自身で解決されようとした場合の
流れになります。
(実際は、検索結果には希望のものと異なるものがかなりの件数で出る
ので、必ずしもすんなりとはいきませんが・・・(汗))
※比較的新しい方のバージョンでは、AccessとVBEでヘルプの内容が
異なる(→Access本体側では、VBA用のヘルプの内容が見られない)
ので、両方を見ておく方が無難です。
で、以下が、フォームの「Filter」及び「FilterOn」のプロパティを使用した
場合のサンプルになります。
<現在>
Private Sub cmd_BT_Click()
DoCmd.OpenForm "フォームA", , , "顧客ID=" & Me.顧客ID
End Sub
<修正・1案>
Private Sub cmd_BT_Click()
'念のため、一旦現在のフィルタを解除
Forms!フォームA.FilterOn = False
'Filterプロパティに条件式を設定
Forms!フォームA.Filter = "顧客ID=" & Me.顧客ID
'フィルタを適用
Forms!フォームA.FilterOn = True
End Sub
※もしも顧客IDのデータ型が文字列型だった場合は、以下:
(「Me.顧客ID」の直前の「=」の後ろ及び末尾の2つの「'」に注目)
Forms!フォームA.Filter = "顧客ID='" & Me.顧客ID & "'"
また、フォームAを一旦閉じてもよいのであれば(→非連結のテキスト
ボックスに、保持させたい値がある場合などはNG)、DoCmd.Closeで
閉じてから、もう一度開きなおしてしまう、という手もあるかと思います。
<修正・2案>
Private Sub cmd_BT_Click()
'フォームのデザイン変更があった場合は、保存確認を出した上で
'閉じる
DoCmd.Close acForm, "フォームA", acSavePrompt
DoCmd.OpenForm "フォームA", , , "顧客ID=" & Me.顧客ID
End Sub
なお、上記で実際に閉じるのをキャンセルすると、エラーが発生します。
このエラーを回避したい場合は、以下のようにします:
<修正・3案>
Private Sub cmd_BT_Click()
'エラー発生時は、「エラー処理:」の行に飛ばすための宣言
On Error Goto エラー処理
DoCmd.Close acForm, "フォームA", acSavePrompt
DoCmd.OpenForm "フォームA", , , "顧客ID=" & Me.顧客ID
終了処理:
Exit Sub
エラー処理:
If Err.Number <> 2501 Then
MsgBox Err.Number & ":" & Err.Description, vbCritical, Me.Name
End If
Resume 終了処理
End Sub
・・・以上です。
【蛇足】
現状ではフィルタを使用されているようなのでその形を踏襲しましたが、
フォームのレコードソースをクエリとすれば、「フォームのRecordSource
プロパティを更新」という方法もあり得ますので、今後の参考まで。
お礼
丁寧なご回答ありがとうございます。 本件、もう一度最初から作り直すことにしました。 設計の段階から、甘かったようです。 もう一度基本的なところから勉強しながら作り直しをしています。 今回のご回答は参考にさせていただきます。 ありがとうございました。