Excel ACE SQL 记录集中的 return 数组的 UDF

Excel UDF to return array from ACE SQL recordset

我正在尝试使用 ACE sql 到记录集中的 return 数组。该函数适用于 table 个范围。

问题:如果查询returns 2条或更多条记录,函数returns正确的记录数。但是,如果只找到一条记录,则所有行都用这一行重复填充。这是错误的,但我找不到原因。

此外,我希望我的函数 return 来自 Recordset 的列名。我不知道如何将它与记录集中的 returned 数组粘合在一起。

这是代码,致谢归功于我试图适应我的需要的另一个解决方案的作者:Performing SQL queries on an Excel Table within a Workbook with VBA Macro

Function SQL(dataRange As Range, CritA As String) As Variant
Application.Volatile

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim currAddress As String

currAddress = ActiveSheet.Name & "$" & dataRange.Address(False, False)

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon


strSQL = "SELECT * FROM [" & currAddress & "]" & _
         "WHERE [A] =  '" & CritA & "'  " & _
         "ORDER BY 1 ASC"

rs.Open strSQL, cn

'SQL = rs.GetString
SQL = Application.Transpose(rs.GetRows)


Set rs = Nothing
Set cn = Nothing



End Function

如果您想要字段名称,您也必须从记录集中遍历数组:

With rs
    If Not .EOF Then
        vData = .getrows()

        ReDim vDataOut(LBound(vData, 2) To UBound(vData, 2) + 1, LBound(vData, 1) To UBound(vData, 1))
        ' get headers
        For i = 1 To .Fields.Count
            vDataOut(0, i - 1) = .Fields(i - 1).Name
        Next i
        ' Copy data
        For x = LBound(vData, 2) To UBound(vData, 2)
            For y = LBound(vData, 1) To UBound(vData, 1)
                vDataOut(x + 1, y) = vData(y, x)
            Next y
        Next x
    End If
End With

例如。