「ブロック機能」のリニューアルについて

抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力すると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 指定した式で参照されている'|'フィールドがみつかりません。
と表示され、希望通りの結果が得られません。
アクセス初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますのでどうぞよろしくお願い致します。

教えて!goo グレード

A 回答 (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様が教えて下さった方法が理解できたら書き替えたいと思います。
ご丁寧に教えて頂きありがとうございました。

補足日時:2009/11/22 13:31
    • good
    • 0
この回答へのお礼

30246kiku様
時間がかかってしまいましたが、教えて頂いた方法で設定が出来ました。
色々とありがとうございました。

お礼日時:2009/11/22 16:04

#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 '*い*'")

この回答への補足

ご丁寧にありがとうございます。
もう一度最初から設定しなおしたら希望どおりの動作になりました。
色々とお手数をおかけしました。

補足日時:2009/11/22 13:23
    • good
    • 0

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を利用しております。
よろしくお願い致します。

補足日時:2009/11/21 21:57
    • good
    • 0

Filterで出来るのだろうが、


http://accessclub.jp/bbs/0068/beginers25857.html 参考
色んな場合に統一的にできるところの、
テキストボックスの文字列をコマンドボタン等クリックされた機会に捉えて、スペースでその文字列をSplitし、その配列要素の文字列を&とORで結合して、SQLのWhere条件(Where句)にする、でいかがですか。

この回答への補足

早速の回答ありがとうございました。
参考に教えて頂いたところや、Split、Where条件などを調べているのですが、初心者の為まだ理解できるところまでいきません。
もしよろしければ、もう少し詳しく教えて頂けると幸いです。
どうぞよろしくお願い致します。

補足日時:2009/11/21 22:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング