Acceso parametrizado desde Excel/Odbc a Sql

Hola. Esta es la situación que no sé cómo abordar y para la que agradecería me dieran una posible solución: desde Excel accedo a través de ODBC a tablas de Sql y como cada mes he de utilizar tablas de nomenclatura distinta que depende del mes al que están referidos los datos, necesitaría poder automatizar el acceso a la tabla concreta de cada mes mediante la indicación de un parámetro que determine la que debo usar. Por ejemplo, este mes de diciembre dispongo de una tabla SQL que se llama T_DATO_11 que contiene los datos del mes de noviembre que quiero emplear en determinados cálculos en mi hoja; yo quisiera poder indicar el valor 11 en una celda y que al ejecutar Actualizar Datos del menu Datos el sistema acceda a la tabla T_DATO_11. El mes próximo, cuando indique en esa celda el valor 12 el sistema accederá a la tabla T_DATO_12, y así. ¿Me explico?
{"Lat":-36.0313317763319,"Lng":-65.7421875}

1 respuesta

Respuesta
1
Supongo que estas accediendo a los datos con el Query y por eso no puedes cambiar el nombre de la tabla a la que accedes.
La solución está en traerte los datos a través de un sencillo procedimiento en Visual Basic donde te permita cambiar el nombre de la tabla. Podría ser algo así:
Sub importarDatosTabla(ByVal nombreTabla As String)
    Const nomHojaSalida = "Hoja1"
    Const numFilIni = 1
    Const numColIni = 1
    Dim i As Integer
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim txtSql As String
    Dim sh As Worksheet
    Dim nLin As Long
    ' Seleccionamos la página de salida
    On Error Resume Next
    Set sh = Sheets(nomHojaSalida)
    If Err <> 0 Then
        MsgBox "Error: No se encuentra la hoja de salida. Proceso cancelado"
        On Error GoTo 0
        Exit Sub
    End If
    On Error GoTo 0
    ' Abrimos la base de datos y la tabla
    cn.Open "Nombre ODBC", "usuario", "clave"
    txtSql = "select <campos o *> from " & nombreTabla & " order by <campos orden>"
    rs.Open txtSql, cn, adOpenStatic, adLockReadOnly
    If Not rs.EOF Then rs.MoveFirst
    ' Borramos desde la línea inicial hasta la 65536
sh.Rows(Format$(numFilIni) & ":65536"). Delete
    ' Ponemos en la linea inicial el nombre de los campos
    For i = 0 To rs.Fields.Count - 1
        sh.Cells(numFilIni, i + 1) = rs.Fields(i).Name
    Next i
    ' Y traemos los datos
    nLin = numFilIni
    Do While Not rs.EOF
        nLin = nLin + 1
        For i = 0 To rs.Fields.Count - 1
            If Not IsNull(rs.Fields(i).Value) Then sh.Cells(nLin, i + 1) = rs.Fields(i).Value
        Next i
        rs.MoveNext
    Loop
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas