• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:accessのnot検索)

accessで日付とNGワードを組み合わせたクエリ抽出ができない

このQ&Aのポイント
  • access2000で、日付とNGワードを組み合わせたクエリの抽出がうまくいかない問題が発生しています。
  • フォームで入力された日付に基づいて、NGワードを含まないレコードの抽出を行いたいのですが、うまく動作していません。
  • 日付とNGワードが両方とも入力されていない場合には全てのレコードを抽出するようにしたいです。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

クエリの新規フィールドに次の2フィールドを設定します。 式1: IIf(IsNull([forms]![フォーム名]![日付]),True,[日付]=[forms]![フォーム名]![日付]) 式2: IIf(IsNull([forms]![フォーム名]![NGword]),True,Not ([内容] Like "*" & [forms]![フォーム名]![NGword] & "*")) いずれも「抽出条件」欄には、True を指定し、非表示にします。 [日付] と [内容]の「抽出条件」欄には、何も指定しません。 以上でご希望どおりの抽出が、出来ると思います。 なお、余分なこととは思いますが、状況によっては、フォームの内容変更した時、 更新後イベント等で Requery が必要な場合があります。

_tanaka_
質問者

お礼

助かりました!! お陰でうまく抽出することができました。 また何かありましたら宜しくお願いします。

その他の回答 (1)

noname#102878
noname#102878
回答No.2

ちょっと読みづらいんですが・・・ 【状況】 1. TableAにFieldA(文字列型)とFieldB(文字列型)がある 2. 非連結型のFormAというフォームがある。 3. FormAには、txtAとtxtBという2つのテキストボックスがある。 【検索要件】 1. txtAに入力されたキーワードを含み、かつ、txtBに入力されたキーワードを含まないレコードセットを取得したい。 2. txtAとtxtBの片方のみ入力された場合は、入力された条件のみでレコードセットを取得したい。 3. txtAとtxtBの両方が空っぽの場合は全件取得したい。 【問題点】 1つのクエリで、これら動的な条件に対応したいのだがうまくいかない。 ってことですよね? 手早く簡単に済ませるならVBAからSQL文字列を使ってADOで検索を掛ける方法です。 クエリの検索結果をどのように利用したいのかわからないのですが、とりあえず一覧表示フォームでも単票フォームでもレポートでも大丈夫でしょう。 標準モジュールにグローバル変数を定義します。 標準モジュールに以下を書いてください。 -------------------------------------- Public gstrSQL As String ' 検索するためのSQL文 Public gcstrSQL As String = "SELECT * FROM TableA;" ' gstrSQLにSQL文が設定されていない場合の全件検索用SQL文字列定数 -------------------------------------- 次に、FormA上のコマンドボタンcmdFindのクリックイベントプロシージャに書いてください。 -------------------------------------- Private Sub cmdFind_Click() Dim strSQL As String Dim strWhere(1) As String Dim i As Long Dim j As Long strSQL = "SELECT * FROM TableA " If (IsNull(Me.txtA.Value)) Or (Len(Me.txtA.Value) = 0) Then Else strWhere(i) = "(FieldA Like '*" & Me.txtA.Value & "*') " i = i + 1 End If If (IsNull(Me.txtB.Value)) Or (Len(Me.txtB.Value) = 0) Then Else strWhere(i) = "(FieldB Not Like '*" & Me.txtB.Value & "*') " i = i + 1 End If If i >=1 Then strSQL = strSQL & "WHERE " For j = 0 To i - 1 strSQL = strSQL & strWhere(j) & "AND " Next j strSQL = Left$(strSQL, Len(strSQL) - 4) End If strSQL = strSQL & ";" gstrSQL = strSQL End Sub -------------------------------------- で、一覧表示のためのFormBで検索結果を開きたいのであれば、FormBのOpenイベントプロシージャに以下を書いてください。 -------------------------------------- Private Sub Form_Open(Cancel As Integer) If Len(gstrSQL) >= 1 Then Me.RecordSource = gstrSQL Else Me.RecordSource = gcstrSQL End If End Sub -------------------------------------- これで、FormBのレコードソースプロパティへの設定が済みますので、FormB上の各テキストボックスにTableAの値を表示することができます。 ただし、FormBのデザイン時に「レコードソース」プロパティへ「TableA」を設定し、各テキストボックスの「コントロールソース」プロパティにはTableAの各フィールド名を設定しておいてください。 (レコードソースが空っぽのままだとコントロールソースを設定できないので。レコードソースは実行時に書き換えられるので大丈夫です。) 対象がレポートの場合でもOpenイベントに書けばOKです。

_tanaka_
質問者

お礼

確かにちょっと質問が読みづらいですね・・・反省します。 回答ありがとうございます。 今回は下の方の案でやらせていただきましたが 興味深い回答ありがとうございました。 またなにかありましたら宜しくお願いします。

関連するQ&A