- ベストアンサー
クエリ実行結果0件の場合のフォーム展開中止とメッセージ表示
Access初心者です。 テーブルのデータをクエリで抽出し、フォームで表示しようと考えています。 たとえば、 「テーブル1」に、「ID」「氏名」「部署」「趣味」のフィールドが、 「結果表示フォーム」にも対応するレコードソースを持つボックスがあり、 「条件指定フォーム」に「部署」という名のボックスと、「マクロ1」を割り当てた「ボタン1」がある場合に、 「テーブル1」を基にした「クエリ1」で、「部署」の抽出条件に「[条件指定フォーム]![部署]」と設定し、 「マクロ1」では、「クエリ1」をフィルタにして、「フォームを開く」コマンドで「結果表示フォーム」を開きたいと考えています。 この場合、 「条件指定フォーム」の「部署」ボックスにたとえば「総務部」と入力して「ボタン1」をクリックすると、「テーブル1」中に総務部の社員がいれば「結果表示フォーム」は問題なく展開しますが、「総務部」の社員がデータ中にないときには、すべてのテキストボックスが空欄のまま「結果表示フォーム」が展開してしまいます。 そこで、 「クエリ1」実行の際、結果のレコード数が0件の場合には、「結果表示フォーム」の展開を中止してメッセージボックスを表示するような修正を「マクロ1」に追加したいと思います。 どのような条件付けをすればよいでしょうか。 どなたかよいアドバイスをお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
マクロの条件で Dcount("*","クエリ1")<>0 →フォームを開く ではどうでしょう? 又は、 Dcount("*","クエリ1")=0 →メッセージボックス ... →マクロの中止 →フォームを開く
その他の回答 (1)
初心者にしては、滅茶苦茶に難しいことに挑戦されていますね。 私なんて生まれて初めて同じことをやってみました。 さて、ここでマクロを改良するのは至難です。 が、その程度のことは、オープンするフォームに4行程度のVBAコードを書けば達成できます。 Private Sub Form_Open(Cancel As Integer) Cancel = CBool(Me.RecordsetClone.RecordCount = 0) If Cancel Then MsgBox "該当するレコードがありませんのでフォームオープンをキャンセルします!" End If End Sub なお、一般的にはこの手法も稀だと思いますよ。 Private Sub コマンド4_Click() On Error Resume Next Dim intCount As Integer Dim lngBango As Long If Len(Me.伝票番号 & "") > 0 Then lngBango = Me.伝票番号 intCount = DCount("*", "売上伝票", "伝票番号=" & lngBango) If intCount > 0 Then DoCmd.OpenForm "売上伝票", , , "伝票番号=" & lngBango Else MsgBox "該当するレコードがありませんのでフォームオープンをキャンセルします!" End If End If End Sub このように、先ず、条件指定フォームの条件欄が入力されているかをチェックするでしょう。 If Len(Me.部署 & "") > 0 Then 次に該当するレコードが存在するか否かをチェックするでしょう。 intCount = DCount("*", "XXXX", "部署='" & Me.部署 & "'") If intCount > 0 Then 該当するレコードが存在すると DoCmd.OpenForm "XXXX", , , 部署='" & Me.部署 & "'" で、条件を指定してフォームをオープンします。 もちろん、この場合には、Form_Open()でのキャンセル文は不要です。
お礼
Husky2007さん、ありがとうございました。 (1)条件欄入力の有無のチェック (2)該当レコード存在の有無のチェック (3)条件指定によるフォーム展開 という3段階に分けての処理、なるほどと思いました。 このようにすればエラーになることはないですね。 とても参考になりました。 VBAにはなかなか手が回りませんが、ご教示いただいた点を参考にしつつ、勉強してみたいと思います。
お礼
o23さん、ありがとうございました。 おかけで、無事に思い通りの動きをさせることができました。 マクロのレベルでしたら自分でも理解ができましたので、アドバイスがとても役に立ちました。 簡単そうでなかなか自分では思いつかないものですね。 Dcountと「*」の組み合わせなど、なるほど、という感じでした。