dポイントプレゼントキャンペーン実施中!

ACCESS VBA にて複数項目のあいまい検索をしようとしています。
txt部所、txt内容、txt備考はそれぞれ検索窓です。

実行すると、
「オブジェクト変数またはWithブロック変数が設定されていません」
というメッセージがでます。

また、動作としては部所の検索のみでき、
内容、備考検索は上記のエラーメッセージが出てできない状態です。

アドバイスよろしくお願いいたします。

以下がコードになります。


Private Sub cmd01_Click()


Me.FilterOn = False

If txt部所 <> "" Then
Me.Filter = "[部所氏名]like '*" & txt部所 & "*'"
ElseIf txt内容 <> "" Then
Me.Filter = "[内容]like '*" & txt内容 & "*'"
ElseIf txt備考 <> "" Then
Me.Filter = "[備考]like '*" & txt備考 & "*'"
ElseIf Nz(txt部所) & Nz(txt内容) & Nz(txt備考) = "" Then
MsgBox "検索条件を入力してください"
End If

Me.FilterOn = True

End Sub

A 回答 (10件)

まずは、エラーとなるときに、


このエラー検知時のエラー箇所特定、対処例をまずマスターすることです。
それが分かればこの先のエラーもなんとかしのげます。
対処がわからず、闇雲にいろいろ試すのはあまりいい手段ではありません。
(何が原因かわからずやっていたらうまくいったというのは上達しないやり方です。。)

見ている限りではいろいろ試してはいるものの、
原因はともかく「エラー箇所行の特定」についてはなにも進んでいないように思います。


例えば、
ElseIf Me!txt備考 <> "" ThenやNz(Me!txt備考)で
エラーが起き、Me!txt備考が認識されていないという想定がついたなら、
Me!txt備考=""
でどうか、はやってみる価値あります。

>Me!txt備考 = Nothing

というのも、
内容をクリアの意味でやっているなら、Me!txt備考 = ""、
デフォルトが全件数させたいなら、Me!txt備考 = "*"
であり、
フォームを開くとき、次のフィルタを実行するときの両方のイベントに
行うのが良いです。



今の状況からは、
フォーム開いて、クリアしてから1回目のフィルタを行うと
2回目と同様、ここを通過するので同じようにエラーになるはず。

前述のように3パターンで確認お願いします。
1)1回目フィルタ→クリア→2回目フィルタ
2)クリア→1回目フィルタ
3)1回目フィルタ→フォーム閉じる→1回目フィルタ

1)はエラーとのことですが、2)もエラー、3)は問題なし、
と想定しています。
    • good
    • 1
この回答へのお礼

ありがとうございました!
Me!txt備考 = ""、
で試してみたところ、うまく抽出、クリアできました。
本当にありがとうございました!

お礼日時:2010/06/25 09:03

エラーが検出されないのならば、



>Private Sub cmd02_Click()

>Me!txt部所 = Nothing
>Me!txt内容 = Nothing
>Me!txt備考 = Nothing

>Me.FilterOn = False

>End Sub



Private Sub cmd02_Click()

Me!txt部所 = ""
Me!txt内容 = ""
Me!txt備考 = ""

Me.FilterOn = False

End Sub

としたらどうなりますか?
    • good
    • 0

再確認です。




ボタン押した瞬間のTXT部所ら3項目は、参照不可にならず、意図した内容ですか。参照設定は問題ないですか。

IF文のELSEIFをやめてそれぞれのIF文にしてさらに箇所絞り込みましたか。

NZの使い方は合っていますか。各項目それぞれが何も無い、3項目連結しても何も無い、としたいと思いますが今のは中途半端な式です。括弧かNZ(TXT部所)=“”&のようにした方がいいのではないですか。=が備考にのみ掛かっています。案外これかと。


MEとさせてますが、フォームはこれ以外にありますか。実際は裏でフォームが開いていたとか。


1回目→クリア→2回目
クリア→1回目、
1回目→閉じる→1回目
これまでの回答結果を整理して、
コンパイルや操作しても変わらず、以外の結果も教えて下さい。

同じ環境を再現出来るレベルでないのでこれくらいです。
    • good
    • 0

チェックを入れたら、



Option Compare Database
Option Explicit

と記されていないのならば
Option Explicit
を追加して、保存し、コンパイルしてください。
Option Explicit
が記されていれば追加する必要は
ありません。これで今一度、
コード表のデバッグ→コンパイル
を選択し、実行してください。
これで変数扱いになっている
文字列がコンパイルエラーとして
表示されます。

まだ、どこかにエラーがあるはずです。

この回答への補足

おっしゃるとおりにしてみたのですが、
とくにコンパイルエラーは表示されず、
その後コンパイルがグレーアウトされてしまいました。

補足日時:2010/06/23 15:18
    • good
    • 0

2解明とは2回目のことですね?。



きちんと稼動するものが2回目におかしいとなると、このクリック時のロジックでなく他の処理が影響しているのかと根拠は薄いですが想定されます。

