Microsoft Access 掲示板

サブフォームコントロールのフィルタメソッド

9 コメント
views
4 フォロー

お世話になります。

続けてもう1点お願いいたします。

仕様
①メインフォーム上に複数のテキストボックス・コンボボックスが配置されている。
②メインフォーム上には、タブコントロールがあり、このタブ上に複数のサブフォームコントロールが配置されている。
 サブフォームコントロール名は、「"SubForm"  & タブのページNo」の命名規則
③①のコントロールの更新後処理で、該当するタブコントロールの中のサブフォームコントロールのデータを絞り込む

この時に、まれに実行時エラー(プロパティが不正?)が出る時があり、
フォームを一旦閉じて開きなおさないと動きません。
※すみません、コードは修正していないのですが、今のところ安定稼働していて正確なエラーメッセージがお伝えできません。

このような状況から、何か考えられる要因がありますでしょうか?

'********************
フォームモジュール
'
********************
'メインフォーム上のテキストボックス(サブフォームコントロールの抽出条件)
Private Sub 氏名_AfterUpdate()

    'フィルタ実行
    Call buildWhereContition()

    '画面再表示
    Me("subForm").Form.Requery

End Sub
'********************
ユーザー定義関数
'
********************
Private Function buildWhereContition()

    strWhereCondition = ""

    'タブコントロール
    myTab = myForm![タブ].Value

    If Len(Trim(Nz(Me![氏名]))) > 0 Then

        If Len(Trim(Nz(strWhereCondition))) > 0 Then
            strWhereCondition = strWhereCondition & " and 氏名='" & Me[氏名] & "'"
        Else
            strWhereCondition = "氏名='" & Me![氏名] & "'"
        End If

    End If

    '抽出条件文字列がある場合はタブコントロール内にあるサブフォームコントロールにフィルタ設定
    If Len(Trim(Nz(strWhereCondition))) > 0 Then

        Me("subForm" & myTab).Form.Filter = strWhereCondition
        Me("subForm" & myTab).Form.FilterOn = True・・・・・・・・・・・実行時エラーが出る可能性がある

    '抽出条件文字列がない場合はフィルタ解除
    Else

        Me("subForm" & myTab).Form.FilterOn = False

    End If
'***********************

End Function

けんたろー
作成: 2019/09/20 (金) 13:11:21
通報 ...
1
けんたろー 2019/09/20 (金) 13:29:10 a63a9@6eac5

追記

実行時エラーは、
このオブジェクトは、このプロパティまたはメソッドをサポートしていません。
だったと思います。

2

このコードが実際のもとだとすると、エラーで実行できないはず。

また、無駄が多いコードなので、とりあえず下記のように書き直して、試してみてください。

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
3
けんたろー 2019/09/20 (金) 14:14:07 a63a9@6eac5

すみません、実際のコードではないです。
多少、書き換えています。

なるほど、サブフォームを先に取得するところは直します。

冗長を簡素化しただけにみえますので、
実行時エラーが稀に発生するという根本的な解決には至っていないという理解で間違ってなきでしょうか?

ひとまずは修正したものを正としてテストを進めます。

4
けんたろー 2019/09/20 (金) 14:17:32 a63a9@6eac5

標準モジュールに書いていた関数をフォームモジュールといて、投稿しながら書き換えました。

5

実際のコードを提示していただかないと、間違いの原因を指摘するのは困難です。

普段は成功して、ある時、エラーになるなら、その時の条件値など、具体的な発生条件を調べる必要があります。

この作業はこちらからは無理です。

6
けんたろー 2019/09/20 (金) 18:43:17 a63a9@6eac5

仰る通りかとは思いますが、フイルタの条件には問題がある可能性は極めて低いと考えています。実行時エラーが出た時のWhere句をクエリのSQLビューに貼り付けて、from句を付して実行すると正しく動きました。

であるとすれば、問題の切り分けとしては、タブコントロールを何度も切り替えながら、データ抽出する過程で、タイミング動きがおかしくなる可能性があるのではいかと、私自身は想像しています。

ですので、カレントのタブコントロールにはアーカスを移動してフィルタを掛けたりなどのトライはしてみました。

でも、これでも解決はしていません。

もう少しテストして、問題の切り分けをしてみます。

7

提示されいるコードの抽出条件は、氏名だけですが、もし、そうなら、VBAを書かなくても、
サブフォームコントロールのプロパティのリンク親フィールド、リンク子フィールドに「氏名」と設定するだけで、
抽出できます。

それだとエラーは出ないと思いますが、どうでしょうか。

8
けんたろー 2019/09/21 (土) 12:19:19 a63a9@6eac5

一番初めの仕様でもお書きした通り、フォーム上に抽出フィールドは、フォームによりことなりまず、およそ7〜10個程度あります。これを標準化するため、抽出条件文字列のビルドは、標準モジュールに定義した関数に、サブフォームを引数として渡して処理する仕様としています。

丸一日、どんなに使っていてもエラーが出ないこともありますし、出だすとちょいちょい出ることもあります。どういうケースでそうなるのかが特定できていません。

ですので、タイミングの問題に起因するのではないかと想像しているところです。

9

標準モジュールに定義した関数に、サブフォームを引数として渡して処理する仕様としています。

そんな仕様どこに書いてあります?
標準モジュールの関数もどこに提示されてますか?

投稿no.5

標準モジュールに書いていた関数をフォームモジュールといて、投稿しながら書き換えました。

あっ、このことね。
提示されいてるコードを元に回答していますので、途中で変更されても。

提示されていないコードに関してのエラーがどうのこうのと言われても、エスパーでないので、
回答不能です。