Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Home : 指定なし)
フィルターを2回使用したい
投稿日時: 26/03/29 09:44:49
投稿者: ekane

よろしくお願いいたします
タイトル名が適切ではないかと思いますが
 
テーブルに取引先ID、取引先名、ジャンル、商品名等がありこれをクエリを通してフォームで表示させて
おります
ここにオプションボタン「あ〜ん」までを作成し、その文字を含む取引先をフィルターで表示させ
該当する取引先を開いております
 
そしてここでもオプションボタン7個位、野菜・果物・その他・(フィルター解除)等のボタンを
つくり、その顧客の中でジャンル別にフィルターで表示させたいと思っておりますが普通にフィルターを使うと
Me.Filter = "店舗名='" & Me.取引先名 & "'" & "'And" & "ジャンル='" &名称 & "'"
 
これだと最初のレコードに元に戻ってしまいます
指定した取引先の中だけでフィルターを使う方法はどのようなものがあるか教えを願いたいと存じます
 
すぐに返信できない場合もありますがよろしくお願いいたします。
 
 
 
 
 
 
 

回答
投稿日時: 26/03/31 10:19:09
投稿者: hatena
投稿者のウェブサイトに移動

取引先でフィルターかけるオプショングループと、ジャンルでフィルターかけるオプショングループがフォーム上にあるということでしょうか。
 
だとすれば、それぞれのオプショングループの更新時に、オプションボタンの状態に対応する抽出条件を生成してMe.Filterに設定するという考え方で設計すればいいでしょう。
 
コード例
 

Sub SetFilter()
    Dim 条件取引先 As String
    Dim 条件ジャンル As String

    '取引先オプショングループの値に対応する条件式の生成
    条件取引先 = "・・・・・・・・"

    'ジャンルオプショングループの値に対応する条件式の生成
    条件ジャンル = "・・・・・・・・"

    Me.Filter = "(" & 条件取引先 & ") AND (" & 条件ジャンル & ")"
End Sub

Private Sub オプショングループ_AfterUpdate()
    Call SetFilter
End Sub

Private Sub オプショングループ_AfterUpdate()
    Call SetFilter
End Sub

 
オプショングループ(またはオプションボタン)の設定が不明なので考え方のみの一例です。

回答
投稿日時: 26/03/31 10:20:50
投稿者: sk

引用:
テーブルに取引先ID、取引先名、ジャンル、商品名等がありこれをクエリを通してフォームで表示させております
ここにオプションボタン「あ〜ん」までを作成し、その文字を含む取引先をフィルターで表示させ
該当する取引先を開いております

帳票フォームの Filter プロパティの値を変更することによって
フォームフィルターを実行しているとして、その処理を
どのフォームのどのコントロールのどのイベントで実行しているのでしょうか。
 
また、仮にその帳票フォーム自身のフォームヘッダーかフォームフッターに
複数個のオプションボタンが配置されているとして、それらは 1 つのオプショングループを
親コントロールとしてリンクしている(いずれか 1 つしか選択できない)のか、
それぞれ独立したオプションボタンである(複数選択が可能である)のかが不明です。
 
引用:
そしてここでもオプションボタン7個位、野菜・果物・その他・(フィルター解除)等のボタンを
つくり、その顧客の中でジャンル別にフィルターで表示させたいと思っております

同上。
 
引用:
Me.Filter = "店舗名='" & Me.取引先名 & "'" & "'And" & "ジャンル='" &名称 & "'"

少なくとも、上記のステートメントは実際にフォームモジュールに記述されているものとは思えません。
そのまま実行すれば構文エラーとなるはず。
 
また、フォーム上のコントロール[取引先名]および[名称]と、
前述のオプションボタン(オプショングループ)との関係が不明瞭です。
 
引用:
指定した取引先の中だけでフィルターを使う方法はどのようなものがあるか

「フォームのレコードソース上の複数のフィールドに対する AND 条件を
任意に指定できるようにしたい」
「(『取引先』も含め)それぞれの条件は省略できるようにしたい」
とは異なるニュアンスが含まれているのでしょうか。

投稿日時: 26/03/31 20:46:09
投稿者: ekane

hatena様
お忙しいところ誠に恐縮でございます
説明が下手で申し訳ございません
 
>取引先でフィルターかけるオプショングループと、ジャンルでフィルターかけるオプショングループが
 フォーム上にあるということでしょうか
 
はいそうです ただし一つのフォーム上ではありません
実現したいこと
顧客検索フォームで「あ〜ん」までのオプショングループをつくりその中で「あ」をクリックして
「あ」でフィルターをかけ特定の「あ・・」商店という名称のレコードをクリックしその顧客フォームを
開きます
ここには取引のある商品がすべて表示されております(ここまで出来ております)
 
顧客フォームは
frm取引先親(単票)に帳票フォームでfrm取引先子を埋め込んでおります
この単票フォームヘッダーに二つ目のオプショングループを作り「表示された顧客の中で」ジャンル
ごとにフィルタ表示させたいと思うのです
 
表示した特定の取引先の中だけで今度はジャンルでフィルターを使う方法をお教え頂きたいと存じます
 
お教え頂いたコード(一つのフォーム上での)考え方を基礎に勉強させていただきます(時間がかかり
ますが)
大変にありがとうございました。
 
Private Sub オプショングループ_AfterUpdate()
    Call SetFilter
End Sub
Private Sub オプショングループ_AfterUpdate()
    Call SetFilter
End Sub
申し訳ありませんこれはなぜ二回必要とするのでしょうか

投稿日時: 26/03/31 21:37:53
投稿者: ekane

sk様
貴重なお時間をいただきまして誠にありがとうございます
よろしくお願いいたします。
ずれている答えになっていると思いますがお許しくださいませ
 
>どのフォームのどのコントロールのどのイベントで実行しているのでしょうか
 
 frm顧客検索 フレーム97 オプション 更新後処理 になります
 
>票フォーム自身のフォームヘッダーかフォームフッターに
>複数個のオプションボタンが配置されているとして(ハイそうです)、
>それらは 1 つのオプショングループをいずれか 1 つしか選択できません
 
引用:
>そしてここでもオプションボタン7個位、野菜・果物・その他・(フィルター解除)等のボタンを
>つくり、その顧客の中でジャンル別にフィルターで表示させたいと思っております
 
「ここでも」は frm顧客検索フォームで検索された取引先フォームのことですこのフォームヘッダー
に二つ目のオプションボタングループを作り検索された顧客名の中でジャンルごとにフィルターをかけ
たいと思います
 
申し訳ありません下記は無視してください
引用:
Me.Filter = "店舗名='" & Me.取引先名 & "'" & "'And" & "ジャンル='" &名称 & "'"
 
 
 
sk様 誠に誠に申し訳ございません
出かける時間となってしまいました、またご指導いただけるかわかりませんが誠に勝手ながら
失礼ながらここで一旦中断させていただきたいと存じます
誠に申し訳ございません。
ありがとうございました。

回答
投稿日時: 26/03/31 23:08:08
投稿者: sk

引用:
顧客検索フォームで「あ〜ん」までのオプショングループをつくりその中で「あ」をクリックして「あ」でフィルターをかけ特定の「あ・・」商店という名称のレコードをクリックしその顧客フォームを開きます
ここには取引のある商品がすべて表示されております(ここまで出来ております)

引用:
顧客フォームは
frm取引先親(単票)に帳票フォームでfrm取引先子を埋め込んでおります

・[frm顧客検索]、[frm取引先親]、[frm取引先子]の 3 つのフォームがある。
 
・[frm顧客検索]は非連結フォームである(レコードソースがない)。
 
・[frm取引先子]は、ある選択クエリをレコードソースとする帳票フォームである。
 
・[frm取引先親]の詳細セクション上には、[frm取引先子]をソースオブジェクトとする
 サブフォームコントロールが配置されている。
 
という前提であると仮定して、[frm取引先親]は連結フォームでしょうか。
それとも非連結フォームでしょうか。
 
また、[frm取引先子]をソースオブジェクトとするサブフォームコントロールの
[リンク親フィールド]プロパティおよび[リンク子フィールド]プロパティは
どのように設定されているのでしょうか。
 
引用:
>どのフォームのどのコントロールのどのイベントで実行しているのでしょうか
  
 frm顧客検索 フレーム97 オプション 更新後処理 になります

