私の推測では、空でない.Filter
プロパティを変更または削除しようとすると、Access はデータ プロバイダーからフォームのレコードセットを再読み込みしようとします。切断されたレコードセットにはプロバイダーがないため、その試行は失敗します。私のテストでは、ある時点でエラー #31「データ プロバイダーを初期化できませんでした」が発生しました。
最初の試行 (成功) では、.Filter
プロパティは事前に空でした。私は同じ動作.Filter
を確認しました.Access は、データ プロバイダーに再度アクセスすることなく、フィルター処理されていないレコードセットに a を適用できると推測しています。
推測ですみません。残念ながら、これが私が説明できる最善の方法です。
.Filter
とにかく、フォームのプロパティを使用して目的を達成することをあきらめました。句に.Filter
文字列を含むクエリに基づいて、切断されたレコードセットを単純に再読み込みする方が簡単であることがわかりました。WHERE
コードの変更はわずかで、実行時のパフォーマンス コストはごくわずかです。コンボ ボックスの選択を変更すると、リロードされたレコードセットが即座に表示されます。
最初に、切断されたレコードセットを構築するコードをForm_Open
、シグネチャが ... である別の関数に移動しました。
Private Function GetRecordset(Optional ByVal pFilter As String) _
As ADODB.Recordset
この関数は、切断されたレコードセットをフィードするクエリの句に空でないpFilter
引数を組み込みます。WHERE
SELECT
それから私はForm_Open
一つの声明に変わりました...
Set Me.Recordset = GetRecordset()
したがって、コンボ ボックスと切断されたレコードセットが両方とも同じフォーム上にある場合、コンボの更新後の手順は次のようになります。
Private Sub Combo_PickClient_AfterUpdate()
Set Me.Recordset = GetRecordset("Client='" & _
Me.Combo_PickClient & "'")
End Sub
私の場合、切断されたレコードセットはサブフォームに表示され、コンボ ボックスはその親フォームにあります。そこで、サブフォーム コード モジュールでラッパー プロシージャを作成し、それをコンボの After Update から呼び出します。
Call Me.SubFormControlName.Form.ChangeRecordset("Client='" & _
Me.Combo_PickClient & "'")
ラッパーの手順は非常に単純ですが、便利だと思いました...
Public Sub ChangeRecordset(Optional ByVal pFilter As String)
Set Me.Recordset = GetRecordset(pFilter)
End Sub