2017-05-14 73 views
1

我想通過「切斷」前5個條目來重新定義一維數組,因爲它們必須被刪除以用於以後的邏輯。一維數組的ReDim會拋出'下標超出範圍'

  1. 我創建從查詢
  2. 設定的記錄予填充陣列記錄()作爲變體(大小爲147)。 現在:sizeSet = daoRst3的大小
  3. 我嘗試刪除數組recordset的前五個元素。

代碼:

Set daoRst3 = gDB.OpenRecordset("SELECT * FROM TEST") 

For i = 0 To daoRst3.Fields.Count - 1 
ReDim Preserve recordSet(0 To i) 
If daoRst3.Fields(i).Value = Empty Then 
    recordSet(i) = 0 
Else: recordSet(i) = daoRst3.Fields(i).Value 
End If 
Next 

'First five values in record set are not needed anymore. 
ReDim Preserve recordSet(5 To i - 1) 

最後一行

ReDim Preserve recordSet(5 To i - 1) 

拋出 「下標超出範圍」。我已經調試過,現在我是148。

可能是什麼問題?

非常感謝提前!

+0

無論如何,你是在誤解Redim。即使成功,'Redim(5到10)'也不會刪除前5個條目,但它會從最後切換並更改索引基礎。 –

回答

0

好吧,這次我知道了......

Private Sub this() 

    Dim rs As DAO.Recordset 

    Set rs = CurrentDb.OpenRecordset("SELECT * FROM tmpCardList") 

    Dim msg As String 
    Dim myArray() As String 
    Dim array2() As String 
    ReDim array2(0 To rs.Fields.Count - 1) 
    Dim i As Long 

    For i = 0 To rs.Fields.Count - 1 
     Debug.Print ; rs.Fields(i).Name 
     array2(UBound(array2, 1) - i) = rs.Fields(i).Name 
    Next i 

    ReDim Preserve array2(UBound(array2) - 5) 
    ReDim myArray(0 To UBound(array2, 1)) 

    For i = 0 To UBound(array2, 1) 
     myArray(UBound(array2, 1) - i) = array2(i) 
    Next i 

    rs.Close 
    Set rs = Nothing 

End Sub 

原來你寫你自己定製的東西給數組排序。一點額外的箍。剛剛意識到最終的輸出是相反的,但你可以通過複製我的初始反轉邏輯輕鬆地「撤消」。

最終編輯 - 這次用較少的打字 - WOOHOO

+0

謝謝!但現在,recordSet是Variant(0到142),這是好的,但似乎最後五個元素已從數組中刪除,而不是第一個(從recordSet(0),recordSet(1)開始計算)在 – mffm

+0

多數民衆贊成在奇怪的。我不能解釋爲什麼它正在做的B/C我的測試我寫了這個問題的工作正確的編寫我的答案,告訴你我用什麼 –

+0

實際上打開訪問並使用您的代碼嘗試和找到一個解決方案爲您BRB –