[frm顧客検索]上の非連結オプショングループ[フレーム97]の[更新後処理]イベントの
発生時に実行しているのは、埋め込みマクロとイベントプロシージャのどちらでしょうか。
 
埋め込みマクロの場合は、そのマクロ内で実行しているそれぞれのアクションとその引数を、
イベントプロシージャの場合は、そのプロシージャ全体のコードを具体的に明記して下さい。
 
引用:
「ここでも」は frm顧客検索フォームで検索された取引先フォームのことです
このフォームヘッダーに二つ目のオプションボタングループを作り

[frm取引先親]のフォームヘッダーセクション上に、1 つのオプショングループと
その子コントロールとなる複数個のオプションボタンを配置する、として
 
引用:
検索された顧客名の中でジャンルごとにフィルターをかけたいと思います

ここでの[顧客名]および[ジャンル]とは、それぞれどのフォームのレコードソースに
含まれているフィールドのことをおっしゃっているのでしょうか。

投稿日時: 26/04/01 22:01:23
投稿者: ekane

     sk様
     ありがとうございます。
     肝心の部分が抜けていて歯がゆい思いをさせて恐縮に存じます
     これ以上お手間を取らせると申し訳ないので他の方法で今一度考えてみます
 
引用------------------------------------------------------------------------------------------
・[frm顧客検索]、[frm取引先親]、[frm取引先子]の 3 つのフォームがある。
 ・[frm顧客検索]は非連結フォームである(レコードソースがない)

    レコードソースはテーブル「mtb取引先親」となります。
 ・[frm取引先子]は、ある選択クエリをレコードソースとする帳票フォームである。
    ハイ
  ・[frm取引先親]の詳細セクション上には、[frm取引先子]をソースオブジェクトとする
 サブフォームコントロールが配置されている。

    ハイ
  という前提であると仮定して、[frm取引先親]は連結フォームでしょうか。
それとも非連結フォームでしょうか。

   [frm取引先親]は連結フォームです
引用------------------------------------------------------------------------------------------
また、[frm取引先子]をソースオブジェクトとするサブフォームコントロールの
[リンク親フィールド]プロパティおよび[リンク子フィールド]プロパティは
どのように設定されているのでしょうか。
--------------------------------------------------------------------------------

  ソースオブジェクト:frm取引先子
  リンク親フィールド:取引先スペックID
  リンク子フィールド:取引先スペックID
    このことでよろしいんでしょうか
 
 引用----------------------------------------------------------------------------
[frm顧客検索]上の非連結オプショングループ[フレーム97]の[更新後処理]イベントの
発生時に実行しているのは、埋め込みマクロとイベントプロシージャのどちらでしょうか。

    イベントプロシージャです
