🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

14028閲覧

Access VBAで複数条件で抽出時エラーになる(エラー'3464', '3075')

jamada

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/12/05 07:24

編集2019/12/06 01:58

Access初心者です。

帳票フォームヘッダーに検索用テキストボックス,チェックボックス,検索コマンドボタンを配置し、詳細部に抽出されたレコードを表示したいのですが,二つのエラーが解決できません。
すべてのフィールドは T_ 案件 にあります。

①実行時エラー'3464':抽出条件でデータ型が一致しません

「担当事務員ID」を抽出条件に組み込みたいのですが,実行時にエラーが出てしまいます。

「担当ID」の抽出は動作しています。そのため「担当事務員ID」にも,同じコードを書きました。

フィールド担当事務員IDはテキスト型です。
ルックアップで参照していますが,参照先の元のフィールドも「担当事務員ID」テキスト型になっています。
データ型が違う,とのことですがどこを直せばいいのかがわかりません…。

②実行時エラー'3075' クエリ式'終了=True '-1'の構文エラー:演算子がありません

同じく下記のコードで,ここにフィールド「終了」yes/no型に対する条件も組み込もうと探っています。
チェックボックスに✓を入れた時だけ条件とし,空の時は条件に含みたくありません。
yes/no型を条件にする構文をサイトから拾って組み込んでみたのですがどうにもうまくいきません。
→追記:回答をいただいて解決しました。ありがとうございました。

「案件ID」も同じエラーが出てしまいます。こちらはフィールド案件IDで,数値型です。
→追記:検索ボックスへの入力時に数字を全角入力すると作動しました。
理由はわからないのですが,今の私のレベルでは動くのでよし,とすることにします。
ありがとうございました。

いろいろ試しすぎて,何を試したかわからなくなってきました。
申し訳ないのですが,お力をお貸しください。

現在のコード

Private Sub cmd検索_Click() Dim strFilter As String, strExp As String, aryOpe As Variant If Not IsNull(Me.txt案件ID) Then strFilter = " AND " & BuildCriteria("案件ID", _ dbLong, Me.txt案件ID) End If If Not IsNull(Me.chb終了) Then strFilter = strFilter & " AND 終了=True '" & Me.chb終了 & "'" End If If Not IsNull(Me.cmd担当ID) Then strFilter = " AND " & BuildCriteria("担当ID", _ dbLong, Me.cmd担当ID) End If If Not IsNull(Me.cmd事務員ID) Then strFilter = " AND " & BuildCriteria("担当事務員ID", _ dbLong, Me.cmd事務員ID) End If Me.Filter = Mid(strFilter, 6) If strFilter = "" Then Me.FilterOn = False Else Me.FilterOn = True End If End Sub

イミディエイト表示?も使って自分で探ろうと思ったのですがそもそもなにを打ち込んで検証すればよいのかもわからず…
情報が不足しているようであればご教示ください。
お手数をおかけいたします。宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

VBA

1 If Not IsNull(Me.cmd事務員ID) Then 2 strFilter = " AND " & BuildCriteria("担当事務員ID", _ 3 dbLong, Me.cmd事務員ID) 4 End If 5```↓ 6```VBA 7 If Not IsNull(Me.cmd事務員ID) Then 8 strFilter = " AND " & BuildCriteria("事務員ID", _ 9 dbText, Me.cmd事務員ID) 10 End If

では。

投稿2019/12/06 01:48

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jamada

2019/12/06 01:54

ありがとうございます。確認してきました。 抽出元のテーブルでフィールド名が「担当事務員ID」でしたので,質問の記載が間違っていました。申し訳ありません。ご指摘ありがとうございます。修正してきます。
guest

0

ベストアンサー

「フィールド事務員IDはテキスト型」ならば、

vba

1 strFilter = " AND " & BuildCriteria("担当事務員ID", _ 2 dbLong, Me.cmd事務員ID)

は、

vba

1 strFilter = " AND " & BuildCriteria("担当事務員ID", _ 2 dbText, Me.cmd事務員ID)

にしてください。第2引数は、テキスト型は dbText 、数値型は dbLong を指定します。

イミディエイトウィンドウで下記のように確認してみると違いが分かります。

text

1?BuildCriteria("案件ID", dbText, 111) 2案件ID="111" 3?BuildCriteria("案件ID", dbLong, 111) 4案件ID=111

「案件ID」も同じエラーが出てしまいます。こちらはフィールド案件IDで,数値型です。

数値型なら、コード的には問題ないはずです。別の部分が原因では?

チェックボックスに✓を入れた時だけ条件とし,空の時は条件に含みたくありません。

これはsaziさんの回答でOK。

追記

フィールドのデータ型で条件式がかわってきます。
今回の場合は BuildCriteria を使わなくてもシンプルに記述できます。
その方かコードが理解しやすいと思います。

対象フィールドがテキスト型の場合

vba

1 strFilter = " AND フィールド名='" & Me.コントロール名 & "'"

対象フィールドが数値型の場合

vba

1 strFilter = " AND フィールド名=" & Me.コントロール名

テキスト型は条件の値を'で囲む。数値型は囲まないということです。

この方がシンプルに記述できます。
上記の書き方を理解して、フィールドのデータ型に合わせて書き換えて下さい。

補足

