フィルタリングと並べ替えで表示されるのは、ADO レコードセットの既知の制限です。
このページにリストされている ADO Cons のリストを見てください。一番下にあるものに注目してください:
http://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO
MS のサポート サイトでこれに関するドキュメントを見つけることができなかったので、これがバグなのか、単に制限なのかはわかりません。私は後者だと推測しています。
参考までに、MS は基本的に ADO (クラシック) を忘れていると思います。MDAC (ADO の入手方法) の最後のリリースは 2005 年 5 月 10 日でした。
この問題の回避策として、この機能を試すことができます。フィルター処理され、並べ替えられた新しいレコードセットを返します。大きな完全なレコードセットを手元に置いておき、ソート/フィルターを実行するたびにこの関数を使用して新しいレコードセットを取得してください。これにより、全体的なリソース使用量、特にメモリが増加します。
私はこの機能を使用しましたが、あらゆる点で防弾であることを確認するために十分にテストされていません. バグや制限をすぐに見つけることができます。私は実際に何らかの作業が必要であるというメモを持っていましたが、私のメモは不明確でした。今はテストする時間がありませんでした.本番コードでこの関数を使用していることがわかったので、機能していると思います.
Public Function GetFilteredRecordset(ByRef rsSource As ADODb.Recordset, _
ByVal sWhere As String, _
Optional ByVal sOrderBy As String, _
Optional ByVal LockType As ADODb.LockTypeEnum = adLockUnspecified) As ADODb.Recordset
Dim sOriginalOrderBy As String
sOriginalOrderBy = rsSource.Sort
Dim F As ADODb.Field
For Each F In rsSource.Fields
'Debug.Print F.Name
Next F
rsSource.Filter = sWhere
If sOrderBy <> "" Then
If Left(LCase(sOrderBy), 8) = "order by" Then sOrderBy = Trim(Right(sOrderBy, Len(sOrderBy) - 8))
rsSource.Sort = sOrderBy
End If
Dim rsF As ADODb.Recordset
Dim objStream As ADODb.Stream
'Create a New ADO 2.5 Stream object
Set objStream = New ADODb.Stream
'Save the Recordset to the Stream object in XML format
rsSource.Save objStream, adPersistXML
'Create an exact copy of the saved Recordset from the Stream Object
Set rsF = New ADODb.Recordset
rsF.Open objStream, , , LockType
rsSource.Filter = ""
rsSource.Sort = sOriginalOrderBy
'Close and de-reference the Stream object
objStream.Close
Set objStream = Nothing
Set GetFilteredRecordset = rsF
End Function
ADO レコードセットのフィルタリングに関するもう 1 つの奇妙な制限は、OR キーワードが常に最上位にある必要があることです。上記のリンクにも記載されていますが、例が正確かどうかはわかりません。