Как вернуть массив записей в функции Excel VBA?

#arrays #excel #vba

Вопрос:

Рассмотрим код ниже. Как я могу вернуть многомерный массив в приведенном ниже методе?

Моя инструкция SQL возвращает это:

  ----- ------------- 
| id  | description |
 ----- ------------- 
| 111 | AAA-11      |
| 222 | BBB-2222    |
 ----- ------------- 
 

GetOrder возвращает только первую строку. Я хочу, чтобы массив содержал все строки. Когда я использую GetOrder(i) , как я думаю, я должен заполнить массив, я получаю ошибку «Несоответствие типа аргумента ByRef». Мой возвращаемый тип Variant , который, я думаю, должен охватывать тип массива. Когда я изменяю функцию return на массив, я получаю еще одну ошибку, которая заставляет меня думать, что это неправильное направление.

Как я могу вернуть массив записей без ошибок?

 Function GetOrder(OrderNo As Long) As Variant

Const CONN = "DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=;DATABASE=;UID=;PWD=; OPTION=3"

Const SQL = "select * from items where category_id = ?"

Dim dbConn As ADODB.connection, dbCmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim param As ADODB.Parameter, n As Long

Set dbConn = New ADODB.connection
dbConn.Open CONN

Set dbCmd = New ADODB.Command
With dbCmd
    .ActiveConnection = dbConn
    .CommandType = adCmdText
    .CommandText = SQL
    Set param = .CreateParameter("P1", adInteger, adParamInput, 0)
    .Parameters.Append param
End With

Set rs = dbCmd.Execute(n, OrderNo)

Dim i As Integer
i = 0
Do While Not rs.EOF
   GetOrder = Array(rs(0).Value, rs(1).Value) ' I want GetOrder to be an array of records
   rs.MoveNext
   i = i   1
Loop
   
dbConn.Close

End Function
 

Комментарии:

1. Вы можете использовать метод GetRows .

Ответ №1:

Вы воссоздаете Array его с каждой итерацией цикла. Таким образом, функция возвращает последнюю запись из набора записей SQL. Попробуйте что-нибудь вроде этого:

 Dim results As Variant
Redim results(1 to rs.Recordcount, 1 to rs.Fields.Count)
Dim i As Long
Dim j As Long
i = 1
Do While Not rs.EOF
    For j = 1 To rs.Fields.Count
        results(i, j) = rs(j - 1).Value
    Next j
    i = i   1
Loop
dbConn.Close
GetOrder = results