- 締切済み
検索用フォームで数値型データを抽出する方法
いつも大変お世話になっております。アクセス初心者ですが宜しくお願いします。 テーブル1を元にクエリ1を作成し,それを元にフォーム表示用を作成しました。フォーム表示用のデータを検索するために非連結のフォーム検索用を作成しました。 検索用フォームでは,氏名,住所,契約締結日等複数の非連結フィールドがあり,入力された値を抽出するために,検索実行というコマンドボタンを一つ配置しています。 検索実行コマンドボタンは,以下のようになっています。 Private Sub 検索実行_Click() On Error GoTo エラー処理 Dim StrWhr As String 'Where条件式 Dim StrMsg As String '表示メッセージ Dim StrSrc As String 'レコードソース Dim stDocName As String '表示用フォームの名前 If Nz(Me!名前, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "名前 Like '*" & Me!名前 & "*'" End If If Nz(Me!契約締結日, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "Format(契約締結日,'yyyy/mm/dd') Like '*" & Me!契約締結日 & "*'" End If If MsgBox(StrMsg, vbOKCancel, "確認") = vbOK Then DoCmd.OpenForm "frm_顧問先CARD", , , StrWhr End If 終了処理: Exit Sub エラー処理: MsgBox Err & Error$, , Me.Name & " 検索実行" Resume 終了処理 End Sub 表示用フォームに契約年数という項目があり,数値型のデータが入力されています。そのデータを検索用フォームで算術演算子を使用して抽出するには,どのようにしたら良いでしょうか。 過去に質問したことと似ているので,色々と参考書を見ながら考えてみたのですが,上手くいきません。 できれば,一つのテキストボックスに >12 とか 4<8 とか入力してデータを抽出したいですが,不可能なら検索用フォームに二つのテキストボックスを配置して,そのテキストボックスで範囲を指定し,範囲内のレコードを抽出するという方法でも構いません。 どなたか,ご教示下さい。宜しくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tossy005
- ベストアンサー率38% (7/18)
>表示用フォームに表示される契約年数フィールドには,算術演算子は使っていません。単純に2とか18とか数値型のデータが入力されています。検索用のフォームで抽出するときにのみ,算術演算子を利用したいのですが,上記の回答で可能でしょうか。 >について,「値を取得するテキストボックス」とは,当然,データの入力されている表示用フォーム(つまり,そのレコードソースであるクエリ1)の中のデータの半角全角スペースを置換したり,算術演算子を探すということですか? 「値を取得するテキストボックス」とは契約年数の抽出条件を書き込むテキストボックスになります。 「 > 3」などを書き込むテキストボックスになります。 プログラムの処理の流れをみると、 最終的にはOpenFormでフォームを開いていることが分かります。 DoCmd.OpenForm "frm_顧問先CARD", , , StrWhr ↑の部分です。 OpenFormには引数がいくつかありますが、ここで重要なのはStrWhrです。 OpenFormの第4引数であるStrWhrには、どのような条件でフォームの内容を表示するのか、という条件式が入ります。 条件式とは フィールド名(半角スペース)比較演算子(半角スペース)値 というものです。 例えば、今回の場合でいえば 契約年数 > 3 という具合です。 ※今回は契約年数が数値型ですので3でよいですが、文字列型などを比較する場合は'3'になります また、条件が複数ある場合は 1つ目の条件式(半角スペース)AND(半角スペース)2つ目の条件式 などになります。 ※検索する条件によっては、ANDはORになったりもしますが、今回の場合はANDでよいでしょう。 このプログラムでは、メッセージボックスが表示されるまでの間に、StrWhrという文字列型の変数にこの条件式を作成しています。 よって、契約年数の条件を記入するテキストボックスに「 > 3」や「 = 3」などが入るか、または「>3」などが入ったとしてもプログラムで「 > 3」などに変えてAに入れればよいわけです。 例えば、"契約年数" & A を "契約年数 " & A にすれば「半角スペース>半角スペース3」の1つ目の半角スペースを省略できますね。 条件式やクエリには半角スペースが必要不可欠ですので、 お気をつけてご作成下さい。
- tossy005
- ベストアンサー率38% (7/18)
ユーザーがシステムの中をわかっている、かつ1つの比較でいいのなら If Nz(Me!契約年数, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "契約年数" & A End If ※Aには>3や=3などテキストボックスの値が入ります で済むでしょうが、そうもいかないでしょうから"契約年数" & Aの部分を工夫する必要があります。 ■1つのテキストボックスで行う場合 (1)テキストボックスの値を取得し、半角全角スペースを削除します。 単純にやるならReplace関数で半角全角スペースを""に置換 (2)算術演算子(=,>=,<=,>,<)を(1)の結果から探します。 例題の書き方をルールとするならば1回探せばOK。Instr関数などを使って探しましょう。 (3)算術演算子の前と後ろのデータを取得します。 Split関数で(1)の結果を第一引数、(2)でヒットした算術演算子を第二引数として適当なString型の配列(ここでは仮にstr()とします)で戻り値を取得します。 (4)(3)の結果が""がどうかをチェックします。 str(0)には算術演算子の前の値、str(1)には算術演算子の後ろの値が入っています。例題でいうところの「>12」なのか「4<8」なのかをこれでチェックします。 (5)(4)の結果、どちらかが""ならば"契約年数" & Aは"契約年数" & 算術演算子 & ""でない値になります。 両方とも""でないならば"契約年数" & Aは"契約年数" & 算術演算子 & 前の値 & "AND 契約年数" & 算術演算子 & 後ろの値になります。 ただし、テキストボックスの書き方によって算術演算子を工夫しないといけません。 (4<8と8>4は同じことですが、前の場合は>と<、後ろの場合は<と>、また>3と3<も同じことですが、前の場合は>、後ろの場合も>という具合に算術演算子を変えないといけないということです)
補足
丁寧なご回答ありがとうございます。誰からもお返事をいただけないかと思いビクビクしていたのでとても嬉しかったです。 さて,回答の中で不明な点があります。 表示用フォームに表示される契約年数フィールドには,算術演算子は使っていません。単純に2とか18とか数値型のデータが入力されています。検索用のフォームで抽出するときにのみ,算術演算子を利用したいのですが,上記の回答で可能でしょうか。 If Nz(Me!契約年数, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "契約年数" & A End If としたところ,フィルタのかかった状態のデータが表示用フォームに抽出されますが,<3と入力しても3年以上の契約年数のデータも抽出されてしまいます。 >■1つのテキストボックスで行う場合 >(1)テキストボックスの値を取得し、半角全角スペースを削除します。 > 単純にやるならReplace関数で半角全角スペースを""に置換 >(2)算術演算子(=,>=,<=,>,<)を(1)の結果から探します。 > 例題の書き方をルールとするならば1回探せばOK。Instr関数などを >使って探しましょう。 について,「値を取得するテキストボックス」とは,当然,データの入力されている表示用フォーム(つまり,そのレコードソースであるクエリ1)の中のデータの半角全角スペースを置換したり,算術演算子を探すということですか?そうだとしたら,表示用フォームに入力されているデータは数値なので半角全角スペースや算術演算子はありません。 私の理解が未熟なのだと思いますが,どうしたらよいか分かりません。お手数ですが,さらなるご回答をお願いします。
補足
すみません。きっと,分かる人から見たらものすごく分かりやすく説明してあるのでしょうが…。 見限らないで再度教えていただきたいのですが, 前回,教えていただいた回答と今回教えていただいた回答について,拙い頭をフル回転させて,何度も読み返しました。 >(1)テキストボックスの値を取得し、半角全角スペースを削除します。 単純にやるならReplace関数で半角全角スペースを""に置換 について, If Nz(Me!契約年数, "") <> "" Then StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "契約年数" & A End If の次に Me.契約年数 = Replace(契約年数, " ", "") と記述するので良いのでしょうか。以下の(2)から(4)に至っては,その記述方法すら良く分かりません。もし,よろしければ,記述コードを教えていただけると助かります。そんなの自分で調べて,ということであれば,私の頭では理解できないので,この検索方法はあきらめます。 大変,申し訳ありませんが,再度ご教示をお願いいたします。 >(2)算術演算子(=,>=,<=,>,<)を(1)の結果から探します。 例題の書き方をルールとするならば1回探せばOK。Instr関数などを使って探しましょう。 (3)算術演算子の前と後ろのデータを取得します。 Split関数で(1)の結果を第一引数、(2)でヒットした算術演算子を第二引数として適当なString型の配列(ここでは仮にstr()とします)で戻り値を取得します。 (4)(3)の結果が""がどうかをチェックします。 str(0)には算術演算子の前の値、str(1)には算術演算子の後ろの値が入っています。例題でいうところの「>12」なのか「4<8」なのかをこれでチェックします。