recordset.find 使用变量 VBA ADODB

recordset.find using variable VBA ADODB

我非常渴望让这个微不足道的搜索工作:

 rst2.Find "ID = '" & messID & "'"

我几乎尝试过任何组合,但从来没有 returns 搜索结果。整个代码将在这里:

Option Compare Database
Option Explicit

'Modul zum Updaten des Status eines Messmittels in der Stammdatenbank (Entnommen/Verfügbar)3

Public Function updateStatus()

Dim rst2 As ADODB.Recordset
Dim rst As ADODB.Recordset
Dim messID As String

Set rst = New ADODB.Recordset 'Stammdaten zur Bearbeitung öffnen
            rst.ActiveConnection = CurrentProject.AccessConnection
            rst.CursorType = adOpenKeyset
            rst.LockType = adLockOptimistic
            rst.Open "Stammdaten"
            rst.MoveFirst

Set rst2 = New ADODB.Recordset 'zur Bearbeitung öffnen
            rst2.ActiveConnection = CurrentProject.AccessConnection
            rst2.CursorType = adOpenKeyset
            rst2.LockType = adLockOptimistic
            rst2.Open "Verwendung"

Do While Not rst.EOF
            messID = rst!ID
            Debug.Print messID
            rst2.Find "ID = '" & messID & "'"
            If rst2.EOF = True Then 'Falls nicht vorhanden
                Debug.Print "Keine Verwendung gefunden!"
            Else
                rst2.Sort = "Nr DESC"
                rst2.MoveFirst
                Debug.Print rst2!Status
            End If
            rst.MoveNext
Loop
rst.Close
rst2.Close

End Function

我错过了什么?我真的尝试了数百个不同的搜索字符串:(

您有一个 table-type 记录集,并且您正在按键搜索它。这是 Seek 方法而不是 Find 方法的典型 use-case。

据此:https://support.microsoft.com/en-us/kb/108149

The find methods (FindFirst, FindLast, FindNext, and FindPrevious) apply to Dynasets and Snapshots but not to Table objects. Conversely, the Seek method is available only on the Table object.

尽管该页面似乎更关注 DAO 而不是 ADO,但同样的逻辑应该适用于这两种情况。

我认为你应该尝试 Seek 方法 https://msdn.microsoft.com/en-us/library/ms675109(v=vs.85).aspx

rst2.Seek "=", messID
If rst2.NoMatch Then ' not found ...

我不经常使用ADO,但我有2个想法都不是很优雅-

1) Application.WorksheetFunction.Transpose(rst2.GetRows)(确保首先使用 .MoveLast.MoveFirst)获取记录集数组,然后您可以遍历该数组以找到您正在查找的 ID对于...

2) 同样的想法,只是在记录集中做...

此外,正如其他人之前提到的那样,新查询肯定会为您提供所需的值...

希望这对您有所帮助, TheSilkCode

我知道这已经过时了,但我遇到了同样的问题并解决了。问题是记录集的指针不在 BOF 中,因此它找不到我要查找的值,因为它是指针的当前位置 "above"。 .Find 不会循环搜索整个记录集。

我通过在 .Find 行之前添加 rs.moveFirst 解决了这个问题。这解决了问题。