MS Access Tips/Sample and VBA and Blog customize etc...

複数条件の抽出フォームの設計 その3

今回は、前回のものに、詳細フォーム(単票)を開くことができるボタンを追加してみました。抽出フォームと詳細フォームは、片方をレコード移動するともう一方も同時に同じレコードに移動するようにしました。

タイトル画像

難易度:

デザインおよびコード

サンプルフォーム外観
FrmFilter_3.png

同じテーブルから単票フォームを作成します。名前は、F_社員詳細 とします。

前回の抽出フォームにトグルボタンを追加します。

プロパティ 設定値 
名前 tglOpenDetail 
規定値 Flase 
標題 詳細表示 

トグルボタンの更新後処理

抽出フォームのRecordset を詳細フォームの Recordset に設定するだけです。これで両者の Recordset が共通のものとなり、両者は同期するようになります。
参考: フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは?

ただし、フィルタをかけると Recordset は再生成されるようで、同期しなくなります。ですので、フィルタをかけた後、もう一度設定し直す必要があります。
抽出コマンドボタンのコードの最後に Setコードを追加すればいいのですが、それですと、ユーザーがメニューや右クリックでフィルタをかけたとき、同期しなくなるのを防ぐことはできません。フィルタをかけたときに発生するイベントに設定すればいいと考えて、「フィルタ実行時」イベントに設定してみましたが、これはフィルタが実行される前に発生するようで、使えませんでした。
「フィルタ実行後」というイベントがあればいいのですが、我がAC2003にはありません。このようなときの裏技として、「タイマ時」イベントを利用すると言うのがあります。「タイマ時」イベントに Setコード を記述して(タイマ間隔は0にしておいて実行されないようにしておきます。)、「フィルタ実行時」でタイマ間隔を0以外に設定して(当方の環境では、10(ミリ秒)ぐらいでいいようです。)タイマ時に設定した処理がちょっと遅れて実行されるようにします。タイマ時のコードの先頭で「タイマ間隔」を0に戻すのを忘れないように。さもないとコードが繰り返し実行されてしまいます。

メニューや右クリックでフィルタをかけたときもちゃんと同期するようになりました。ただし、抽出ボタンや抽出解除ボタンのクリックでは同期しません。Filterプロパティではフィルタ実行時イベントは発生してないようです。そこで、Fiterプロパティではなく、DoCmd系の命令でフィルタをかけたり、解除したりするように変更しました。これだとフィルタ実行時イベントは発生します。

フォームデザインビュー

フォームモジュール

あと、抽出条件に正しくない値が入力されてエラーが出たときのエラー処理、抽出フォームを閉じるときに、詳細フォームも道連れに閉じるコード、等を追加したのが下記のフォームモジュールになります。

サンプルファイルが下記からダウンロードできます。
FrmFilter_3_07.zip (Access 2007-2010 形式 - 35kb)
FrmFilter_3.zip (Access 2002-2003 形式 - 30kb)
FrmFilter_3_2k.zip (Access 2000 形式 - 27kb)

19 Comments

yamada says..."Or検索?の追加について"

初めまして。
いつも参考にさせていただき、大変感謝しております。
このコードで検索機能をAccess2003で作成して大変重宝していますが、Or検索?機能を追加したいのですが方法が分かりませんのでご教示いただけませんでしょうか?

例えばテーブルに以下3つのテキストフィールドがあるとします。
・「担当者1」
・「担当者2」
・「担当者3」

検索フォームに例えば「txt担当者1」「txt担当者2」「txt担当者3」の名称で配置して「aryCtls = Split()」のコードに追加したのでは、それぞれのフィールドを個々にしか検索できません。
つまり、「担当者1」に"山田"と入力すると、当たり前ですが「担当者1」に"山田"と入力されているレコードしか検索されません。(担当者2または3に山田と入力されているレコードは無視されます)

そうではなく、検索フォームには[txt担当者]というテキストボックス名で一つだけ配置し、そこに"山田"と入力すると、テーブルの「担当者1」「担当者2」「担当者3」のいずれか一つに"山田"が入力されているレコードを検索するようにしたいのです。
ご教示いただけませんでしょうか。よろしくお願いいたします。

2012.11.21 11:36 | URL | #kLoia8aY [edit]
hatena says..."re: Or検索?の追加について"

>そうではなく、検索フォームには[txt担当者]というテキストボックス名で一つだけ配置し、そこに"山田"と入力すると、テーブルの「担当者1」「担当者2」「担当者3」のいずれか一つに"山田"が入力されているレコードを検索するようにしたいのです。

下記のコードを、挿入してください。

  If Not IsNull(Me.txt担当者) Then
    strFilter = strFilter & _
    " AND (担当者1='" & Me.txt担当者 & _
    "' OR 担当者2='" & Me.txt担当者 & _
    "' OR 担当者3='" & Me.txt担当者 & "')"
  End If

2012.11.22 02:23 | URL | #5uE6dEgY [edit]
yamada says..."re: Or検索?の追加について"

hatena様

yamadaです。
無事目的の機能を実装することができました。
ありがとうございました。

今後ともお世話になります。
よろしくお願いいたします。

2012.11.26 15:56 | URL | #udFcU6JE [edit]
ゆか says..."コンボボックス検索について"

こんにちは。
ご説明が大変わかりやすくて、いつも参考にさせていただいております。

こちらのコードを使用させていただいてAccess2010で書類の提出管理を
作成しています。

検索先のテーブルで、ルックアップを設定している項目は、こちらの検索
フォームで、一緒に検索できるように指定できるでしょうか?
コンボボックスでの検索についても調べてみたのですが、こちらのコードと
組み合わせ使用する方法がわからず立ち止まっています。


提出先テーブルで、都道府県の入力を都道府県テーブルからルックアップで
指定しています。
都道府県テーブルは、ID・都道府県・地域を入力しています。

お時間があるときでかまいませんので、ご教授いただけると嬉しいです。
よろしくお願いします。

2012.11.28 18:22 | URL | #- [edit]
hatena says..."re: コンボボックス検索について"

フォームの詳細セクションに「都道府県」入力用のコンボボックスがあると思いますが、それをコピーして、フォームヘッダーに貼り付けます。
コントロールソースに設定してあるフィールド名を削除します(非連結にする。)
名前は、cmb都道府県 とします。

フォームを開くときのイベントプロシージャの Split関数の引数に、cmb都道府県 を付け加えます。

コード例
Private Sub Form_Open(Cancel As Integer)
  aryCtls = Split("txt社員コード txtフリガナ txt氏名 txt在籍支社 " & _
       "txt部署名 min誕生日 max誕生日 min入社日 max入社日 cmb都道府県")
End Sub

以上です。

2012.11.29 20:57 | URL | #5uE6dEgY [edit]
ゆか says..."ありがとうございます!"

こんにちは。
早速のお返事ありがとうございます。

コンボボックスでもテキストボックスでも考え方は
一緒なんですね。

回答を教えていただいたら、恥ずかしくなるくらい
初歩的なことを質問していたことに気が付きました。

お忙しいのに、親切に教えてくださってありがとう
ございます。本当に困っていたので、大変助かりま
した。
感謝を込めて、拝。

2012.11.30 10:40 | URL | #- [edit]
名無し says..."実行エラー13について"

恐れ入ります。
上記仕様とまったく同じにしているコンボボックスの一致条件(完全一致、部分一致など)を変更すると、実行時エラー13 型が一致しません。とデバックになり、
Me(.Tag).Tag = Split(",* *, *,*", ",")(.Value)
の欄にフォーカスが当たります。
原因として何が考えられますか?

2013.10.09 09:54 | URL | #- [edit]
hatena says..."re:実行エラー13について"

一致条件選択のコンボボックスの「連結列」プロパティは「0」になってますか。なってなければ、0 にしてください。

2013.10.09 10:31 | URL | #5uE6dEgY [edit]
名無し says..."re:re:実行エラー13について"

理解できました。

ありがとうございます。

2013.10.09 12:35 | URL | #- [edit]
igachan says..."定期的なイベントの自動入力"

定期的なイベント
 たとえば
       毎月8日 13:00 定例ミーティング や
       2014/4/1 18:00 新入社員歓迎会 のように

毎月開催されるもの と 毎年1回開催されるもの を「定期行事」というテーブルを作って自動でカレンダーに取り込まれる様にしたいのですが・・・。

2014.04.07 11:56 | URL | #- [edit]
hatena says..."re:定期的なイベントの自動入力"

このページの内容とは直接関係ない質問のようですが。

適切なAccess関係の掲示板で、もう少し具体的な状況を提示して質問しなおしてください。

現状はどこまでできていて、どこがわからないのかピンポイントで質問しなと回答は難しいです。

2014.04.07 14:58 | URL | #5uE6dEgY [edit]
igachan says..."Re:Re:定期的なイベントの自動入力"

申し訳ありません。多数hatenaさんのサンプルを改良させて頂いておりますので場所を間違えてしまいました。改めてご質問させて頂きます。

2014.04.08 00:42 | URL | #- [edit]
かな says..."一致条件のないフォーム"

こんにちは。
助けてください…。

