
抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力するとOR条件で抽出出来る様にしたいと思っています。
F_抽出←抽出用フォーム
syurui←非連結のテキストボックス名
抽出←コマンドボタン
T_データ
番号(主キー)、氏名、住所、性別、種類(テキスト型)、・・・
F_結果←抽出条件を反映するフォームで、T_データの項目をすべてリスト形式で表示出来る様にしています。
色々調べてみて、下記の設定をしてみました。
Private Sub 抽出_Click()
Dim strFilter As String
strFilter = "*" & Replace(Me.syurui, " ", "* Or *") & "*"
strFilter = BuildCriteria("種類", dbText, strFilter)
DoCmd.OpenForm "F_結果", , , strFilter
End Sub
実行してみると、実行時エラー 2431 指定した式の構文が正しくありません。と表示されてしまいます。
4行目を下記に書換えてみたのですが、
strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter)
実行してみると、実行時エラー 2465 指定した式で参照されている'|'フィールドがみつかりません。
と表示され、希望通りの結果が得られません。
アクセス初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますのでどうぞよろしくお願い致します。
No.4ベストアンサー
- 回答日時:
おじゃまします。
> 空白区切りで複数のキーワードを入力するとOR条件
この条件なら、エラーが無くなったとしてもこの方法は使わない方が良いと思います。
空白区切り、これは何文字の空白を想定されていますか。
エラーが無くなったとして、
あ(スペース)い
なら、種類 Like "*あ*" Or 種類 Like "*い*"
あ(スペース)(スペース)い
なら、種類 Like "*あ*" Or 種類 Like "**" Or 種類 Like "*い*"
条件間が AND であれば、途中の 種類 Like "**" は無視できると思いますが、
OR なら、NULL でないものすべてが抽出されます。
今回の場合は、
素直に Split を使って有効なもののみで条件を生成した方が良いと思います。
以下例)
Dim sWhere As String
Dim vTmp As Variant
Dim i As Integer
Const KouName As String = "種類" ' 条件となる項目名
Const MOJI As String = "あ い" ' テスト用文字列
sWhere = ""
vTmp = Split(MOJI, " ") ' ★
For i = LBound(vTmp) To UBound(vTmp)
If (Len(vTmp(i)) > 0) Then
sWhere = sWhere & " OR ([" & KouName & "] Like '*" & vTmp(i) & "*')"
End If
Next
If (Len(sWhere) > 0) Then sWhere = Mid(sWhere, 5)
最終的に生成される sWhere は、
([種類] Like '*あ*') OR ([種類] Like '*い*')
の様になります。
念のため、各条件を ( ) で、また項目名を [ ] で囲ってます。
最後の
If (Len(sWhere) > 0) Then sWhere = Mid(sWhere, 5)
は、文字列が作られていれば
OR (・・・) OR (・・・) となっているので、(・・・) OR (・・・) に作り直しています。
★部分、カンマ区切りに変更する場合は、vTmp = Split(MOJI, ",") になります。
MOJI はテスト用なので、ここにテキストボックスの値を指定します。
空白区切りの場合、スペースが続くと "" に展開されるので、有効なものなのかは
文字数で判別します。
> 4行目を下記に書換えてみたのですが、
> strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter)
↓
strFilter = BuildCriteria("[T_データ]![種類]", dbText, strFilter)
初めのパラメータはフィールド名になるので、文字列として指定します。
> F_結果←抽出条件を反映するフォームで、T_データの項目をすべて
ということなので、テーブル修飾は必要ないと思います。
strFilter = BuildCriteria("[種類]", dbText, strFilter)
> strFilter = BuildCriteria("種類", dbText, strFilter) の後で
> debug.print strFilterをすると何も表示されませんでした
この結果に対して、わかりません。
BuildCriteria は、テーブルとか確認するわけではない(と思う)ので、
指定されたもので条件を作り出すものになります。
ということで、
> したがって、"種類"が間違っている様に思うのですが
にはなりません。
間違うとすると、OpenForm 時に指定する条件記述が間違っていることになります。
そのフォームで指定できる条件の項目名は、
フォームをデザインビューで開き、連結したテキストボックスのプロパティを見てみます。
「コントロールソース」部分に表示されるものになります。
(Alt + ↓ で一覧で見ることができます)
この回答への補足
前回の質問に続きご回答頂きありがとうございます。
空白の区切りは1文字と考えていましたが、入力する人が必ず空白1文字にしてくれるかはわからないので、色々と想定しないといけないのですね。お恥ずかしながら気が付いていませんでした。
また、BuildCriteriaについても解説を頂き、わかっていなかった事が理解できました。
現在、質問させて頂いたものが希望通りに動作する様になったのですが、30246kiku様が教えて下さった方法が理解できたら書き替えたいと思います。
ご丁寧に教えて頂きありがとうございました。
No.3
- 回答日時:
#2です。
当方の試験したコードと結果(コード中コメント)です。ご参考まで。Private Sub コマンド2_Click()
Dim strFilter As String
テキスト0.SetFocus
strFilter = Replace(Me.テキスト0.Text, " ", " ")
strFilter = "*" & Replace(strFilter, " ", "* Or *") & "*"
Debug.Print strFilter '*あ* Or *い*
strFilter = BuildCriteria("種類", dbtext, strFilter)
Debug.Print strFilter '種類 Like "*あ*" Or 種類 Like "*い*"
DoCmd.OpenForm "F_Table5", , , strFilter
End Sub
イミディエイトウィンドウで下記を実行したらどうなりますか?
?buildcriteria("種類",10,"'*あ*' Or '*い*'")
No.2
- 回答日時:
BuildCriteriaというのは使った事がなかったので、ご呈示のコードを試してみましたが、問題なく動きました。
ただ、ご呈示のコードで言うと、Me.syuri.SetFocusを追加しないと実行時エラー2185が出たのと、当方、Access2000のため、dbTextを使うには、DAOに参照設定する必要がありましたが。debug.print strFilter
で中味を確認されましたか?
この回答への補足
早速の回答ありがとうございました。
Private Sub 抽出_Click()
Dim strFilter As String
strFilter = "*" & Replace(Me.syurui, " ", "* Or *") & "*"
debug.print strFilter
テキストボックス内で[あ い]と入力し、確認しましたが、
*あ* Or *い* と確認出来ました。
ただ、
strFilter = BuildCriteria("種類", dbText, strFilter) の後でdebug.print strFilterをすると何も表示されませんでした。
したがって、"種類"が間違っている様に思うのですが、よくわからない状態です。
遅くなりましたが、Access2003を利用しております。
よろしくお願い致します。
No.1
- 回答日時:
Filterで出来るのだろうが、
http://accessclub.jp/bbs/0068/beginers25857.html 参考
色んな場合に統一的にできるところの、
テキストボックスの文字列をコマンドボタン等クリックされた機会に捉えて、スペースでその文字列をSplitし、その配列要素の文字列を&とORで結合して、SQLのWhere条件(Where句)にする、でいかがですか。
この回答への補足
早速の回答ありがとうございました。
参考に教えて頂いたところや、Split、Where条件などを調べているのですが、初心者の為まだ理解できるところまでいきません。
もしよろしければ、もう少し詳しく教えて頂けると幸いです。
どうぞよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
(ACCESS)条件に応じて、テキストボックスを表示・非表示設定
その他(データベース)
-
Accessでフォームから別フォームのテキストボックスの値を設定する
Visual Basic(VBA)
-
-
4
Access 複数条件検索の設定が上手く行きません
Access(アクセス)
-
5
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
6
Access レポート印刷するときに1ページに収める方法
Access(アクセス)
-
7
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
8
Accessのテーブルのフィールドに式を入れる方法
Access(アクセス)
-
9
Access 同じデータをたくさんのレコード(同一列)に一度に入力するには
Access(アクセス)
-
10
ACCESSのフォーム上で複数検索したい項目がある場合どうすればいいですか?
Access(アクセス)
-
11
ACCESS検索★ある文字を複数のフィールドの中から検索したい
その他(コンピューター・テクノロジー)
-
12
アクセスでのテキストボックスの複数条件での抽出
その他(Microsoft Office)
-
13
アクセスのfilter、複数条件の記述方法を教えてください。
Access(アクセス)
-
14
ACCESSのフォームで次のレコードに移動しない方法を教えてください
その他(データベース)
-
15
ACCESS2000の帳票フォームでテキストボックスの入力値を取得したい
Access(アクセス)
-
16
アクセスのOR検索
Access(アクセス)
-
17
アクセスでテキストボックスを可視にしたい。
Access(アクセス)
-
18
Accessでコードを入れると名前がでるようにしたい
Access(アクセス)
-
19
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
-
20
選択クエリで空欄のテーブルがあっても表示したい
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで、抽出したデータだ...
-
PDFファイルから特定の文字を検...
-
画像に対する輪郭線
-
Accessで○ヶ月前以前を抽出する...
-
未審査請求包袋抽出表作成とは...
-
エクセルで色の付いたセルを抽...
-
AccessのWHERE句において、変数...
-
Accessの選択クエリの抽出条件...
-
X-Ripperというフリーウェアに...
-
Access フォームコンボボック...
-
Access2016でのfilter後に並べ...
-
Triton X-100 bufferの作り方に...
-
2ちゃんのレス抽出の方法
-
ACCESSのフォームからレポート...
-
ACCESSのクエリー抽出条件にIIF...
-
access クエリ yes/no型のクエ...
-
ACCESS日付形式について質問です。
-
「パラメータが少なすぎます。3...
-
PDFファイル/抽出許可され...
-
エクセルの7桁の中から3,5,7...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、抽出したデータだ...
-
X-Ripperというフリーウェアに...
-
access クエリ yes/no型のクエ...
-
ACCESSのクエリー抽出条件にIIF...
-
Excel 文字列から6桁の数値の抽出
-
未審査請求包袋抽出表作成とは...
-
PDFファイル/抽出許可され...
-
PDFファイルから特定の文字を検...
-
AccessのWHERE句において、変数...
-
エクセル VBA メール本文に指定...
-
「パラメータが少なすぎます。3...
-
【AccessVBA】レコードセットOp...
-
アクセス 同じフィールド(テキ...
-
Access チェックボックスを利用...
-
ACCESS クエリ 条件以外のレ...
-
Accessの選択クエリの抽出条件...
-
Access の SQL で、Aがなかっ...
-
【エクセルVBA】 A1セルを参照...
-
エクセル関数で住所から丁目番...
-
コンボボックス全ての値を取得...
おすすめ情報