フォーム開いてフィルタ実行、フォーム開いて実行は正しくなりますか。フォーム開いて実行、また実行がおかしい?。

オブジェクト変数~のエラーが実行時に出るからには1回目と2回目で項目名が変わるとかフィルタの命令文が認識できないように壊れてるとかデータ不正に依存したり、実行環境が変わってしまっている。

クリアして1回目フィルタはどうですか。


止まるのは
どの行でか特定してますか。

先に進めるには罠かけ。
メッセージボックスを追記して正しいところを明確にしましょう。

この回答への補足

フォームを開いて1回目だけどの検索窓でも正しく検索できます。
クリアボタンを押して2回目の検索をすると、
If Nz(txt部所) & Nz(txt内容) & Nz(txt備考) = "" Then
の部分でエラーになります。
ためにしに、この部分を削除して、検索条件だけにしてみましたが、
やはりif分の1行目でエラーになってしまいます。

補足日時:2010/06/23 16:14
    • good
    • 0

エラー表示が無いのはどうにも


わからないのですが。

コード表の一番上には、

Option Compare Database
Option Explicit

と記されていますか。

コード表のツール→オプション→編集
の変数の宣言を強制するにチェックが
入っていますか。入っていなければ
入れてください。

そのあたりはどうですか。

この回答への補足

エラー表示が無いのはどうにも
わからないのですが。

コード表の一番上には、

Option Compare Database
Option Explicit

と記されていますか。

>ption Compare Database と記載されています

コード表のツール→オプション→編集
の変数の宣言を強制するにチェックが
入っていますか。入っていなければ
入れてください。

そのあたりはどうですか。

>チェックを入れたところ、エラーメッセージは出なくなりましたが、
まったくレコードを抽出しなくなりました。

補足日時:2010/06/23 14:26
    • good
    • 0

追加です。



コード表でツールバーのデバッグからコンパイル
を選択して実行すればコンパイルエラーが表示され、
変数が定義されていません、と出ます。

'*" & txt部所 & "*'"
'*" & txt内容 & "*'"

など、その他で出るはずです。

この回答への補足

アドバイスありがとうございます。
コンパイルを実行してみましたが、
エラーメッセージは表示されませんでした。

そして1回実行すると、メニューがグレーアウトしてしまうのですが、
複数はコンパイルできないものなのでしょうか?

初歩的なことをお伺いしてすみません。

それから不思議に思うのは、検索は1回までなら正常に検索できるのですが、
1度条件をクリアーして2回目の検索を行うとエラーメッセージが表示されます。

クリアーボタンのコードは以下になります。

Private Sub cmd02_Click()

Me!txt部所 = Nothing
Me!txt内容 = Nothing
Me!txt備考 = Nothing

Me.FilterOn = False

End Sub

補足日時:2010/06/23 09:34
    • good
    • 0

エラーの意味を書いておきます。



>オブジェクト変数またはWithブロック変数が設定されていません

でGoogle検索すればすぐでてきますが、要点は、
「無効な変数が参照されています」
ということです。つまりコードの中で変数宣言されていない
文字列が存在して、これは何?とAccessからエラー表示が
された、ということです。

この回答への補足

すみません、後ひとつ質問させてください。

コンパイルをし用紙とすると、デバッグーメニューに
「データベース名コンパイル」と出ると調べましたが、
私の場合、データベース名変更前の名前+コンパイルと出てきます。

そのことでうまくコンパイルできていないんでしょうか?

補足日時:2010/06/23 09:47
    • good
    • 0

ステップ実行したか。



フィルタで指定する各テーブルの項目やフォームの項目、は正しいか、

判定を一旦はずし、フィルタを定義した行だけで実行してもダメか。

後、
3つとも無いケースは最初に判断する。

内容と備考に値あるとき内容だけのフィルタ設定になるが良いのか。

そんな感じです。

この回答への補足

アドバイスありがとうございます。
3つともないケースを最初に持ってきましたが、
やはり2解明にエラーが起こるという現象はかわりませんでした。

それから判定をはずしてみましたが、やはりかわりませんでした。

内容と備考に値があるとき内容のみの検索になるのはかまいません。

補足日時:2010/06/23 09:50
    • good
    • 0

コードにMe!を追加するとどうなりますか。



If Me!txt部所 <> "" Then
Me.Filter = "[部所氏名]like '*" & Me!txt部所 & "*'"
ElseIf Me!txt内容 <> "" Then
Me.Filter = "[内容]like '*" & Me!txt内容 & "*'"
ElseIf Me!txt備考 <> "" Then
Me.Filter = "[備考]like '*" & Me!txt備考 & "*'"
ElseIf Nz(Me!txt部所) & Nz(Me!txt内容) & Nz(Me!txt備考) = "" Then
MsgBox "検索条件を入力してください"
End If

この回答への補足

アドバイスありがとうございます。
残念ながら同じエラーが発生して島しました。

補足日時:2010/06/23 09:35
    • good
    • 0

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