Saltar al contenido

Codigo para coneccion a BD en Excel y consulta SQL


Recommended Posts

Tengo un archivo en excel tipico de ventas (ciudad, vendedor,ventas..etc) esta informacion esta en la hoja1 y quiero hacer una consulta desde visual basic tipo SQL (Select "Ciudad" from Ventas.xlsm where Ventas > 100). El recordset debera llegar a una hoja de excel del mismo libro (Ventas.xlsm) hoja2

Me pueden ayudar con el codigo de coneccion y si se requiere configurar el equipo para poder hacerlo.

Envio Archivo .xls dado que la extension xlsm no pude subirla

Gracias

Ventas.xls

Enlace a comentario
Compartir con otras webs

Buen dia jggallegomo

Suponiendo que el código que necesita es una macro para que le haga la suma de las ventas y que la suma viaje a la hoja2 del mismo libro, puede servirle el siguiente:

Dim Lin As Long
Dim Lin1 As Long
Lin = 2
Do While Hoja1.Cells(Lin, 1) <> ""
Lin2 = 2
Do While Hoja2.Cells(Lin2, 1) <> ""
If Hoja1.Cells(Lin, 1) = Hoja2.Cells(Lin2, 1) And Hoja1.Cells(Lin, 3) >= 100 Then
Hoja2.Cells(Lin2, 2) = Hoja2.Cells(Lin2, 2) + Hoja1.Cells(Lin, 3)
End If
Lin2 = Lin2 + 1
Loop
Lin = Lin + 1
Loop
[/PHP]

Inserte un boton en la hoja1 y pegue el código suministrado. Pero para que este funcione, debe copiar las ciudades, pegarlas en la primera columna de la hoja2 a partir de la celda 2 y eliminar los repetidos. Luego ejecute el código y verá que la suma de las ciudades se mostrará.

Espero sea lo que busca.

Mis respetos.

Enlace a comentario
Compartir con otras webs

Bueno

Dejame investigar y veré si puedo ayudarte, no obstante, hasta la fecha sé de conexiones ADO (active data object) con VBA (visual basic for applications) en la que se conectan para trabajar con una base de datos ACCES 2007 desde excel 2007 y según entiendo, lo que necesitas es crear consultas SQL pero en excel.... Pero desde otro libro excel o desde un archivo ACCESS?

Un ejemplo de conexion ADO seria el siguiente:

Este codigo lo agregas en un modulo:


Para Conectar
Public Cnn As New ADODB.Connection
Public Rs As New ADODB.Recordset

Sub Conecta()
Set Cnn = New ADODB.Connection
With Cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Record.accdb"
.Open
End With
End Sub
[/PHP]

Enlace a comentario
Compartir con otras webs

Gracias, Enigma, la macro se graba en el mismo libro de excel, en la hoja1 del Libro Ventas.xls(xlsm) esta la BD con las columnas de Ciudad, Vendedor, ventas .... en la hoja2 quedaria el resultado de la consulta. hasta ahora he logrado llegar a este punto pero aun no logro que devuelva los datos a la hoja dos

Sub conn1()

Dim cnn As ADODB.Connection

Dim sTablaOrigen As String, sTablaDestino As String

Dim sConnect As String, sSQL As String

sTablaDestino = "[hoja2$]"

sTablaOrigen = "[WorkSheet1$A1:M50]"

Set cnn = New ADODB.Connection

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:\Users\xxx\Documents\Excel\Ventas.xlsm;" & _

"Extended Properties=""Excel 8.0;HDR=Yes;"" "

If cnn.State = 1 Then

Dim com As New ADODB.Command

com.ActiveConnection = cnn

com.CommandText = "Select * from [hoja1$A2:c10]"

com.CommandType = adCmdText

Dim rs As ADODB.Recordset

Set rs = com.Execute

If rs.EOF = False Then

Dim filas As Integer

fila = 1

Do While Not rs.EOF

Hoja2.Cells(fila, 1) = rs

fila = fila + 1

Loop

rs.Close

Else

MsgBox "recordset vacio "

End If

cnn.Close

Else

MsgBox "Error en la coneccion"

End If

End Sub

Enlace a comentario
Compartir con otras webs

Hola:

Así funciona:

Sub LeerExcel()
Dim Conexión As Object, rs As Object
Set Conexión = New ADODB.Connection
Conexión.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & [B]ThisWorkbook.FullName[/B] & _
";Extended Properties=""Excel 8.0;HDR=Yes;"""
If Conexión.State = 1 Then
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With
rs.Open "SELECT * FROM [" & "[B]Hoja1$A1:C10[/B]" & "]", Conexión, , , adCmdText
[B]Hoja2[/B].Cells.ClearContents
[B]Hoja2[/B].Range("A2").CopyFromRecordset rs
End If
End Sub
[/CODE]

Esta macro recupera información con [b]ADO SQL[/b] desde el propio libro de la [b]Hoja1 [/b]a la [b]Hoja2[/b].

No olvidar incluir la referencia [b]Microsoft ActiveX Data Objects x.xx[/b]

Enlace a comentario
Compartir con otras webs

Guau!!! si el Maetro Macro Antonio le dá el codigo es porque ese mismo es jejejeje. Mis saludos y respetos señor Macro Antonio!!!

Voy a probar el codigo porque nunca he trabajado, de hecho entiendo poco sobre conexiones entre un libro de excel a otro. Pero veo que la logica es muy parecida a la usada entre access y excel. Si me permite unas preguntas se Macro Antonio, me gustaria formularlas, bien sea por este mismo tema u otro nuevo.

Señor jggallegomo como dije anteriormente y ahora con la solucion del Experto Macro Antonio, me pondré a averiguar sobre esas conexiones para asi comprender aun mas el tema y quizas ayudarlo en este y otros temas que tenga.

Mis respetos.

Enlace a comentario
Compartir con otras webs

Macro Antonio, Excelente!!!, ya la probe y funciona perfectamente, Enigma muchas gracias por su apoyo, si no les molesta mantengamos el mismo tema, estoy seguro que aprenderemos mucho, para mi lo que sigue es ir generando diferentes consultas sobre la base de datos.

Nuevamente muchas gracias a todos:nevreness:

- - - - - Mensaje combinado - - - - -

El tema quedo solucionado, como cambio de estado Pendiente a Solucionado?

Gracias

- - - - - Mensaje combinado - - - - -

Sr Macro Antonio, Excelente!!! funciona perfectamente, Sr Enigma muchas gracias por su apoyo, si no es molesta me gustaria seguir avanzando en este tema dejandolo abierto. he probado las siguientes consultas, espero que sean de utilidad.

Sobre este tema si se modifica la linea rs.open como sigue se obtienen diferentes datos como sigue:

Extrae todos los Registros

rs.Open "SELECT * FROM [" & "Hoja1$A1:C10" & "]", Conexión, , , adCmdText

Extrae todas las ciudades

rs.Open "SELECT Ciudad FROM [" & "Hoja1$A1:C10" & "]", Conexión, , , adCmdText

Extrae Vendedores Unicos

rs.Open "SELECT Distinct Vendedor FROM [" & "Hoja1$A1:C10" & "]", Conexión, , , adCmdText

- - - - - Mensaje combinado - - - - -

Extrae las ventas por vendedor

rs.Open "SELECT Distinct Vendedor, Sum(Ventas) FROM [" & "Hoja1$A1:C10" & "] GROUP BY Vendedor", Conexión, , , adCmdText

Enlace a comentario
Compartir con otras webs

En verdad muy interesante!!!!. Nunca habia trabajado con conexiones entre excel pero ahora veo que si es posible.

Señor Macro Antonio

Si se trata de una conexion desde un libro excel 2007 a otro, como sera la estructura de la conexion?

