• ベストアンサー

ACCESS マクロでWhere条件式について質問

マクロについてですが、「アクションを開く」アクションで引数のWhere条件式について質問です。 やりたいことは、フォームA・フォームBがあり、共通のフィールド"顧客ID"があります。この二つのフォームを連動させて並行に表示させたいと思います。 マクロに登録する内容は、 アクション「フォームを開く」 引数(フォーム名)フォームA   (Where条件式)[Forms]![フォームA]![顧客ID]=[Forms]![フォームB]![顧客ID] アクション「オブジェクトの選択」 引数(オブジェクトの種類)フォーム  (オブジェクト名)フォームB 上のように(Where条件式)で[Forms]![フォームA]![顧客ID]]=[Forms]![フォームB]![顧客ID] とすると、レコードは何も表示されませんでした。 しかし、[顧客ID]=[Forms]![フォームB]![顧客ID]とすると正しく表示します。なぜ、[Forms]![フォームA]![顧客ID]]=[Forms]![フォームB]![顧客ID]とすると、ダメなのでしょうか??

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

回答は出てますが、もう少し詳しく説明してみます。 興味があれば読んでみてください。 厳密に言うと、Where条件式には、どんな式を書いても構いませんが、 しかし、レコードソースのフィールドを含んでいないと、意味がありません。 ------------------------------------------------------ マクロを実行する前に、フォームAが閉じていた場合。 マクロを実行すると、 1.フォームが作られる 2.レコードソースを開く(この時にWhere条件で絞込み) 3.最初のレコードの値をコントロールに表示 こんな感じの流れになります。 [Forms]![フォームA]![顧客ID] 上記がコントロールだとすると、 1~2の段階では、レコードソースが確定していないので、 内容は空(Null)の状態です。 Where条件は2の段階で使われますので、常にNullとなります。 [Forms]![フォームA]![顧客ID] = [Forms]![フォームB]![顧客ID] 上記の式は Null = (フォームBの現在の顧客ID) と評価され、常にFalseで、レコードは選択されません。 ------------------------------------------------------ マクロを実行する前に、フォームAが開いていた場合。 既にフォームは開いているので、 [Forms]![フォームA]![顧客ID] 上記の値は現在フォームに表示されている値です。 この値を仮に「値A」とします。 [Forms]![フォームA]![顧客ID] = [Forms]![フォームB]![顧客ID] 上記の式は 値A =(フォームBの現在の顧客ID) と評価され、常にTrueで、すべてのレコードが選択されるか、 又は、常にFalseで、レコードが全く選択されないか、のどちらかです。 ------------------------------------------------------ 結局の所、Where条件にレコードソースのフィールドが含まれていない場合、 条件式はレコードにより変化しないで、固定の値を使います。 結果は、常にTrueかFalse、All or Nothing になります。 今回のポイントは、 [Forms]![フォームA]![顧客ID] これがフォームのコントロールで [顧客ID] これが、レコードソースのフィールドを表わす、と言う点。 Where条件でレコードを絞り込むタイミングと、 フォームのコントロールに値が入るタイミングの問題ですね。

minao9
質問者

補足

ありがとうございます。 >今回のポイントは、 >[Forms]![フォームA]![顧客ID] これがフォームのコントロールで >[顧客ID] これが、レコードソースのフィールドを表わす、と言う点。 そうなのですね。 既にフォームAが開いていた場合では結果が異なってくるんですね。 詳しい説明どうもありがとうございます!

その他の回答 (1)

回答No.1

Where条件式の左辺(=の左側)には、(そのフォームで使う)データソースのフィールド名を書く必要があります。 Where条件式で制限されるのは、データソースだからです。

minao9
質問者

補足

そうなのですね。 ['(フィールド名)'] = Forms!['(フォーム名)']!['(別のフォームのコントロール名)'] の['(フィールド名)'] = と、開くフォームの基になるテーブルまたはクエリにあるフィールド名を指定しないといけない決まりなんですね? 回答くださってありがとうございます。

関連するQ&A