Macros en excel y bd en sql developer

Respuesta de
ver mapa
Usuario
Hola santiago
Necesito saber si puedes hacerme el favor de ayudarme con una macro en excel tiene en la hoja 12 tengo el resultado de muchos procedimientos organizados en forma de una tabla de bases de datos necesito subir todos esos registros (resultados) a una base de datos en sql developer pero no he podido agradezco que puedas colaborarme
cod_periodo pit producto can_ rom cant_gtis btu ash
201001 s 185 3256 8724 12.87 04.38
... n
Esa es la tabla en excel
Y es la misma tabla en la base de datos que tengo sql developer con los mismos campos
agradezco tu colaboración prestada
Avatar
Experto
Entiendo que se trata de una base de datos en SQL Server que accedes a ella a través del SQL Developer. ¿Es así?
De todas formas no debería haber mucha diferencia siempre que la base de datos la tengas accesible a través de ODBC.
Supongamos que el acceso ODBC de tu base de datos es "MI_SQL_SERVER" y quieres grabar el contenido de la "Hoja12" en la tabla "dbo.datosHoja12".
Si la línea 1 contiene la cabecera y los datos están entre las columnas A y G, la macro podría ser algo así:
Option Explicit
Sub enviarDatosHoja12AlSqlServer()
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sh As New Worksheet
    Dim nLin As Long
   
    Set sh = Sheets("Hoja12")
   
    cn.Open "MI_SQL_SERVER", "usuario", "clave"
   
    ' Si queremos borrar el contenido anterior de la tabla ponemos la siguiente línea (sino se puede borrar o comentar)
    cn.Execute "delete from dbo.datosHoja12"
   
    ' Abrimos la tabla para añadirle los registros
    rs.Open "dbo.datosHoja12", cn, adOpenDynamic, adLockOptimistic
    For nLin = 2 To sh.Cells.SpecialCells(xlCellTypeLastCell).Row
        If sh.Cells(nLin, 1) <> "" Or sh.Cells(nLin, 2) <> "" Or _
           sh.Cells(nLin, 3) <> "" Or sh.Cells(nLin, 4) <> "" Or _
           sh.Cells(nLin, 5) <> "" Or sh.Cells(nLin, 6) <> "" Or _
           sh.Cells(nLin, 7) <> "" Then ' Hay algún dato. Grabamos el registro
            rs.AddNew
            rs!cod_periodo = sh.Cells(nLin, 1)
            rs!pit = sh.Cells(nLin, 2)
            rs!producto = sh.Cells(nLin, 3)
            rs!can_rom = sh.Cells(nLin, 4)
            rs!cant_gtis = sh.Cells(nLin, 5)
            rs!btu = sh.Cells(nLin, 6)
            rs!ash = sh.Cells(nLin, 7)
            rs.Update
        End If
    Next nLin
   
    ' Cerramos
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
End Sub
NOTA: Para que funcione hay que agregar una referencia (dentro del menú de herramientas del Visual Basic) a la librería: "Microsoft ActiveX Data Objects 2.xx library" (coger la última versión)
Espero que funcione porque no lo he podido probar.
Un saludo
Usuario
Gracias por tu respuesta voy a probarla pero tengo una duda para que utilizas la expresión
For nLin = 2 To sh.Cells.SpecialCells(xlCellTypeLastCell).Row
esa linea me permite llenar todos los registros hasta que termine y no encuentre dato alguno
yo utilizo un ciclo mientras no encuentre un celda en blanco ej
index = 2 ' apartir de la celda 2 hasta el ultimo registro
while (sheet12.range("A" & index).value <> empty) ' hasta que el ultimo registro este vacio
gracias nuevamente por tu colaboracion
jjsm
Usuario
Gracias por su respuesta me fue de mucha ayuda y pude resolver el inconveniente ya puedo subir los datos