長時間的潛行者,但是第一次在這裏發佈海報,所以我爲任何社交失禮道歉。DLookup用來返回第一個值的記錄順序(Access VBA)
我想使用DLookup在使用VBA的表中搜索記錄。我之後的特定記錄是與sdate(用戶指定的日期)最接近的記錄,它也符合其他一些條件。在sdate之前可能會有一些符合相同標準的記錄,而我只對時間上與sdate最接近的記錄感興趣。
以下是我用來嘗試實現此目的的代碼的簡化示例。我使用baseTestString,因爲有很多類似的DLookup表達式,所以它可以節省輸入並稍微澄清代碼(至少對我來說)。
DoCmd.OpenTable ("Results")
DoCmd.SetOrderBy "[Survey_Date] Desc"
DoCmd.Close acTable, ("Results")
'set a new criteria for baseline testing using Dlookup
basetestString = "[Equipment_ID] = '" & equipID & "' AND [Baseline?] = True _
AND format([Survey_Date],""ddmmyyyy"") < format(" _
& sdate & ",""ddmmyyyy"")"
'set variables
[Forms]![results]![text_A] = Nz(DLookup("[Input]", "[results]", _
basetestString))
我相信(可能天真地)DLookup返回它找到的第一條匹配指定條件的記錄。因此,我的代碼旨在將表按時間順序排序,並認爲這將是DLookup在記錄中循環的順序。
但是,每次運行代碼時,我都會返回最低的匹配條件的日期,而不是最接近sdate的日期。在玩過一段時間之後,我相信DLookup會使用主鍵作爲循環記錄的基礎(先前輸入的日期較早,因此給出的主鍵使用的自動編號低於以後的日期)。
這導致了我,我的問題...
1)我在相信這是當我回到錯誤的記錄正在發生的事情是否正確?
2)有沒有辦法在我嘗試的方式使用DLookup?我可以選擇使用哪個字段來訂購DLookup的記錄嗎?將日期字段分配爲主鍵是不可能的,因爲日期可能並不總是唯一的。
3)有沒有其他方法可以實現我在這裏要做的事情?
非常感謝您
謝謝你Remou。我並不完全理解你的代碼在做什麼,因爲我仍然是Access的新手,但是你提到的DMax已經解決了我的問題。我的數據庫不會最終保存大量的數據,所以在這種情況下速度並不是什麼大問題。再一次,謝謝你。我已經選擇了你的答案作爲答案,但由於我還沒有足夠的聲望,我無法贊成你。 – m4rkb4