veo su codigo pero tengo tres dudas:

  1. Suponiendo que es un libro excel con extension .xls año 1997 Excel 8.0 (Office 97)., El proveedor Microsoft seria Jet.OLEDB.4.0. Pero si lo es en excel 2007 .xlsm año 2007 Excel 12.0 (Office 2007). Seria .ACE.OLEDB.12.0...?
  2. El ThisWorkbook.FullName seria el nombre del archivo al cual se crea la conexion verdad? Si es Asi seria algo asi como ThisWorkbook.Path & "\Record.xlsm" ?
  3. En la parte de Extended Properties=""Excel 8.0;HDR=Yes;""" Solo habria que cambiar el=""Excel 8.0;HDR=Yes;""" por =""Excel 12.0;HDR=Yes;"""...?

Conexión.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;"""[/PHP]

Mil disculpas por las preguntas pero me interesó el tema y seria un gran honor contar con su ayuda. De hecho que pena que uso el tema del amigo jggallegomo.

Enlace a comentario
Compartir con otras webs

Mr Enigma como vera estoy trabajando en Excel 2010 mi archivo es .xlsm y el provider es OLDB y trabaja sin ningun problema, para el Thisworkbook en el DataSource utilizo la ruta de ubicacion del archivo, y en Extended properties mantengo el Excel 8.0.

Considere el tema como suyo, agradezco su aporte, espero le sirva

Sub ConectarExcel()

Dim Conexión As Object, rs As Object

Set Conexión = New ADODB.Connection

Conexión.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:\Users\xxx\Documents\Excel\Ventas.xlsm;" & _

"Extended Properties=""Excel 8.0;HDR=Yes;"" "

If Conexión.State = 1 Then

Set rs = New ADODB.Recordset

With rs

.CursorLocation = adUseClient

.CursorType = adOpenStatic

.LockType = adLockOptimistic

End With

rs.Open "SELECT Distinct Vendedor, Sum(Ventas) FROM [" & "Hoja1$A1:C10" & "] WHERE Ventas>50 and Vendedor='Juan' GROUP BY Vendedor ", Conexión, , , adCmdText

Hoja2.Cells.ClearContents

Hoja2.Range("A2").CopyFromRecordset rs

End If

End Sub

- - - - - Mensaje combinado - - - - -

Mr Enigma como vera estoy trabajando en Excel 2010 mi archivo es .xlsm y el provider es OLDB y trabaja sin ningun problema, para el Thisworkbook en el DataSource utilizo la ruta de ubicacion del archivo, y en Extended properties mantengo el Excel 8.0.

Considere el tema como suyo, agradezco su aporte, espero le sirva

Sub ConectarExcel()

Dim Conexión As Object, rs As Object

Set Conexión = New ADODB.Connection

Conexión.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=C:\Users\xxx\Documents\Excel\Ventas.xlsm;" & _

"Extended Properties=""Excel 8.0;HDR=Yes;"" "

If Conexión.State = 1 Then

Set rs = New ADODB.Recordset

With rs

.CursorLocation = adUseClient

.CursorType = adOpenStatic

.LockType = adLockOptimistic

End With

rs.Open "SELECT Distinct Vendedor, Sum(Ventas) FROM [" & "Hoja1$A1:C10" & "] WHERE Ventas>50 and Vendedor='Juan' GROUP BY Vendedor ", Conexión, , , adCmdText

Hoja2.Cells.ClearContents

Hoja2.Range("A2").CopyFromRecordset rs

End If

End Sub

Enlace a comentario
Compartir con otras webs

Buen dia

Le dejo humildemente este pequeño ejemplo que diseñé para el tema de conexiones entre llibros excel y que espero le sea util. Gracias a su idea, me dediqué a investigar el tema e hice varios ejemplos para evaluar el funcionamiento de los codigos.

El aporte es el siguiente:

https://www.ayudaexcel.com/foro/ideas-aportes-64/conexiones-entre-libro-excel2007-otro-libro-excel2007-ado-28810/#post138079

P.D.:

La linea de código que usted tiene, puede cambiar y le aseguro que igual funcionará

Esta

Rs.Open "SELECT Distinct Vendedor, Sum(Ventas) FROM [" & "Hoja1$A1:D10000" & "] GROUP BY Vendedor", Conexión, , , adCmdText

Puede cambiarle el FROM [" & "Hoja1$A1 : D10000" & "] por FROM [" & "Hoja1$A : D" & "] Aqui tenia que separar la letra y los dos pountos porque me sale la carita

Las conexiones puede crearla en un modulo para que lo llame por CALL. Asi no tendrá que escribirlo cada consulta o demás.

Ejemplo:

Public Cnn As ADODB.Connection

Public Rs As ADODB.Recordset

Public Sql As String

Public Dato As String

Sub Conecta()

Set Cnn = New ADODB.Connection

With Cnn

.Provider = "Microsoft.ACE.OLEDB.12.0"

.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Agua.xls" & ";Extended Properties=""Excel 12.0;HDR=Yes;"""

.Open

End With

End Sub

Espero que le sirva

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 95 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola un cordial saludo a todos.  Tengo una hoja con un formato de calendario y tengo 365 hojas cada una con nombre de un dia mes y año  en especifico agradecería me ayuden a como puedo realizar la vinculacion de cada dia del calendario con cada hoja respectivamente sin hacerlo de forma manual , ya que es muy laborioso dado que lo tengo que hacer de una por una.   adjunto coloco un ejemplo de lo que tengo gracias. Libro1.xlsm
    • Muchas gracias @Israel Cassales. La hoja es un ejemplo de como seria la hoja definitiva. ( Por desgracia no puedo poner la información real). Los datos los saco de un registro automático por donde pasan unidades con un numero de referencia único para cada producto. Estas unidades pasan por unos puntos de control y en el registro automático se graban duplicando el numero de producto e indicando el registro del nuevo punto de control. Se que parece un poco lío explicado por aqui. Probaré la solución de @Victor7 y comentaré por aquí los progresos. Muchas gracias   
    • Pregunta para @jose_alk ¿El diseño en la hoja DATAGlobal es tuyo? Si la respuesta es sí, entonces toma mayor relevancia la propuesta del maestro @Victor7 porque si mira con atención cada que avanza un paso, vuelve a escribir el paso anterior, así hasta completar los tres pasos. Por esta causa la fórmula del maestro vincula solo la última parte de ese rango ya que de continuar con esa tendencia y repetir los ciclos, al final siempre le quedarán los únicos que busca. En ese caso podría omitir la otra hoja Data Valores Unicos, porque desde la primer hoja DATAGlobal si filtra en el tercer paso y quita las vacías le quedarán solo los ciclos completos. Por otro lado, si los registros no estarán siempre tan bien ordenados el escenario cambia, por lo tanto le reitero la pregunta inicial, porque si es suyo el diseño tal vez le conviene reconsiderar su formato y que los pasos estén entre lineas. Eso le dará un mayor control de los datos, los filtros y las funciones. Saludos totales.    
    • Saludos totales. Hi @Pedro Alonso Así como está la consulta deja múltiples cosas a la deducción y manejar resultados de tiempo requiere de cierta "estrategia" en las operaciones que se deben realizar. Mencionas que el resultado es grande 4mil+ pero no estás considerando que los meses en realidad no todos tienen los mismos días, además si la cifra fuera aún mayor ¿qué pasa con los años bisiestos? ¿Se puede hacer algo con la poca información que das? Tal vez. Primero debes convertir esas horas en días, luego en meses y por último en años, dejando de residuo las horas que "sobren". Entonces cada año lo promedias a 365.25 y cada mes a 30.44, entonces tendrás una fórmula que se aproxime al resultado que NO ES EXACTO, tomarlo en cuenta. Así que considerando la poca información que dejas, con lo único que puedo aportar (al menos yo) será con un ejemplo si los 4mil y pico fueran horas: =ENTERO(A1/24/365.25)&" años, "&ENTERO(RESIDUO(A1/24,365.25)/30.44)&" meses, "&REDONDEAR(RESIDUO(RESIDUO(A1/24,365.25),30.44),0)&" días, "&RESIDUO(A1,24)&" horas" Te recomiendo mejorar y estructurar las preguntas y los ejemplos.
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.