Ejecutar consulta SQL desde Excel
Hace algunos días me surgió la necesidad de extraer datos de unas bases de SQL a Excel, a lo cual me di a la tarea de buscar información al respecto. Cuál fue mi sorpresa que no existe mucha información al respecto. Encontré un ejemplo de ejecutar consulta SQL desde Excel del cual tomé el código que realiza la función y adecué un formulario para que sea más amigable la consulta.
Cómo funciona?
El ejemplo funciona si se tiene una cadena de conexión a SQL, y aunque no está probado para MySql no dudo que también funcione, sólo modificando la cadena.
Se muestra un formulario donde se especifica el nombre del servidor, de la base de datos, así como el usuario y la contraseña, además de un espacio para se que introduzca la sentencia SQL a ejecutar.
Consideraciones
Se requieren conocimientos básicos de SQL para armar la consulta, así como un servidor SQL local o en red.
Ver Video Ejecutar Consulta SQL desde Excel
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Código
Private Sub CommandButton1_Click() 'Llamas la función Ejecutar Cells.ClearContents Call Ejecutar(Sheets(2).Range("consulta"), "Hoja1") End Sub
Function Ejecutar(Sql As String, Hoja As String) On Error GoTo ErrorHandler Dim cn As Object ' crea un objeto Connection Set cn = CreateObject("ADODB.Connection") ' IMPORTANTE: Indicar la cadena de conexión a usar servidor = Sheets(2).Range("servidor") base = Sheets(2).Range("base") Usuario = Sheets(2).Range("usuario") pass = Sheets(2).Range("pass") Conexion = "Provider=SQLOLEDB.1;" & _ "Password=" & pass & ";" & _ "Persist Security Info=True;" & _ "User ID=" & Usuario & ";" & _ "Initial Catalog=" & base & ";" & _ "Data Source=" & servidor 'cn.ConnectionString = "Provider=SQLOLEDB.1;Password=s3cr3t0;Persist Security Info=True;User ID=sa;Initial Catalog=Cobranza;Data Source= 192.168.2.6" cn.ConnectionString = Conexion ' verifica que los parámetros no estén vacios If Sql <> vbNullString And Hoja <> vbNullString Then ' variable para al rec de ado Dim rst As Object ' abre la conexión a la base de datos cn.Open ' crea un nuevo objeto recordset Set rst = CreateObject("ADODB.Recordset") ' Ejecuta el sql para llenar el recordset rst.Open Sql, cn, 1, 3 ' variables para los indices de las filas y columnas c = 0 f = 0 ' recorre las columnas, añade el nombre del campo al encabezado For i = 0 To rst.Fields.Count - 1 Sheets(1).Range(Chr(i + 65) & f + 1).Value = rst.Fields(i).Name Next f = f + 1 ' recorre todo el recordset hasta el final Do While Not rst.EOF ' recorre los campos en el registro actual del recordset para recuperar el dato For i = 0 To rst.Fields.Count - 1 ' añade el valor a la celda Sheets(1).Range(Chr(c + 65) & _ f + 1).Value = rst.Fields(c) c = c + 1 Next ' resetea el indice de las columnas c = 0 ' Referencia al registro actual (incrementa ) f = f + 1 ' Siguiente registro rst.MoveNext Loop ' cierra y descarga las referencias On Error Resume Next rst.Close cn.Close Set cn = Nothing Set rst = Nothing End If Call Macro1 Exit Function ErrorHandler: MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, "EXCELeINFO" End Function