これでよろしいでしょうか
    Private Sub フレーム97_AfterUpdate()
    Dim jyouken As Variant
    Select Case Me!フレーム97
    Case 1
     jyouken = "取引先名のフリガナ like '[ア]*'"
    Case 2
     jyouken = "取引先名のフリガナ like '[イ]*'"
    Case 3
     jyouken = "取引先名のフリガナ like '[ウ]*'"
    Case 4
     jyouken = "取引先名のフリガナ like '[エ]*'"
    Case 5
     jyouken = "取引先名のフリガナ like '[オ]*'"
    Case 6
     jyouken = "取引先名のフリガナ like '[カ-ガ]*'"
    Case 7
     jyouken = "取引先名のフリガナ like '[キ-ギ]*'"
    Case 8
     jyouken = "取引先名のフリガナ like '[ク-グ]*'"
   Case 9
     jyouken = "取引先名のフリガナ like '[ケ-ゲ]*'"
    Case 10
     jyouken = "取引先名のフリガナ like '[コ-ゴ]*'"
    Case 11
     jyouken = "取引先名のフリガナ like '[サ-ザ]*'"
    Case 12
     jyouken = "取引先名のフリガナ like '[シ-ジ]*'"
    Case 13
     jyouken = "取引先名のフリガナ like '[ス-ズ]*'"
    Case 14
     jyouken = "取引先名のフリガナ like '[セ-ゼ]*'"
    Case 15
    jyouken = "取引先名のフリガナ like '[ソ-ゾ]*'"
    Case 16
     jyouken = "取引先名のフリガナ like '[タ-ダ]*'"
    Case 17
     jyouken = "取引先名のフリガナ like '[チ]*'"
    Case 18
     jyouken = "取引先名のフリガナ like '[ツ-ヅ]*'"
    Case 19
    jyouken = "取引先名のフリガナ like '[テ-デ]*'"
    Case 20
     jyouken = "取引先名のフリガナ like '[ト-ド]*'"
    Case 21
     jyouken = "取引先名のフリガナ like '[ナ]*'"
    Case 22
     jyouken = "取引先名のフリガナ like '[ニ]*'"
    Case 23
     jyouken = "取引先名のフリガナ like '[ヌ]*'"
    Case 24
     jyouken = "取引先名のフリガナ like '[ネ]*'"
    'Case 25はなし
    Case 26
     jyouken = "取引先名のフリガナ like '[ノ]*'"
    Case 27
     jyouken = "取引先名のフリガナ like '[ハ-パ]*'"
    Case 28
     jyouken = "取引先名のフリガナ like '[ヒ-ピ]*'"
    Case 29
     jyouken = "取引先名のフリガナ like '[フ-プ]*'"
    Case 30
     jyouken = "取引先名のフリガナ like '[ヘ-ペ]*'"
    Case 31
     jyouken = "取引先名のフリガナ like '[ホ-ポ]*'"
    Case 32
     jyouken = "取引先名のフリガナ like '[マ]*'"
    Case 33
     jyouken = "取引先名のフリガナ like '[ミ]*'"
    Case 34
     jyouken = "取引先名のフリガナ like '[ム]*'"
    Case 35
     jyouken = "取引先名のフリガナ like '[メ]*'"
    Case 36
     jyouken = "取引先名のフリガナ like '[モ]*'"
    Case 37
     jyouken = "取引先名のフリガナ like '[ヤ]*'"
    Case 38
     jyouken = "取引先名のフリガナ like '[ユ]*'"
    Case 39
     jyouken = "取引先名のフリガナ like '[ヨ]*'"
    Case 40
     jyouken = "取引先名のフリガナ like '[ラ]*'"
    Case 41
     jyouken = "取引先名のフリガナ like '[リ]*'"
    Case 42
     jyouken = "取引先名のフリガナ like '[ル]*'"
    Case 43
     jyouken = "取引先名のフリガナ like '[レ]*'"
    Case 44
     jyouken = "取引先名のフリガナ like '[ロ]*'"
    Case 45
     jyouken = "取引先名のフリガナ like '[ワ]*'"
    Case 46
     jyouken = "取引先名のフリガナ like '[ヲ]*'"
    Case 47
     jyouken = "取引先名のフリガナ like '[ン]*'"
    Case 48
     jyouken = "取引先名のフリガナ like '[A-Z]*'"
          
    End Select
     Me.Filter = jyouken
     Me.FilterOn = True
 
    If Me.Recordset.RecordCount = 0 Then
      Beep
    MsgBox "現在 該当するデータはありません", vbOKOnly + vbInformation, "該当データの表示"
    End If
    End Sub
引用-----------------------------------------------------------------------------
引用:
>検索された顧客名の中でジャンルごとにフィルターをかけたいと思います
      ここでの[顧客名]および[ジャンル]とは、それぞれどのフォームのレコードソースに
      含まれているフィールドのことをおっしゃっているのでしょうか。

