2011-05-25 110 views
3

我想在運行時從記錄集的結果創建一個int數組。VBA在運行時添加到陣列

Do While Not rstSearchResult.EOF 

If rstSearchResult(ID) = blah Then 
    'Add this Id rstSearchResult(ID) to Array 
End If 

Call rstSearchResult.MoveNext() 
Loop 

我需要的是一個相同的結果,因爲這會給我Array(35588, 35589, 35595)

+0

你目前的代碼產生了什麼? – 2011-05-25 14:22:56

+0

我不知道有多少數字符合條件,所以如何將數組添加到沒有上限的數組中。這就是我的問題 – shad 2011-05-25 14:40:51

回答

7
Dim myIntArray() as Integer 
Dim intDimension as Integer 

intDimension = 0 

Do While Not rstSearchResult.EOF 

If rstSearchResult(ID) = blah Then 
    'Add this Id rstSearchResult(ID) to Array 
    REDIM PRESERVE myIntArray(intDimension) 
    myIntArray(intDimension) = rstSearchResult(ID) 
    intDimension = intDimension +1 
End If 

Call rstSearchResult.MoveNext() 
Loop 
+0

這應該工作,只需注意,隨着數組變大,它變成一個巨大的內存豬。 – 2011-05-25 14:49:08

+0

結果將不會超過100個ID的感謝ray023 – shad 2011-05-25 14:51:42

+0

無論如何,問題不是內存佔用。問題是現在這是一個O(n^2)算法,因爲您在每次迭代時將數組複製到一個新數組中。 – Tmdean 2011-05-25 17:32:02

1

當我做VBA在Excel中我有一個類我使用的DB在其訪問我有一個返回記錄集的功能到一個數組。希望下面的幫助。

Public Function RSToArray(ByVal oRS, Optional ByVal iRows, Optional ByVal iStart, Optional ByVal aFieldsArray) 
    If iRows = 0 Then iRows = adGetRowsRest 
    If iStart = 0 Then iStart = adBookmarkfirst 

    RSToArray = "" ' return a string so user can check For (IsArray) 

    If IsObject(oRS) And oRS.State = adStateOpen Then 
     If Not oRS.BOF And Not oRS.EOF Then 
      If IsArray(aFieldsArray) Then 
       RSToArray = oRS.GetRows(iRows, iStart, aFieldsArray) 
      Else 
       If iRows <> adGetRowsRest Or iStart <> adBookmarkfirst Then 
        RSToArray = oRS.GetRows(iRows, iStart) 
       Else 
        RSToArray = oRS.GetRows() 
       End If 
      End If 
     End If 
    End If 
End Function 
6

當我需要從一個記錄複製到一個數組,它是多一點點高效REDIM你想要的數組的大小,而不是事先就ReDiming內循環的。

Dim myIntArray() as Integer 
Dim intDimension as Integer 

rstSearchResult.Filter = "ID = " & blah 
ReDim myIntArray(rstSearchResult.RecordCount - 1) 

intDimension = 0 
Do Until rstSearchResult.EOF 
    myIntArray(intDimension) = rstSearchResult!ID 
    intDimension = intDimension + 1 
    rstSearchResult.MoveNext 
Loop 

請注意,爲了使RecordCount工作,您需要將記錄集打開爲靜態。

rstSearchResult.Open "tblSearchResult", cnn, adOpenStatic 
+0

ReDim在循環之外是有意義的。所以我ReDim在循環之前一次到記錄集的大小,並且在結尾再次調整數組的大小以匹配結果的數量。謝謝Tmdean – shad 2011-05-26 11:45:43

+0

這也是一個好方法。 – Tmdean 2011-05-26 16:42:19