Это работает для меня с Excel 2003, ADO 2.8:
Function getArray(strSql As String) As Variant
Dim rs As ADODB.Recordset
Dim i As Integer
getArray = ""
Set rs = getRs(strSql)
With rs
.MoveFirst
Do
For i = 0 To .Fields.Count - 1
getArray = getArray & CStr(.Fields(i).Value) & " "
Next i
getArray = getArray & vbLf
.MoveNext
Loop Until .EOF = True
.Close
End With
Set rs = Nothing
End Function
Он перебирает все строки/полей записей и возвращает «массив» значений. Он может использоваться как функция книги без CSE.
Это, как я делаю мое подключение к БД:
Function getRs(strSql As String) As ADODB.Recordset
Dim strCn As String
strCn = "Provider=sqloledb;Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI;"
Set getRs = New ADODB.Recordset
getRs.Open strSql, strCn, adOpenStatic, adLockReadOnly
End Function
И это пример того, как я мог бы получить некоторые данные, используя getArray()
на основе критериев, из одной клетки и возвращать результаты в другой (одиночный).
Function getEmpDataByLastName(strLastName As String) As Variant
Dim strSql As String
strSql = ""
strSql = strSql & "SELECT BusinessEntityID, PersonType, FirstName, COALESCE(MiddleName,'') AS MiddleName "
strSql = strSql & "FROM Person.Person "
strSql = strSql & "WHERE LastName = '" & strLastName & "' "
strSql = strSql & "ORDER BY FirstName "
getEmpDataByLastName = getArray(strSql)
End Function
Можете ли вы предоставить фрагмент кода из UDF? Вызывает ли ошибка? Вы просто хотите заполнить одну ячейку или пытаетесь вернуть набор данных с несколькими столбцами/строками? –
То, что я пытаюсь достичь, это то, что: i type = get_data() в диапазоне ячеек и нажмите ctrl + shift + enter. данные должны быть вставлены в эти ячейки. То, что я делаю сейчас, это то, что: я использую метод getRows для изменения набора записей в 2D-массив, но по какой-то причине я могу получить только первую строку базы данных, sql правильный. –
Установить db = OpenDatabase (DBFullName) Установите rs = db.OpenRecordset («SELECT ID, Date, Price, CMF, Ticker FROM SGXIO_Database WHERE cmf Между 0 И 43 И контракт между # 1/1/1900 # И # 1/1/2099 # И Date Between # 1/1/1900 # И №1/1/2099 # И цена не равно нулю ") дим обр Как вариант обр = rs.GetRows (rs.RecordCount) MsgBox (rs.RecordCount) «BDD является имя функции bdd = arr Set rs = Nothing db .Закрыть Установить db = Nothing –