
抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力すると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も見ています
-
みんなに挑戦してほしい「色彩検定」
これまで多くの方々が受検したが「色彩検定」。その目的や活用法は人それぞれ。今回は、色彩検定に影響を受けた男女3名にインタビュー。
-
複数条件検索について
Access(アクセス)
-
フォームに複数の検索機能をつける方法
Access(アクセス)
-
アクセスのOR検索
Access(アクセス)
-
4
Accessで、フォームからフォームへ値を引き継ぐやり方
Access(アクセス)
-
5
Accessクエリ 複数フィールドを対象に空白の場合は全件表示したい
Access(アクセス)
-
6
accessvba 複数条件でFilterをしたい
Access(アクセス)
-
7
アクセスのfilter、複数条件の記述方法を教えてください。
Access(アクセス)
-
8
アクセスVBAのMe!と[ ]
Access(アクセス)
-
9
ACCESSのフォーム上で複数検索したい項目がある場合どうすればいいですか?
Access(アクセス)
-
10
Accessでチェックボックスで抽出するには?
その他(ソフトウェア)
-
11
Accessフォームでの複数条件検索
Excel(エクセル)
-
12
【ACCESS/必須条件とOR条件を組み合わせる】
その他(Microsoft Office)
-
13
ACCESSで値を代入できないとは?
Visual Basic(VBA)
-
14
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
-
15
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
16
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
-
17
Accessのフォームで、空欄のレコードを検索したい。
その他(データベース)
-
18
OR関数
その他(Microsoft Office)
-
19
アクセスで#エラーを表示させない方法は?
Access(アクセス)
-
20
アクセスでのテキストボックスの複数条件での抽出
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
エクセルで色の付いたセルを抽...
-
5
未審査請求包袋抽出表作成とは...
-
6
「パラメータが少なすぎます。3...
-
7
ACCESSのクエリー抽出条件にIIF...
-
8
PDFファイル/抽出許可され...
-
9
X-Ripperというフリーウェアに...
-
10
オートフィルターで一昨日の抽...
-
11
【エクセルVBA】 A1セルを参照...
-
12
アクセス 同じフィールド(テキ...
-
13
コンボボックス全ての値を取得...
-
14
Excel 文字列から6桁の数値の抽出
-
15
Acccess クエリで演算結果を抽...
-
16
Access チェックボックスを利用...
-
17
Excelマクロ オートフィルター...
-
18
Access クエリとテーブルの合計...
-
19
アクセスのテキストボックスでO...
-
20
Accessの選択クエリの抽出条件...
おすすめ情報
公式facebook
公式twitter