Option Compare Database
Option Explicit '変数宣言強制 これはあった方がよい
'メインフォーム上のテキストボックス(サブフォームコントロールの抽出条件)
Private Sub 氏名_AfterUpdate()
'フィルタ実行
Call buildWhereContition
'画面再表示
'Me("subForm").Form.Requery 不要
End Sub
Private Function buildWhereContition()
Dim strWhereCondition As String '変数宣言を型指定して行う
'strWhereCondition = "" '不要 String型で宣言すれば初期値は""なので
'タブコントロール
'myTab = myForm![タブ].Value myFormがどこにも宣言、セットされていない
Dim subForm As Form
Set subForm = Me("subForm" & Me![タブ].Value).Form 'サブフォームを取得しておいた方が後で楽
'条件は一つだけなので下記でOK
If Me![氏名] <> "" Then
strWhereCondition = "氏名='" & Me![氏名] & "'"
End If
subForm.Filter = strWhereCondition
'抽出条件文字列がある場合はタブコントロール内にあるサブフォームコントロールにフィルタ設定
If strWhereCondition <> "" Then
subForm.FilterOn = True
'抽出条件文字列がない場合はフィルタ解除
Else
subForm.FilterOn = False
End If
End Function
Public Function 許可日(申請日 As Variant, Optional 営業日数 As Long = 3) As Variant
Dim 営業日 As Long
許可日 = 申請日
If IsNull(許可日) Then Exit Function
Do
許可日 = 許可日 + 1
Select Case Weekday(許可日)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
営業日 = 営業日 + 1
End If
End Select
Loop Until 営業日 = 営業日数 - 1
End Function
If Not IsNull(Me.間口_min) Then
strFilter = strFilter & " AND 間口 >= " & Nz(Me.間口_min)
End If
If Not IsNull(Me.間口_max) Then
strFilter = strFilter & " AND 間口 <= " & Nz(Me.間口_max)
End If
DoCmd.Requery "保管地番"
Me!保管地番.SetFocus
If Me.町名コンボ= "大江" Then
MsgBox "大江1丁目・2丁目1番~7番・大江3丁目~6丁目は中央署です。
大江2丁目8番以上は東署です。"
管轄署 = InputBox("管轄署を入力")
管轄署.SetFocus
End If
Me!保管地番.SetFocus
Me!警察署 = 町名コンボColumn(3)
End Sub
Me.Filter = Mid(strfilter, 6)
If strfilter = "" Then
Me.FilterOn = False
Else
Me.FilterOn = True
If Me.Recordset.RecordCount = 0 Then MsgBox "検索データはありません"
End If
全くわからないと言われてしまうとどうすべきなのか迷いますが・・・
選択した月をすべて抽出したいということですが、複数選択が可能なリストボックスを使わなかったらできますか?
「月」の抽出なので、例えばテキストボックスを12個使ったりとか、チェックボックスを12個使ったりとかです。
まずはここまで
そんな仕様どこに書いてあります?
標準モジュールの関数もどこに提示されてますか?
投稿no.5
あっ、このことね。
提示されいてるコードを元に回答していますので、途中で変更されても。
提示されていないコードに関してのエラーがどうのこうのと言われても、エスパーでないので、
回答不能です。
一番初めの仕様でもお書きした通り、フォーム上に抽出フィールドは、フォームによりことなりまず、およそ7〜10個程度あります。これを標準化するため、抽出条件文字列のビルドは、標準モジュールに定義した関数に、サブフォームを引数として渡して処理する仕様としています。
丸一日、どんなに使っていてもエラーが出ないこともありますし、出だすとちょいちょい出ることもあります。どういうケースでそうなるのかが特定できていません。
ですので、タイミングの問題に起因するのではないかと想像しているところです。
申し訳ありません。
新規で質問をさせて頂きます。
提示されいるコードの抽出条件は、氏名だけですが、もし、そうなら、VBAを書かなくても、
サブフォームコントロールのプロパティのリンク親フィールド、リンク子フィールドに「氏名」と設定するだけで、
抽出できます。
それだとエラーは出ないと思いますが、どうでしょうか。
仰る通りかとは思いますが、フイルタの条件には問題がある可能性は極めて低いと考えています。実行時エラーが出た時のWhere句をクエリのSQLビューに貼り付けて、from句を付して実行すると正しく動きました。
であるとすれば、問題の切り分けとしては、タブコントロールを何度も切り替えながら、データ抽出する過程で、タイミング動きがおかしくなる可能性があるのではいかと、私自身は想像しています。
ですので、カレントのタブコントロールにはアーカスを移動してフィルタを掛けたりなどのトライはしてみました。
でも、これでも解決はしていません。
もう少しテストして、問題の切り分けをしてみます。
こちらは解決しました。
SQLで直接Where句を書くのですね。
当初の質問とは内容が異なってきていますので、
新規に質問を立ててください。
実際のコードを提示していただかないと、間違いの原因を指摘するのは困難です。
普段は成功して、ある時、エラーになるなら、その時の条件値など、具体的な発生条件を調べる必要があります。
この作業はこちらからは無理です。
標準モジュールに書いていた関数をフォームモジュールといて、投稿しながら書き換えました。
すみません、実際のコードではないです。
多少、書き換えています。
なるほど、サブフォームを先に取得するところは直します。
冗長を簡素化しただけにみえますので、
実行時エラーが稀に発生するという根本的な解決には至っていないという理解で間違ってなきでしょうか?
ひとまずは修正したものを正としてテストを進めます。
このコードが実際のもとだとすると、エラーで実行できないはず。
また、無駄が多いコードなので、とりあえず下記のように書き直して、試してみてください。
勉強中と言うばかりで、頼ってばかりで申し訳ありません。
メッセージも表示でき、何とかかたちになった来ました。
厚かましくも、度々の追加質問をさせて頂きたく、再度送信いたしました。
検索項目の追加を考え、月検索(数値型)をリストボックスで作って、複数選択を可能にしたいと、【複数選択リストボックスで選択したレコードの印刷】をもとに色々試したのですが、リストボックスの複数選択で絞り込みが出来ません。
リストボックスでの複数選択した項目を 複数条件の抽出フォームで使用することは出来ないのでしょうか。
これをリストボックスの複数選択にしたいと思っているのですが・・・・・。
よろしくお願いいたします。
追記
実行時エラーは、
このオブジェクトは、このプロパティまたはメソッドをサポートしていません。
だったと思います。
許可日関数を下記のように変更してください。
あと、TMGさんの回答のように、テーブルの市外か市内を判断できるフィールドで、条件分けをすればいいでしょう。
軽かつ市内
の部分の条件式はテーブルのフィールド構成が分からないので、適切なの式を考えてください。軽自動車は管轄署が「市内」の場合には2日で、「市外」は3日になるんですよね。
作成したクエリには「管轄署」についての情報はないのですが、そういったデータはございますか?
もし管理しているということであれば、
許可日の引数に「普軽別」と「管轄署」を追加し、
営業日のところで条件分岐をすることで
ご希望の日付を取得することができると思います。
インターネットが使えない状況が続き返事が遅くなり
申し訳ありません。
horotonさんhatenaさんご教示大変ありがとうございます。
警察の管轄が町名で分けてありますが
大江だけが町名ではなく丁目あるいは番地で
分けてあるのです。
したがってhorutonさんの
2.身内で使うようなものなら
ret = Inputbox("管轄署を入力。0=中央署、1=東署")
select case ret
case 0: me!管轄署 = "中央署"
case 1: me!管轄署 = "東署"
end select
で手抜き実装したりとか
を参考にして作ってみようかと思います。
ありがとうございます。
方向性が見えました。検証しながら進めてみます。
Excelの既存ファイルに追記するなら、3. はだめですね。
そのコードはどこに書くのでしょうか。
データベースA Or データベースB Or それ以外のデータベース
あと、丸投げの質問ではなく、自分で調べて、できるとこまでのコードを提示してください。
確かに「テーマの使用:いいえ」もしました。
朱色さま、補足ありがとうございました。
朱色さん、ありがとうございます。
私のAccess19でも「フォーム上のコントロールにWindowsのテーマを使用する」のチェックをはずして、コントロールの「テーマの使用:いいえ」で旧スタイルになりました。
当方Access2016
ボタンのプロパティで「境界線幅:3ポイント」→「テーマの使用:いいえ」にしたら四角く立体的なボタンになりました。
あら、うまくいきましたか。それはよかったです。
でも、なぜ、私のAccessでは変化なしなんだろう?謎です。
hatenaさま
上手くいきました!
ACCESSのバージョンは職場で2013、自宅で2019で、どちらでも同じ結果を得られました。
大変ありがとうございましたm(__)m
Accessのバージョンは何でしょうか。
記憶では、ファイル→オプション→現在のデータベースの「フォーム上のコントロールにWindowsのテーマを使用する」のチェックを外すと古いデザインに戻ったと思うのですか、今、確認してみたら、チェックを外しても変化ないですね(Access2019)。
いえ、サブフォームに埋め込まれているフォームの方で設定してください。
メインフォームで設定するのですね。
どうもありがとうございました。
フォームの「削除の許可」プロパティを「いいえ」に設定してください。
ありがとうございます!
うまくいきました!
どうやら「#」だと日付だと認識するらしい、とまでは気付いたものの、テキスト型で正しい、と思い込んでいたので「*」に変えてみたり、いろいろ見当違いなことをやってしまっていました。
教えてくださったように記述して、抽出結果が出た時には感動しました。
リンクしていただいたhatenaさんのサイト、お気に入りに追加しました。
勉強させていただきます。
職場で図面の登録・検索システムを作らねばならず、五十の手習いでネットや本でで調べたりコピペしたり四苦八苦していましたが、おかげさまで今回一気に進みました。
いつか私も他人様に教えられるくらいになりたいです。
hirotonさんの回答に私も同意です。
メッセージボックスを表示させるのは入力が中断されるのでユーザーにとっては鬱陶しいです。
コンボボックスで選択できるようにして、その横にラベルを配置しておいて、そのラベルに
"大江1丁目・2丁目1番~7番・大江3丁目~6丁目は中央署です。
大江2丁目8番以上は東署です。"
と表示させればいいかと思います。
ところで、丁目以降は入力しないのでしょうか。
丁目で警察署を判断するということは、入力時に参照してるデータには丁目があるということですよね。
ならば丁目まで入力あるいはコンボで選択するような設計にすれば警察署は自動できまります。
大江だけ例外的な処理なら今回のような設計もありえますが。
まず、間口フィールドのデータ型は数値型にしてください。
短いテキストでは大小比較ができません。
Filterに設定する条件式はSQL文になりますが、
SQLでは、
日付/時刻型は # で囲む、
テキストは ' で囲む、
という決まりがあります。
数値は囲まずにそのまま使用します。
ということで、下記のように修正するといいでしょう。
余裕があるなら、下記のページを参照して学習しておくと理解が深まると思います。
最初から管轄署をコンボボックスで作ればいいのでは?
(やっぱりユーザーに入力させないのが一番だと思いますが)
訂正です
ME.保管地番→ME.町名コンボ
お世話になります。質問が要領が悪く大変失礼しました。
下記で分かりますでしょうか。
区コンボ あいおうえおコンボ 町名コンボ
それぞれコンボを連携し町名まではコンボ入力し
丁目以降は手入力をしています。
中央区 → あ → 大江
東区 か 出水
西区
南区
北区
大江以外の町名にはそれぞれ警察署をコンボに記して
Me!警察署 = 町名コンボ.Column(3)で求めています。
しかし大江は下記のように丁目地番で警察署が違うので
町名コンボの更新後処理で処理したいのです。
町名コンボの更新後処理に
DoCmd.Requery "保管地番"
Me!保管地番.SetFocus
If Me.町名コンボ= "大江" Then
MsgBox "大江1丁目・2丁目1番~7番・大江3丁目~6丁目は中央署です。
大江2丁目8番以上は東署です。"
管轄署 = InputBox("管轄署を入力")
管轄署.SetFocus
End If
Me!保管地番.SetFocus
Me!警察署 = 町名コンボColumn(3)
End Sub
それではよろしくお願いします
早々にご返事いただきまして
ありがとうございます。
少しづつ思うような検索フォームに近づいていて
益々勉強しなければ!と思うこの頃です。
本当にありがとうございます。
ご指摘ありがとうございました。いつも参考になる回答をありがとうございます。
そのような疑問が出るということは、どこからのコードをそのままコピペして使用しいるのだと思いますが、
それぞれのコードの意味をまずは理解してください。
そのコードのやっていることはフォームのレコードソースのデータを対象に検索するというコードです。
フォームにレコードがなければ検索できるはずかありません。
また、その前に、何をしたいのか分析しましょう。その目的に合致した方法を選ぶ必要があります。
「検索」とは複数のレコードが表示されていて、条件に合致するレコードへ移動するということです。
フォームに最初はレコードは表示してなくて、条件に合致するレコードを表示するのは「抽出」です。
やりたいことは、あるいは目的に合致するのは「検索」か「抽出」のどちらですか。それをまず検討してください。
このコードは、テーブルを指定しないと動かないのでしょうか?
MT_名簿を検索しています