Добавление VBA в массив во время выполнения - PullRequest
3 голосов
/ 25 мая 2011

Я пытаюсь создать массив int во время выполнения из результатов набора записей.

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)

Ответы [ 3 ]

8 голосов
/ 25 мая 2011
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
6 голосов
/ 25 мая 2011

Когда мне нужно скопировать из набора записей в массив, немного эффективнее переопределить массив до нужного вам размера, чем переопределять его внутри цикла.

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
1 голос
/ 25 мая 2011

Когда я делаю VBA в Excel, у меня есть класс, который я использую для доступа к БД, у меня есть функция, которая возвращает набор записей в массив.Надеюсь, что ниже поможет.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...