お世話になります。
続けてもう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
追記
実行時エラーは、
このオブジェクトは、このプロパティまたはメソッドをサポートしていません。
だったと思います。
このコードが実際のもとだとすると、エラーで実行できないはず。
また、無駄が多いコードなので、とりあえず下記のように書き直して、試してみてください。
すみません、実際のコードではないです。
多少、書き換えています。
なるほど、サブフォームを先に取得するところは直します。
冗長を簡素化しただけにみえますので、
実行時エラーが稀に発生するという根本的な解決には至っていないという理解で間違ってなきでしょうか?
ひとまずは修正したものを正としてテストを進めます。
標準モジュールに書いていた関数をフォームモジュールといて、投稿しながら書き換えました。
実際のコードを提示していただかないと、間違いの原因を指摘するのは困難です。
普段は成功して、ある時、エラーになるなら、その時の条件値など、具体的な発生条件を調べる必要があります。
この作業はこちらからは無理です。
仰る通りかとは思いますが、フイルタの条件には問題がある可能性は極めて低いと考えています。実行時エラーが出た時のWhere句をクエリのSQLビューに貼り付けて、from句を付して実行すると正しく動きました。
であるとすれば、問題の切り分けとしては、タブコントロールを何度も切り替えながら、データ抽出する過程で、タイミング動きがおかしくなる可能性があるのではいかと、私自身は想像しています。
ですので、カレントのタブコントロールにはアーカスを移動してフィルタを掛けたりなどのトライはしてみました。
でも、これでも解決はしていません。
もう少しテストして、問題の切り分けをしてみます。
提示されいるコードの抽出条件は、氏名だけですが、もし、そうなら、VBAを書かなくても、
サブフォームコントロールのプロパティのリンク親フィールド、リンク子フィールドに「氏名」と設定するだけで、
抽出できます。
それだとエラーは出ないと思いますが、どうでしょうか。
一番初めの仕様でもお書きした通り、フォーム上に抽出フィールドは、フォームによりことなりまず、およそ7〜10個程度あります。これを標準化するため、抽出条件文字列のビルドは、標準モジュールに定義した関数に、サブフォームを引数として渡して処理する仕様としています。
丸一日、どんなに使っていてもエラーが出ないこともありますし、出だすとちょいちょい出ることもあります。どういうケースでそうなるのかが特定できていません。
ですので、タイミングの問題に起因するのではないかと想像しているところです。
そんな仕様どこに書いてあります?
標準モジュールの関数もどこに提示されてますか?
投稿no.5
あっ、このことね。
提示されいてるコードを元に回答していますので、途中で変更されても。
提示されていないコードに関してのエラーがどうのこうのと言われても、エスパーでないので、
回答不能です。