----------------------------------------------------------------------------
[顧客名]:frm取引先親   レコードソース:mtb取引先親   コントロールソース:取引先名
[ジャンル]:mtb取引先子  ジャンル(値集合ソースはテーブル「mtbジャンル」
 
frm取引先親(「単票フォーム)の中に帳票フォーム(frm取引先子)を埋め込んでおります
 
 テーブル名   フィールド名  データ型
mtb取引先親   取引先ID親   オートナンバー
         取引先名    テキスト
         取引先名カナ  テキスト
 
mtb取引先子   取引先ID子   オートナンバー
         取引先ID親   数値型
         ジャンル    テキスト
         名称      テキスト
 
mtbジャンル   ジャンルID   数値型
         ジャンル名   テキスト
ジャンル以外はそれぞれにフォームを作りレコードソースとしております
 
sk様にこれ以上お手間をかけたくないのでこれ以上の解答は無用に願い致します。
この度は誠にありがとうございました。

回答
投稿日時: 26/04/02 13:34:28
投稿者: hatena
投稿者のウェブサイトに移動

お教え頂いたコード(一つのフォーム上での)考え方を基礎に勉強させていただきます(時間がかかり
ますが)

 
一つのフォーム上にオプショングループがあるとの前提の回答ですが、実際は別々のフォームにあるとのことですので私の回答はスルーしてください。
 
そのうえでskさんへの回答で判明したことと、まだ不明な点を下記のように整理してみました。
 
判明したとした部分で間違いがあれば指摘してください。
また、不明点について補足してください。
 
[frm顧客検索]
 レコードソース: mtb取引先親
 
  オプショングループ: フレーム97
    オプションボタン配置
    更新後処理で自身にフィルターをかける(Me.Filter利用)
      frm取引先親にフィルターはかけないのか?
      かけるならどこでどのタイミングでかけているのか?
 
 
[frm取引先親]
 レコードソース: mtb取引先親
  オプショングループ: フレーム?
    更新後処理でジャンルでフィルターをかける
    何にフィルターをかけるのか?
     サブフォーム(frm取引先子)?それとも 自分自身(frm取引先親)
  
 
  サブフォームの設定
  ソースオブジェクト:frm取引先子
  リンク親フィールド:取引先スペックID
  リンク子フィールド:取引先スペックID
 
 
[frm取引先子]
 レコードソース: ある選択クエリ?、または、mtb取引先子? mtbジャンル?
     ある選択クエリの場合、具体的にどのようなクエリなのか?
     SQLを提示するとわかりやすい

投稿日時: 26/04/02 21:44:12
投稿者: ekane

hatena様
ありがとうございます。
hatena様にも再びお手数をかけてしまいますので無視して頂いて結構です
一言(もっと勉強しろ)等のコメントがあるだけで嬉しいです
 
引用[frm顧客検索]
 レコードソース: mtb取引先親
  オプショングループ: フレーム97
  オプションボタン配置
   更新後処理で自身にフィルターをかける(Me.Filter利用)
   frm取引先親にフィルターはかけないのか?

   申し訳ありません このフォームは取引先検索(フィルター利用)フォームです
   レコードソースは mtb取引先親になっております
   このフォームヘッダーにフレーム97を設け、「あーん」までのオプションボタンを設けて
        あります
 かけるならどこでどのタイミングでかけているのか?
  そのフレーム97の更新後処理でフイルターをかけております、
  (例)「あ」のオプションボタンで「あ」のつく取引先一覧が 詳細の部分に絞り込まれ
  必要な「あいうえ商店」にあるコマンドボタンをクリックして(行ごとにコマンドボタンが
  表示されてあります)
  DoCmd.OpenForm "frm取引先スペック親", , , "取引先スペックID=" & Me!取引先スペックID
  にて frm取引先スペック親フォームの「あいうえ商店」を開きます(ここまでは出来ております)
 
 わからない ことは このfrm取引先スペック親フォームのヘッダー部分に2つ目の
  フレーム100にオプションボタン7個くらいを作り この表示された「あいうえ商店」の中で
  ジャンル別にフィルターをかけたいと思いますが1回目のフィルターと同じ式では最初のレコードに
  戻ってしまいフィルタが作用しないので悩んでいる次第であります
[frm取引先親]
  レコードソース: mtb取引先親
  オプショングループ: フレーム?
   更新後処理でジャンルでフィルターをかける
   何にフィルターをかけるのか?
   サブフォーム(frm取引先子)?それとも 自分自身(frm取引先親)

    サブフォーム(frm取引先子)です
 サブフォームの設定
   ソースオブジェクト:frm取引先子
 リンク親フィールド:取引先スペックID
 リンク子フィールド:取引先スペックID

      ハイそうです
 [frm取引先子]
  レコードソース: ある選択クエリ?、または、mtb取引先子? mtbジャンル?

    mtb取引先子になります
 ある選択クエリの場合、具体的にどのようなクエリなのか?
  SQLを提示するとわかりやすい

   申し訳ありませんSQL提示方法が私にはわかりかねます。
   長い文面で失礼しましたがこのような内容でわかりますでしょうか
   この度は誠にありがとうございました。
 

回答
投稿日時: 26/04/03 15:35:14
投稿者: hatena
投稿者のウェブサイトに移動

> hatena様にも再びお手数をかけてしまいますので無視して頂いて結構です
> 一言(もっと勉強しろ)等のコメントがあるだけで嬉しいです
 
回答者としては中途半端に終わるのは気持ち悪いのでなんとか解決したいという思いがあります。ですので遠慮しないでください。
 
>   必要な「あいうえ商店」にあるコマンドボタンをクリックして(行ごとにコマンドボタンが
>   表示されてあります)
>   DoCmd.OpenForm "frm取引先スペック親", , , "取引先スペックID=" & Me!取引先スペックID
>   にて frm取引先スペック親フォームの「あいうえ商店」を開きます(ここまでは出来ております)
 
なるほど、frm顧客検索のカレントレコードの取引先で絞り込んで取引先フォームを開くのですね。
 
>  わからない ことは このfrm取引先スペック親フォームのヘッダー部分に2つ目の
>   フレーム100にオプションボタン7個くらいを作り この表示された「あいうえ商店」の中で
>   ジャンル別にフィルターをかけたいと思いますが1回目のフィルターと同じ式では最初のレコードに
>   戻ってしまいフィルタが作用しないので悩んでいる次第であります
 
サブフォームのfrm取引先子に取引先の取扱商品の一覧が表示されている。
その商品一覧をオプショングループで選択したジャンルで絞り込みたいということですね。
であるのならフィルタをかける対象はfrm取引先子になります。
そして、frm取引先子はリンク親/子フィールドの設定で親フォームの取引先ですでに絞り込まれているので、frm取引先子のFilterにはジャンルの条件式だけを設定すればOKです。
 
親フォームかサブフォームを参照するには下記の書式になります。
 
Me.サブフォームコントロール名.Form
 
ちなみにサブフォーム名とサブフォームコントロール名は異なりますので注意が必要です。
 
サブフォームとサブフォームコントロールの違いとは?
https://hatenachips.blog.fc2.com/blog-entry-347.html
 
コード例

Private Sub フレーム100_AfterUpdate()
    Dim jyouken As String

    Select Case Me!フレーム100
    Case 1
        jyouken = "ジャンル = '野菜'"
    Case 2
        jyouken = "ジャンル = '果物'"
    Case 3
        jyouken = "ジャンル = 'その他'"
    End Select

    Me.埋込1.Form.Filter = jyouken
    Me.埋込1.Form.FilterOn = True

End Sub

「埋込1」の部分は実際のサブフォームコントロール名に変更してください。

投稿日時: 26/04/03 20:54:38
投稿者: ekane

 hatena様 お付き合いいただき感謝に堪えません
 
>サブフォームのfrm取引先子に取引先の取扱商品の一覧が表示されている。
>その商品一覧をオプショングループで選択したジャンルで絞り込みたいということですね。
>であるのならフィルタをかける対象はfrm取引先子になります。
>そして、frm取引先子はリンク親/子フィールドの設定で親フォームの取引先ですでに絞り込まれている
>ので、frm取引先子のFilterにはジャンルの条件式だけを設定すればOKです。
    ・そうでしたか ありがとうございます
    ・hatena様サイトは存じ上げておりますが私にはレベルが高い感じで敬遠していましたが
       わかりやすく説明してありこれから勉強させていただきます
    ・留意点も示していただき ありがとうございます
    ・コード例を見本に手直しして参ります
    ・直ぐに取り掛かれず2、3日かかると思いますが結果を報告させていただきます
     
     お手数をお掛けいたしました。
     この度も誠にありがとうございました。

投稿日時: 26/04/05 08:33:01
投稿者: ekane

hatena様
 
ありがとうございました。
お陰様で二回目のフィターも機能しました
    Me.mtb取引先スペック子.Form.Filter = jyouken
      Me.mtb取引先スペック子.Form.FilterOn = True
これで取引先、ジャンル別に絞り込みすることができ次の作業に進むことができます。
要点を得た説明でなかったためいろいろと手間をお掛けいたしました。
この度はお忙しいなかご指導いただき誠にありがとうございました、お付き合い頂き感謝申し上げます。
 
この場所でありますが
sk様
この度はありがとうございました厚く御礼申し上げます。