2015-03-17 1 views
1

Я пытаюсь использовать ACE sql для возврата массива из набора записей. Эта функция хорошо работает с диапазонами таблиц.Excel UDF для возврата массива из набора записей ACE SQL

Задача: Функция возвращает правильное количество записей, если запрос возвращает 2 или более записей. Однако, если найдена только одна запись, все строки заполняются повторно одной этой строкой. Это неправильно, но я не могу найти причину.

Кроме того, я хочу, чтобы моя функция возвращала имена столбцов из Recordset. Я не знаю, как склеить его вместе с массивом, возвращаемым из набора записей.

Вот код, кредиты за счет автора другого решения, которое я пытаюсь приспособиться к моим потребностям: 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 

ответ

1

Если вы хотите, имена полей, вы должны будете через цикл массив из набора записей:

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 

например.

+0

спасибо, Rory. Это здорово! попробует. –

Смежные вопросы