抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力すると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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) Sheet2の日付をキーにオートフィルターで2023年1月のデータを抽出し、Sheet3へ書き出すた 2 2023/03/06 23:57
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Visual Basic(VBA) エクセル VBA メール本文に指定セルに記載されているURLをリンクとして記載する方法 8 2022/08/08 07:50
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
アクセスのOR検索
Access(アクセス)
-
Access2003 クエリで、空の列は作れますか?
Access(アクセス)
-
-
4
ACCESSのクエリで抽出条件「または」は9個までしかかけませんよね…
Access(アクセス)
-
5
アクセスのfilter、複数条件の記述方法を教えてください。
Access(アクセス)
-
6
Access 複数条件検索の設定が上手く行きません
Access(アクセス)
-
7
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
8
Accessクエリの抽出条件にフォームから挿入する方法
その他(データベース)
-
9
アクセスの初心者の質問です(空白の場合に他のフィールドを表示させたい。)
Access(アクセス)
-
10
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
11
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
12
アクセスVBAで既に開いているエクセルを閉じたい
Yahoo!ショッピング
-
13
選択クエリで実行結果を非表示にできますか?
その他(データベース)
-
14
アクセスで追加した項目に全て同じ値を一発で入れたい
Access(アクセス)
-
15
ACCESSで値を代入できないとは?
Visual Basic(VBA)
-
16
MS Accessでフォームの「開く時」と「読込み時」のイベントの違い
Access(アクセス)
-
17
accessVBA 「フォームが見つかりません」
その他(データベース)
-
18
Accessファイルを作成者以外は編集できないように設定するには
Access(アクセス)
-
19
ACCESS 「パラメータの入力」を消したい!!
Access(アクセス)
-
20
Access サブフォームでの選択行の取得
その他(データベース)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS クエリ 条件以外のレ...
-
エクセルで、抽出したデータだ...
-
【AccessVBA】レコードセットOp...
-
未審査請求包袋抽出表作成とは...
-
Accessの選択クエリの抽出条件...
-
PDFファイルから特定の文字を検...
-
ACCESSのクエリー抽出条件にIIF...
-
エクセル関数で住所から丁目番...
-
アクセス 同じフィールド(テキ...
-
EXCEL関数 MAX関数と複合的に...
-
AccessのWHERE句において、変数...
-
Triton X-100 bufferの作り方に...
-
Excel 文字列から6桁の数値の抽出
-
コーヒーメーカーのドリップ式...
-
MP3データを一部抜粋したい
-
PCゲーム 音声 画像 抽出方法
-
動画から『連続した画像』を抽...
-
生薬のエタノール抽出について
-
Accessの抽出条件
-
GIMP前景抽出について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、抽出したデータだ...
-
エクセルで色の付いたセルを抽...
-
AccessのWHERE句において、変数...
-
未審査請求包袋抽出表作成とは...
-
PDFファイルから特定の文字を検...
-
「パラメータが少なすぎます。3...
-
COUNTIFのやり方を教えてくださ...
-
X-Ripperというフリーウェアに...
-
【AccessVBA】レコードセットOp...
-
ACCESSのクエリー抽出条件にIIF...
-
PDFファイル/抽出許可され...
-
Excel 文字列から6桁の数値の抽出
-
Accessの選択クエリの抽出条件...
-
Access チェックボックスを利用...
-
ACCESS クエリ 条件以外のレ...
-
エクセル関数で住所から丁目番...
-
コンボボックス全ての値を取得...
-
アクセス 同じフィールド(テキ...
-
access クエリ yes/no型のクエ...
-
エクセル VBA メール本文に指定...
おすすめ情報