Squeak.ru - шаблоны программирования

UDF для вставки данных набора записей в VBA

По сути, мне удалось получить данные из базы данных в набор записей с помощью rs=db.openrecordset(sql). Как вставить данные в ячейку с помощью UDF? Кто-то предложил формулу массива. Тогда как мне изменить данные набора записей на массив? Я знаю, что могу использовать copyfromrecordset . Но он не работает в UDF.

Спасибо.

vba
17.02.2014

  • Можете ли вы предоставить фрагмент кода из UDF? Выдает ошибку? Вы просто хотите заполнить одну ячейку или пытаетесь вернуть набор данных из нескольких столбцов/строк? 17.02.2014
  • Чего я пытаюсь добиться, так это: я набираю =get_data() в диапазоне ячеек и нажимаю ctrl+shift+enter. данные должны быть вставлены в эти ячейки. Сейчас я делаю следующее: я использую метод getRows для изменения набора записей в 2D-массив, но по какой-то причине я могу получить только первую строку базы данных, sql правильный. 17.02.2014
  • Set db = OpenDatabase(DBFullName) Set rs = db.OpenRecordset(SELECT ID,Date,Price,CMF,Ticker FROM SGXIO_Database WHERE cmf между 0 и 43 И контракт между #1/1/1900# и #1/1/2099# И дата между #1/1/1900# и #1/1/2099# И цена не нулевая) Dim arr As Variant arr = rs.GetRows(rs.RecordCount) MsgBox (rs.RecordCount) 'bdd — имя функции bdd = arr Установить rs = Ничего db.Close Установить db = Ничего 17.02.2014
  • Да я вижу. Поскольку вам нужно несколько строк и столбцов, CopyFromRecordset должно работать нормально ... это то, что я всегда использую. Я чувствую, что здесь что-то упускаю. Вы хотите, чтобы разные запросы выполнялись в зависимости от того, в какую ячейку вы вставляете CSE функцию get_data()? 17.02.2014
  • Я использую пользовательскую функцию, которую я не должен использовать для управления любыми другими ячейками. Что я делаю сейчас, так это изменяю данные набора записей в формат массива и использую формулу массива для вызова моей функции. Я решаю большую часть этого, за исключением того, что после использования методов recordset.movelast и recordset.count и recordset.movefirst. Recordset.getrows возвращает только первую строку данных. 17.02.2014
  • Ok. Я думаю, что не могу использовать movelast в UDF. знак равно 17.02.2014
  • Возможно, вам придется перебирать каждую запись, а затем перебирать каждое поле набора записей и добавлять каждое значение в переменную массива по мере продвижения. Поскольку вы сделали .moveLast....moveFirst, чтобы получить количество записей, имеет смысл возвращать только первую запись. 17.02.2014

Ответы:


1

Это работает для меня с 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
17.02.2014
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...