首页 > 解决方案 > VBA SQL查询到一个范围

问题描述

我想要结果查询到我的命运范围而不在我的函数中定义它,我的意思是......我可以调用命运范围吗?

你好,我想查询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

标签: sqlsql-serverexcelvba

解决方案


您可以更新函数参数列表以包含可选的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],因此您可能需要先转置它,然后再将其放在工作表上。


推荐阅读