質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

Access

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

1166閲覧

Access VBA 範囲検索について

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

Access

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2019/07/02 01:31

編集2019/07/03 01:44

##質問内容
商品マスタのヘッダーに非連結テキストボックスを設置し、そこに入力した商品番号や商品名でサブフォームの内容を検索ができるようにしているのですが、単価を検索するとき
〇〇〇〇~〇〇〇〇 のように範囲検索したいです。
ちなみに、片方だけ入力してある状態検索をかけるとそれ以上やそれ以下のようにはできています。

##現状

VBA

1 If Me!Text_ProductCode = "" And Me!Text_ProductName = "" And Me!Text_Cost = "" And Me!Text_Cost2 = "" Then 2 Exit Sub 3 Else 4 5 'フィルタをかける 6 7 Me!Sub_ProductMaster.Form.Filter = "F_DeleteFlag = False " 8 9 '商品コード 10 If Nz(Me!Text_ProductCode, "") = "" Then 11 Else 12 Me!Sub_ProductMaster.Form.Filter = Me!Sub_ProductMaster.Form.Filter + "and F_ProductCode like ""*" & Text_ProductCode & "*""" 13 End If 14 15 '商品名 16 If Nz(Me!Text_ProductName, "") = "" Then 17 Else 18 Me!Sub_ProductMaster.Form.Filter = Me!Sub_ProductMaster.Form.Filter + "and F_ProductName like ""*" & Text_ProductName & "*""" 19 End If 20 21 '単価最小 22 If Nz(Me!Text_Cost, "") = "" And Not Nz(Me!Text_Cost2, "") = "" Then 23 Else 24 Me!Sub_ProductMaster.Form.Filter = Me!Sub_ProductMaster.Form.Filter + "and F_Cost >= Text_Cost" 25 End If 26 27 '単価最大 28 If Nz(Me!Text_Cost2, "") = "" And Not Nz(Me!Text_Cost, "") = "" Then 29 Else 30 Me!Sub_ProductMaster.Form.Filter = Me!Sub_ProductMaster.Form.Filter + "and F_Cost <= Text_Cost2" 31 End If 32 33 34 Me!Sub_ProductMaster.Form.FilterOn = True

※Text_Cost:単価最小値
Text_Cost2:単価最大値

よろしくお願いします

##追記
↓sazi さんの助言のもと

VBA

1Private Sub Button_Search_Click() 2 3 '検索欄が空のときフィルタをかけない 4 5 If Me!Text_ProductCode = "" And Me!Text_ProductName = "" And Me!Text_Cost = "" And Me!Text_Cost2 = "" Then 6 Exit Sub 7 Else 8 9 'フィルタをかける 10 11 wFilter = "F_DeleteFlag = False " 12 13 '商品コード 14 If Nz(Me!Text_ProductCode, "") <> "" Then 15 wFilter = wFilter & " and F_ProductCode like ""*" & Text_ProductCode & "*""" 16 Else 17 End If 18 19 '商品名 20 If Nz(Me!Text_ProductName, "") <> "" Then 21 wFilter = wFilter & " and F_ProductName like ""*" & Text_ProductName & "*""" 22 Else 23 End If 24 25 '単価 26 If Nz(Me!Text_Cost, "") <> "" And Nz(Me!Text_Cost2, "") <> "" Then 27 wFilter = wFilter & " and F_Cost <= Text_Cost2 " & " and F_Cost >= Text_Cost" 28 ElseIf Nz(Me!Text_Cost, "") = "" Then 29 wFilter = wFilter & " and F_Cost <= Text_Cost2" 30 ElseIf Nz(Me!Text_Cost2, "") = "" Then 31 wFilter = wFilter & " and F_Cost >= Text_Cost" 32 End If 33 34 With Me!Sub_ProductMaster.Form 35 .Filter = wFilter 36 .FilterOn = True 37 End With 38 39 '件数更新 40 41 TOTAL = DCount("F_ProductCode", "T_Product", Me!Sub_ProductMaster.Form.Filter) 42 43 Me.Text_Num = TOTAL + "件" 44 End If 45 46End Sub

↓hatena19 さん助言のもと

VBA

1Private Sub Button_Search_Click() 2 3 '検索欄が空のときフィルタをかけない 4 5 If Me!Text_ProductCode = "" And Me!Text_ProductName = "" And Me!Text_Cost = "" And Me!Text_Cost2 = "" Then 6 Exit Sub 7 Else 8 9 'フィルタをかける 10 11 wFilter = "F_DeleteFlag = False " 12 13 '商品コード 14 If Nz(Me!Text_ProductCode, "") = "" Then 15 Else 16 wFilter = wFilter + "and F_ProductCode like ""*" & Text_ProductCode & "*""" 17 End If 18 19 '商品名 20 If Nz(Me!Text_ProductName, "") = "" Then 21 Else 22 wFilter = wFilter + "and F_ProductName like ""*" & Text_ProductName & "*""" 23 End If 24 25 '単価 26 If Nz(Me!Text_Cost, "") <> "" Then 27 wFliter = wFilter & "and F_Cost >= " & Me.Text_Cost 28 End If 29 30 If Nz(Me!Text_Cost2, "") = "" Then 31 wFilter = wFilter & "and F_Cost <= " & Me.Text_Cost2 32 End If 33 34 With Me!Sub_ProductMaster.Form 35 .Filter = wFilter 36 .FilterOn = True 37 End With 38 39 '件数更新 40 41 TOTAL = DCount("F_ProductCode", "T_Product", Me!Sub_ProductMaster.Form.Filter) 42 43 Me.Text_Num = TOTAL + "件" 44 End If 45 46End Sub

※wFilter はグローバル変数です(String)

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

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

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

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

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

guest

回答2

0

難しく考えずに、単純に下記でいいのでは。

vba

1If Nz(Me!Text_Cost, "") <> "" Then 2 Me!Sub_ProductMaster.Form.Filter = Me!Sub_ProductMaster.Form.Filter & " and F_Cost >= Me.Text_Cost 3End If 4 5If Nz(Me!Text_Cost2, "") = "" Then 6 Me!Sub_ProductMaster.Form.Filter = Me!Sub_ProductMaster.Form.Filter & " and F_Cost <= " & Me.Text_Cost2 7End If

Me!Sub_ProductMaster.Form.Filterが繰り返し登場するのは見苦しいし、遅くなりますので、
条件式は変数に格納しておいて、最後にFilterプロパティに設定するのがいいでしょう。

vba

1Dim stFilter As String 2stFilter = "F_DeleteFlag = False " 3If Nz(Me!Text_ProductCode, "") <> "" Then 4 stFilter = stFilter & " and F_ProductCode like '*" & Text_ProductCode & "*'" 5End If 6 7'中略 8 9If Nz(Me!Text_Cost, "") <> "" Then 10 stFilter = stFilter & " and F_Cost >= " & Me.Text_Cost 11End If 12 13If Nz(Me!Text_Cost2, "") <> "" Then 14 stFilter = stFilter & " and F_Cost <= " & Me.Text_Cost2 15End If 16 17With Me!Sub_ProductMaster.Form 18 .Filter = stFilter 19 .FilterOn = True 20End With

投稿2019/07/02 02:29

編集2019/07/02 10:01
hatena19

総合スコア33620

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

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

退会済みユーザー

退会済みユーザー

2019/07/02 07:09

すみません。。 上記のように実行してみましたが構文エラーでうまく通りませんでした。
hatena19

2019/07/02 07:19

提示のコードはあくまでサンプルでそのままで動くものではないですよ。(そちらの状況が見えないのに動作するコードを書くのは不可能です。) コードのロジックを理解して、そちらの状況にあうように修正してください。(途中省略部分も同じロジックで作成してください。) そのうえで、構文エラーなり実行時エラーがでるなら、あなたの書いたコードを提示してこの行でエラーが出るというように質問してください。
退会済みユーザー

退会済みユーザー

2019/07/02 07:29

提示してくださったコードをもとに私が書いたコードです。 'フィルタをかける wFilter = "F_DeleteFlag = False " '商品コード If Nz(Me!Text_ProductCode, "") = "" Then Else wFilter = wFilter + "and F_ProductCode like ""*" & Text_ProductCode & "*""" End If '商品名 If Nz(Me!Text_ProductName, "") = "" Then Else wFilter = wFilter + "and F_ProductName like ""*" & Text_ProductName & "*""" End If '単価 If Nz(Me!Text_Cost, "") <> "" Then wFliter = wFilter & "and F_Cost >= " & Me.Text_Cost End If If Nz(Me!Text_Cost2, "") = "" Then wFilter = wFilter & "and F_Cost <= " & Me.Text_Cost2 End If With Me!Sub_ProductMaster.Form .Filter = wFilter .FilterOn = True End With これの実行結果が構文エラーにつながっています。
退会済みユーザー

退会済みユーザー

2019/07/02 07:48

問題点としては、 商品番号と商品名で検索したときに構文エラーになり、 単価の範囲検索ではエラーは出ませんが、検索結果が全く変わっていないという状況です。
hatena19

2019/07/02 10:11 編集

wFilter = wFilter + "and F_ProductCode like ""*" & Text_ProductCode & "*""" andの前に空白が必要です。他の部分も同様です。 wFilter = wFilter + " and F_ProductCode like ""*" & Text_ProductCode & "*"""
退会済みユーザー

退会済みユーザー

2019/07/03 00:18

ありがとうございます。 文が繋がっていると認識されるからという意味での空白ですよね。 実行してみましたが、変わりませんでした。
hatena19

2019/07/03 00:23

変わりませんでしたではなく、どこをどのように変更してどのようにうまくいかないのか、きちんと説明してください。変数宣言の部分も含めてコード全体を質問の方にマークダウンで追記してください。 回答者はエスパーではないので、あなたのしたとこは見えません。 Debug.Print で wFilter の中身を確認して正しい式になっているかもご自身で確認してください。
退会済みユーザー

退会済みユーザー

2019/07/03 01:45

教えて頂いた通り、andの前に空白を設けたのですが。
hatena19

2019/07/03 02:18

If Nz(Me!Text_Cost2, "") = "" Then は、下記に修正してください。 If Nz(Me!Text_Cost2, "") <> "" Then あとは、自分で間違いを探す努力をしてください。デバッグ方法も研究してください。
退会済みユーザー

退会済みユーザー

2019/07/03 05:20

ありがとうございました。
guest

0

ベストアンサー

単に条件分岐すれば良いだけ。

VBA

1If Nz(Me!Text_Cost, "") <> "" And Nz(Me!Text_Cost2, "") <> "" Then 23ElseIf Nz(Me!Text_Cost, "") <> "" Then 45ElseIf Nz(Me!Text_Cost2, "") <> "" Then 67End If

投稿2019/07/02 02:14

編集2019/07/03 05:30
sazi

総合スコア25138

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

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

退会済みユーザー

退会済みユーザー

2019/07/02 04:58

回答ありがとうございます。 >If Nz(Me!Text_Cost, "") <> "" And Nz(Me!Text_Cost2, "") <> "" Then このフィルタでの抽出条件で以下の文を書いたのですが、違うみたいで。。。 どこが違うのかわかりますか?? "and Text_Cost >= F_Cost <= Text_Cost2"
退会済みユーザー

退会済みユーザー

2019/07/02 05:02

すみません。 "and F_Cost <= Text_Cost2 " + "and F_Cost >= Text_Cost" の文でうまく通りました。お騒がせしました。
退会済みユーザー

退会済みユーザー

2019/07/02 06:20 編集

よろしければ教えて頂きたいのですが、 単価の範囲指定しての検索はできたのですが、商品番号や商品名で検索をかけた時にエラーメッセージ3071が出てしまいます。 >式が正しく入力されていないか、複雑すぎるために評価できません。 とのことなのですが、調べてもよくわからないのでアドバイスなど頂ければ幸いです。
sazi

2019/07/02 14:01

エラーメッセージだけでは分かりません。 質問にコードを追加して下さい。
退会済みユーザー

退会済みユーザー

2019/07/03 00:24 編集