今回の質問のようなシンプルな条件の場合はBuildCriteriaを使わずに記述した方かすっきりします。
BuildCriteriaの使いどころとしては、例えばユーザーに下記のような複雑な条件を許可するようなときに有効です。

vba

1strKey = "*あいう*" 2strFilter = BuildCriteria("テキストフィールド", dbText, strKey) 3Debug.Print strFilter ' "テキストフィールド Like '*あいう*'" 4 5strKey = "あ or い or う" 6strFilter = BuildCriteria("テキストフィールド", dbText, strKey) 7Debug.Print strFilter ' "テキストフィールド = 'あ' OR テキストフィールド = 'い' OR テキストフィールド = 'う'"

クエリの抽出条件欄に式を記述した時に生成されるSQLと同じような変換をしてくれます。

投稿2019/12/06 00:43

編集2019/12/06 05:13
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jamada

2019/12/06 01:48

ありがとうございます。イミディエイトウィンドウがようやく理解できました。これで自力での解決が少しはかどりそうです。 早速やってみました。まず strFilter = " AND " & BuildCriteria("担当事務員ID", _ dbText, Me.cmd事務員ID) & "'" strFilter = " AND " & BuildCriteria("担当事務員ID", _ dbLong, Me.cmd事務員ID) & "'" ではどちらも「文字列の構文エラー」がでます。 saziさんからの(')でくくるのを加えて試すと strFilter = " AND '" & BuildCriteria("担当事務員ID", _ dbLong, Me.cmd事務員ID) & "'" strFilter = " AND '" & BuildCriteria("担当事務員ID", _ dbText, Me.cmd事務員ID) & "'" どちらもエラーは出なくなりましたが,条件としては機能せず,事務員だけを条件にすると全件かえってきてしまいます。 ちなみに事務員IDは五桁の数字ですが,これにも問題があるのでしょうか。 同じ条件で,作動している「担当ID」とはデータ型は同じで,違いはデータそのものがこちらは英数字,ということだけなのです…。 案件IDは,検索時に数値を全角で入力すると反映されました!(残念ながら理由はわからないのですがとりあえず動作はするのでよしとします…)
hatena19

2019/12/06 03:02

回答に追記しましたので見てください。 また、最初のコードも修正しました。
jamada

2019/12/06 03:06

ありがとうございます。見様見真似でやっているため,不要に複雑にしてしまっているのはわかっていたのですが,下手に直すこともできずいましたのでとても助かりました。理解を深めながら,まずはやってみます。迅速なご回答をありがとうございます。
jamada

2019/12/06 04:50

遅くなりました。すべて正常に動作しました。 いただいたものを参考にシンプルにできるところをはじめからすべて書き直しました。サイトもたくさんお世話になっております。本当にありがとうございました!
jamada

2019/12/06 05:47

回答の補足をありがとうございます。 実ははじめ,そのようなことをしたかったのです。それでhatena19様のサイトにたどり着いて,参考にBuildCriteriaを使っていろいろとやってみたのですが,途中で,いまの力では到底無理だと思って,ゴール自体を変えたのでした。ただ動作している部分があったので,シンプルに戻すことはせずに進めようとしていました。結果,大変な遠回りでした。もう少し経験したらBuildCriteriaを使うVBAの記述にもチャレンジしたいとおもいます!ありがとうございます。
guest

0

BuildCriteria("担当事務員ID", dbLong, Me.cmd事務員ID)が返す結果が文字型だとしても、作成されるフィルターが文字型を意識していませんね。

シングルクオート(')で括られるようにしてみて下さい。

VBA

1 If Not IsNull(Me.cmd事務員ID) Then 2 strFilter = " AND '" & BuildCriteria("担当事務員ID", _ 3 dbLong, Me.cmd事務員ID) & "'" 4 End If

訂正

BuildCriteriaをユーザー関数だと思い込んでました。
BuildCriteria メソッド (Access)

FieldTypeのパラメータを正しく指定する必要があります。

VBA

1 If Not IsNull(Me.cmd事務員ID) Then 2 strFilter = " AND " & BuildCriteria("担当事務員ID", _ 3 dbText, Me.cmd事務員ID) 4 End If

チェックボックスに✓を入れた時だけ条件とし,空の時は条件に含みたくありません。

チェックされた時だけの条件にすれば良いだけでは?

VBA

1 If Me.chb終了= True Then 2 strFilter = strFilter & " AND 終了=True" 3 End If

投稿2019/12/05 10:20

編集2019/12/06 03:04
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jamada

2019/12/06 00:49

チェックボックス作動しました!シンプルにすることを考えるべきでした。ありがとうございます。事務員のほうはダメでした…が,やはりどこかでデータ型が違うのですね。記号をもう一度解読してみます。
hatena19

2019/12/06 02:52

BuildCriteriaは、条件式の文字列を返しますので ' で囲んではダメです。 `案件ID=111' となってしまいすますので。
sazi

2019/12/06 02:58

hatenaさん てっきり、BuildCriteriaはユーザー関数だと思っていました。 jamadaさん BuildCriteriaの型指定のパラメータの問題ですね。
jamada

2019/12/06 03:11

お二方ありがとうございます。’と”の使い方を,まさにいま再度勉強している(サイトをあさっている)ところでした。初心者にむけて,丁寧な解説ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問