VBA在运行时添加到数组

VBA在运行时添加到数组,vba,vb6,vbscript,Vba,Vb6,Vbscript,我试图在运行时根据记录集的结果创建一个int数组 Do While Not rstSearchResult.EOF If rstSearchResult(ID) = blah Then 'Add this Id rstSearchResult(ID) to Array End If Call rstSearchResult.MoveNext() Loop 我需要的是相同的结果,因为这将给我数组(35588,35589,35595)当我在excel中执行VBA时,我有一个用于访问

我试图在运行时根据记录集的结果创建一个int数组

Do While Not rstSearchResult.EOF

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

 Call rstSearchResult.MoveNext()
Loop

我需要的是相同的结果,因为这将给我
数组(35588,35589,35595)

当我在excel中执行VBA时,我有一个用于访问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
公共函数RSToArray(ByVal oRS、可选ByVal iRows、可选ByVal iStart、可选ByVal AFieldArray)
如果iRows=0,则iRows=adGetRowsRest
如果iStart=0,则iStart=adbookmark
RSToArray=“”返回一个字符串,以便用户可以检查(IsArray)
如果IsObject(oRS)和oRS.State=adStateOpen,则
如果不是oRS.BOF和oRS.EOF,则
如果是IsArray(aFieldsArray),则
RSToArray=oRS.GetRows(iRows、iStart、AFieldArray)
其他的
如果iRows adGetRowsRest或iStart ADBOCKMARK先启动,则
RSToArray=oRS.GetRows(iRows、iStart)
其他的
RSToArray=oRS.GetRows()
如果结束
如果结束
如果结束
如果结束
端函数

当我需要从记录集复制到阵列时,将阵列重新分配到您想要的大小比在循环中重新分配要高效一些

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

您当前的代码生成什么?我不知道有多少个数字与条件匹配,因此如何添加到没有上限的数组中。这是我的问题。这应该行得通,只需注意,当数组变大时,它会变成一个巨大的内存占用器。无论如何,问题不是内存占用。问题是,这现在是一个O(n^2)算法,因为每次迭代都要将数组复制到一个新数组中。在循环之外重新定义是有意义的。因此,我在循环之前将其重拨一次到记录集的大小,然后在循环结束时再次将数组的大小调整到匹配结果的大小。谢谢你,迪恩
rstSearchResult.Open "tblSearchResult", cnn, adOpenStatic