提示してくださったものをもとに作成したものです。 'フィルタをかける wFilter = "F_DeleteFlag = False " '商品コード If Nz(Me!Text_ProductCode, "") <> "" Then wFilter = wFilter + " and F_ProductCode like ""*" & Text_ProductCode & "*""" End If '商品名 If Nz(Me!Text_ProductName, "") <> "" Then wFilter = wFilter + " and F_ProductName like ""*" & Text_ProductName & "*""" End If '単価 If Nz(Me!Text_Cost, "") <> "" And Nz(Me!Text_Cost2, "") <> "" Then wFilter = wFilter + " and F_Cost <= Text_Cost2 " + " and F_Cost >= Text_Cost" ElseIf Nz(Me!Text_Cost, "") = "" Then wFilter = wFilter + " and F_Cost <= Text_Cost2" ElseIf Nz(Me!Text_Cost2, "") = "" Then wFilter = wFilter + " and F_Cost >= Text_Cost" End If With Me!Sub_ProductMaster.Form .Filter = wFilter .FilterOn = True End With
sazi

2019/07/03 00:36 編集

like 後の"*"で後ろの"がありません。 wFilterの内容を確認すれば分かる内容です。 それから文字列の結合に+は使用せず&を使用した方が良いです。
退会済みユーザー

退会済みユーザー

2019/07/03 01:27

変数の中身を確認できることを知りませんでした。 *000001* では、文的に違うということですか?
sazi

2019/07/03 01:51 編集

失礼しました。前後を*で挟んでいるんでしたね。 Text_Cost等の画面項目が文字列内に埋め込まれてしまっています。 再度言いますけど文字列の結合に+は使用せず&を使用した方が良いです。
退会済みユーザー

退会済みユーザー

2019/07/03 02:00

変更してみたのですが、同じエラメが出てしまいました。 顧客番号だけで000001で検索をかけた時、イミディエイトウィンドウには F_DeleteFlag = False and F_ProductCode like "*000001*" and F_Cost <= Text_Cost2 のように表示されました。最後まで処理が通っていないということでしょうか?
sazi

2019/07/03 02:03 編集

前のコメントに追記していましたが、Text_Cost等の画面項目が文字列内に埋め込まれてしまっています。 > and F_Cost <= Text_Cost2 はおかしいですよね。 本来 and F_Cost <= 100 とかになるべきはずなので。
退会済みユーザー

退会済みユーザー

2019/07/03 02:23

Text_Cost等を通貨型にすればいいということですか?
sazi

2019/07/03 02:28 編集

hatena19さんでのコードでは文字列の外に出していますよね。 サンプルコードを利用するのはいいんですけど、単なるコピペプログラマでは駄目ですよ。
退会済みユーザー

退会済みユーザー

2019/07/03 05:20

ネットで調べるときは、一度もコピペしたことありませんよ笑 最終的な問題点は、 ElseIf Nz(Me!Text_Cost, "") = "" Then ここが<>ではなかったことでした。 これにより問題が解決いたしました。多くのアドバイス、ありがとうございました。 文字列を使用方法も覚えておきますね。
sazi

2019/07/03 05:50 編集

ああ、回答が良くなかったですね。 実装されたコードでは指定するフィルター条件の項目を逆にされていた訳ですけど、両方ともに指定が無い時にエラーになっていた訳ですね。 回答の方も修正しておきます。
退会済みユーザー

退会済みユーザー

2019/07/03 05:36

気づけて良かったです。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/07/04 00:28 編集

単価(通貨型)のフィルタの時は、 ElseIf Nz(Me!Text_Cost, "") <> "" Then wFilter = wFilter & "and F_Cost >= " & Text_Cost & " " ↑の文で入力した単価以上で検索がかかるのですが、 処理日(日付型)のときは ElseIf Nz(Me!Text_ProcessDate, "") <> "" Then wFilter = wFilter & "and F_ProcessDate >= " & Text_ProcessDate & " " と同じように書いているのですが、処理日以降のフィルタがかからないです。日付型だと変わってくるのでしょうか。 よろしければ、アドバイスをいただけると幸いです。 イミディエイトの結果です F_DeleteFlag = False and F_ProcessDate >= 2019/06/24
退会済みユーザー

退会済みユーザー

2019/07/04 00:45

↑試行錯誤の結果、 " & Text_ProcessDate & " の前後に#を加えることで解消しました。 お騒がせしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問