VBA SQL-запрос к диапазону - PullRequest
0 голосов
/ 09 мая 2019

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

Здравствуйте, я хочу сделать запрос к sql без необходимости определять диапазон в параметрах функции, то есть:

Range ("A1") = sqlQuery ("DSN = myODBC;", "SELECT * FROM Table1", TodaLaConsulta)

При выполнении этой строки я загружаю только одну запись из этого диапазона, и мне нужна вся таблица, код:

Private Enum TipoConsulta
    SoloUnRegistro = 1
    TodaLaConsulta = 2
    EjecutarQuery = 3
    GuardarArray = 4
End Enum

Private Function sqlQuery(ByVal CadenaCnx As String, ByVal Consulta As String, ByVal Tipo As TipoConsulta) As Variant

    Dim Cnx As New ADODB.Connection   'Connection
    Dim RecSet As New ADODB.Recordset   'Recordset

    Cnx.Open CadenaCnx

    Select Case Tipo
        Case TipoConsulta.SoloUnRegistro

            RecSet.Open Consulta, Cnx
            sqlQuery = RecSet(0)    'JUST ONE RECORD

        Case TipoConsulta.TodaLaConsulta
            RecSet.Open Consulta, Cnx
            'HERE I WANT THE RESULTING QUERY TO MY DESTINY RANGE WITHOUT DEFINE IT IN MY FUNCTION, I MEAN... CAN I CALL THE DESTINY RANGE??
            Range.CopyFromRecordset RecSet

        Case TipoConsulta.EjecutarQuery
            Cnx.Execute Consulta    'EXECUTE

        Case TipoConsulta.GuardarArray
            RecSet.Open Consulta, Cnx   'TO ARRAY
            sqlQuery = RecSet.GetRows

    End Select

    RecSet.Close
    Cnx.Close

    Set RecSet = Nothing
    Set Cnx = Nothing    

End Function

1 Ответ

1 голос
/ 09 мая 2019

Вы можете обновить свой список параметров функции, включив в него необязательный параметр Range -type:

Private Function sqlQuery(ByVal CadenaCnx As String, ByVal Consulta As String, _
                          ByVal Tipo As TipoConsulta, _
                          Optional rng As Range = Nothing) As Variant

     'dump result to rng if needed


End With

А затем позвоните так:

sqlQuery "DSN = myODBC;", "SELECT * FROM Table1", TodaLaConsulta, Range("A1")

************ оригинальный ответ (я смотрел на GetRows) *******

GetRows возвращает двумерный массив, поэтому вы должны иметь возможность сделать что-то вроде

Dim res 

res = sqlQuery ("DSN = myODBC;", "SELECT * FROM Table1", TodaLaConsulta)

Range("A1").Resize(ubound(res,1) + 1, ubound(res,2) + 1).Value = res

но я не думаю, что вы можете сделать это в одной строке, поскольку вам нужно изменить размер целевого диапазона, а для этого вам нужен размер результирующего массива.

Обратите внимание, что GetRows возвращает массив [column, row], поэтому вам может потребоваться транспонировать его перед размещением на листе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...