Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在Excel VBA函数中返回记录数组?_Arrays_Excel_Vba - Fatal编程技术网

Arrays 如何在Excel VBA函数中返回记录数组?

Arrays 如何在Excel VBA函数中返回记录数组?,arrays,excel,vba,Arrays,Excel,Vba,考虑下面的代码。如何在下面的方法中返回多维数组 My SQL语句返回以下内容: +-----+-------------+ | id | description | +-----+-------------+ | 111 | AAA-11 | | 222 | BBB-2222 | +-----+-------------+ GetOrder仅返回第一行。我希望数组包含所有行。当我使用GetOrder(I)时,我认为我应该如何填充数组,我得到一个错误“ByRef参数类型不匹配”

考虑下面的代码。如何在下面的方法中返回多维数组

My SQL语句返回以下内容:

+-----+-------------+
| id  | description |
+-----+-------------+
| 111 | AAA-11      |
| 222 | BBB-2222    |
+-----+-------------+
GetOrder
仅返回第一行。我希望数组包含所有行。当我使用
GetOrder(I)
时,我认为我应该如何填充数组,我得到一个错误“ByRef参数类型不匹配”。我的返回类型是
Variant
,我认为应该包括数组类型。当我将函数return改为Array时,我得到了另一个错误,这使我认为这是错误的追求方向

如何返回一个没有错误的记录数组

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

您正在使用循环的每次迭代重新创建
数组。因此,函数将从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

您正在使用循环的每次迭代重新创建
数组。因此,函数将从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
你可以用,你可以用。