こちらのフォームの一致条件のコンボのないものをそっくり作ろうとしています。
(条件は部分一致で)

ですが、どこを削ればいいのかわからず、つまずいてしまいました。
どこを書き換えればよいか教えていただけないでしょうか?
ちなみに、複数条件の抽出フォームの設計その1も使わせていただいていますが、そちらはうまくできそうなのですが、できればこちらの書き方も勉強したいと思い質問させていただきました。

2014.08.29 13:00 | URL | #nIWdzhM2 [edit]
hatena says..."re:一致条件のないフォーム"

> こちらのフォームの一致条件のコンボのないものをそっくり作ろうとしています。
> (条件は部分一致で)
>
> ですが、どこを削ればいいのかわからず、つまずいてしまいました。

フォーム上からコンボボックスを削除するだけで、動作します。

コードで不要な部分は下記です。

16行目の
ublic Sub SetCriteriaType()

から

38行目の
Private Sub cmdFilter_Click()

の前まで。

2014.08.30 15:57 | URL | #5uE6dEgY [edit]
かな says..."re:re:一致条件のないフォーム"

こんばんは!

助かります( ..)φ
ありがとうございます(^^)
ちょっと、やってみます♪

2014.09.02 23:21 | URL | #nIWdzhM2 [edit]
美佐 says..."社員詳細フォームをエクセル出力"

hatena様

いつも参考にさせていただき、大変感謝しております。
抽出した社員詳細フォームをエクセル出力することはできますか。

2017.08.26 18:00 | URL | #qNXjQhIg [edit]
とらもく says..."詳細フォームを開いた際のフォーカスの挙動"

hatena様
有用な情報をおしげもなく公開して頂いてありがとうございます。本サンプルについて一点お聞き出来れば嬉しいです。
詳細フォーム(単票フォーム)を開いた際のフォーカスの挙動についてです。
通常、(レコードセット同期させていない)一般的なフォームを開きますと、有効なタブオーダーの最初のコントロールにフォーカスがあたった状態になると思います。
しかし、本件では(レコードセット同期後)の詳細フォームは、フォーカスが見当たらず行方不明になっているように見えます(Tabキーによるフォーカス移動も効かないようです)。

マウスでどれかコントロールをクリックすればフォーカスは復活しますので、大きな問題ではないのですが、少々気になっています。
通常と同じような挙動にすることはできないでしょうか?

自分なりに調べたところでは、下記URLを参考にVisibleの操作でフォーカスを復活できましたが、一瞬画面がちらつきますし、根本的な解決ではない気がしています(Accessの仕様やバグの類でしょうか?)
何かしらお知恵を拝借できれば幸いです。

https://answers.microsoft.com/ja-jp/msoffice/forum/all/access2010%E3%81%A7setfocus%E3%81%8C%E4%BD%BF/88d8327b-fb73-e011-8dfc-68b599b31bf5

2021.10.21 01:02 | URL | #X.Av9vec [edit]
hatena says..."re:詳細フォームを開いた際のフォーカスの挙動"

.Recordset = Me.Recordset
という方法がどちらかというと裏技的な方法なので、通常とは異なる動作になるのか仕方がないことかなと思います。

リンク先の方法を試してみましたが、私の目ではちらつきは気になりませんでした。
(かなり老眼が進んでますので)

下記のようにフォームを開く前に画面描画停止したらちらつきは解消しませんか。

  DoCmd.Echo False
  DoCmd.OpenForm "F_社員詳細"
  With Forms!F_社員詳細
    Set .Recordset = Me.Recordset
    .Visible = False
    .Visible = True
    .社員コード.SetFocus
  End With
  DoCmd.Echo True

それで解消しないということなら、
.Recordset = Me.Recordset
の方法ではなく、フォームのレコード移動イベントで他フォームもレコード移動させる処理を設定する方法に変更することになるかと。

2021.10.22 00:32 | URL | #5uE6dEgY [edit]
とらもく says...""

hatena様
お忙しい中、ありがとうございます。
Echoによる画面描写のOFF/ONを試してみました。
当方の環境では変わらず一瞬画面がちらついてしまいます。

おっしゃる通り「.Recordset = Me.Recordset」自体が裏技的ですので、通常のようにするのは難しいのかもしれませんね。

実用上は問題はありませんので、この形でいきたいと思います。
お手数をお掛けして失礼いたしました。
またお忙しい中、丁寧なご返信をありがとうございました。

2021.10.22 10:19 | URL | #X.Av9vec [edit]

Leave a reply






Trackbacks

trackback URL
https://hatenachips.blog.fc2.com/tb.php/131-47ca4532
該当の記事は見つかりませんでした。