簡體   English   中英

訪問 VBA 下標超出范圍加載 DAO.Recordset

[英]Access VBA Subscript out of range loading DAO.Recordset

當我嘗試從 Access 查詢中加載和使用記錄集時,我看到不一致的結果並出現下標超出范圍錯誤。 我正在從這個查詢中加載:記錄源

這是我的代碼的相關部分:

Option Compare Database
Option Explicit

Function StoreStockoutEmail()
Dim objOutlook As Outlook.Application
   Dim objOutlookMsg As Outlook.MailItem
   Dim objOutlookRecip As Outlook.Recipient
   Dim dtStr As String
   Dim rstData    As DAO.Recordset
   Dim v  As Variant
   Dim i, j, k, x, y As Integer
   Dim mymsg As String

   mymsg = ""

    Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
    v = rstData.GetRows(rstData.RecordCount)
    If Not rstData.EOF And Not rstData.BOF Then
    rstData.MoveLast
    i = rstData.RecordCount
    rstData.MoveFirst


    MsgBox (v(0, 2))
   ...

MsgBox 是我得到運行時錯誤 9“下標超出范圍”的地方,但我的數據源的數據點位於 0,2(和 2,0)。 (我根據另一個答案添加了 EOF 和 BOF 運動,但沒有幫助。)我覺得這可能是一個錯誤,因為這對某些記錄集有效,而對其他記錄集無效。 適用於 Micosoft 365 32 位的 MS Access。 為 MS DAO 3.6 Object 庫添加了參考。 謝謝!

正如 Tim Williams 暗示的那樣,在您執行.MoveLast /.MoveFirst舞蹈之前, rstData.RecordCount可能不正確。 (見注2)

檢查rstData.EOF應該直接跟.OpenRecordset 在這里檢查.BOF是不必要的(貨物崇拜)。

所以代碼應該是:

Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
If Not rstData.EOF Then
    rstData.MoveLast
    i = rstData.RecordCount
    rstData.MoveFirst

    v = rstData.GetRows(i)

邊注:

   Dim i, j, k, x, y As Integer

這將所有內容聲明為 Variant,只有y將是 Integer。


筆記2:

我覺得這可能是一個錯誤,因為這對某些記錄集有效,而對其他記錄集無效。

這是設計使然。 Allen Browne 在 4. 中對其進行了解釋: http://allenbrowne.com/ser-29.html

對於基於查詢、SQL 語句和附加表的記錄集,RecordCount 屬性返回到目前為止訪問的記錄數。 當您第一次使用 OpenRecordset() 時,Access 會抓取第一條記錄,並在其他代碼加載時繼續處理您的代碼。
因此,如果您在 OpenRecordset 之后立即測試 RecordCount,您通常會得到 0(如果沒有記錄)或 1(如果有,無論加載多少。)
這不適用於 dbOpenTable 類型的記錄集(本地表的默認值。)

解決方案:

如果您需要知道 RecordCount,請先使用 MoveLast 方法。 這會強制 Access 在加載所有記錄時等待,因此 RecordCount 反映了整個記錄集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM