PROGRAMAR EN VBA MACROS PARA EXCEL: Como Filtrar Datos Excel con Consulta SQL Vs Bucle While Wend

Como Filtrar Datos Excel con Consulta SQL Vs Bucle While Wend





En este post se presenta una comparación entre macros, se muestra por un lado una macro que permite filtrar datos mediante criterios utilizando un Bucle con la estructura While ... Wend y por otro lado se usa SQL para buscar datos en Excel, los resultados son los mismos, en base de datos chicas el tiempo de búsqueda es prácticamente el mismo, pero en bases de datos más grandes SQL es mucho más rápido.

Descarga el ejemplo en forma gratuita sin ninguna restricción, el código se puede adaptar a cada necesidad, Aporta por favor para sostener el sitio si está dentro de tus posibilidades, desde ya muchas gracias.

Recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz click acá, si quieres aprender sobre Excel, en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet.

  

Mira una explicación detallada en el vídeo, suscribe a nuestra web desde la parte superior derecha de la página ingresando tu mail y a nuestro canal de You Tube para recibir en tu correo vídeos explicativos sobre macros interesantes, como  por ejemplo Recorre fila buscando y comparando datos de dos columnas en hojas distintasbuscar en listbox mientras escribes en textbox, como crear una factura o sale invoice y grabar guardar PDF XLS y enviar por mail, trabajando con filas, celdas, columnas, rangos y muchos ejemplos más.









 


Al descargar el ejemplo y abrir el libro de Excel se podrá observar que se encuentran dos botones, el primero ejecuta un filtro o búsqueda utilizando un bucle con la estructura While...Wend; el segundo botón realiza la misma búsqueda o filtro de datos utilizando SQL.

Los criterios de búsqueda se encuentran en la Hoja1 celda B1 y Celda E1, en el ejemplo que se muestra se busca todos los datos coincidentes en la base de datos que se encuentra en la Hoja2, que sena iguales a la marca "Coca Cola" cuyo precio de venta (Pv) sea mayor a "Cinco".

Con el bucle While... When, se recorre todas las filas buscando los registros que coincidan con los criterios, en este ejemplo los criterios se asignan a variables que son las siguientes:

marca = UCase(b.Range("B1"))
signo = b.Range("D1")
valor = b.Range("E1")

marcabus = UCase(a.Cells(filabus, "D"))
valorbus = a.Cells(filabus, "E")


Las primeras variables son las de la hoja de destino y las últimas dos variables son los datos que va tomando cada vez que se recorra las filas con el bucle While ... Wend

Si la marca ingresada en B1 es coincidente con la marca de la fila correspondiente de la Hoja2 que en cada momento recorre el bucle y además el valor de venta es mayor al valor buscado, entonces el registro cumple la condición, lo copia y pega en la Hoja1 y así sucesivamente con cada uno de los ítem de la base de datos.

If marcabus = marca And valorbus > valor Then
a.Range("A" & filabus & ":G" & filabus).Copy Destination:=b.Range("A" & fila)

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Quizá sea de utilidad también

Como crear una factura con excel, guardarla y enviarla por mail automáticamente


Como cargar listbox con datos provenientes de varias hojas

Como repetir en Excel un mismo caracter varias veces

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛



⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛

La otra forma de búsqueda es el Filtro de Datos de Excel a través de SQL, para ello primero hay que realizar una conexión con el Libro Excel, que puede ser el mismo u otro libro, en este caso es el mismo, ya que los datos se encuentran en el mimos libro sobre el cual se trabaja.

La conexión con el mismo libro se realiza con el siguiente código, a continuación la SQL, que es el string de consulta que contiene los criterios de búsqueda o filtro de datos.

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;"""

sql = "SELECT * FROM [" & "Hoja2$" & "] WHERE Ucase(" & a.Range("D1") & ") LIKE Ucase('%" & b.Range("B1") & "%') AND pv " & b.Range("D1") & " " & b.Range("E1") & " ORDER BY pv ASC"

La SQL se podría leer: Selecciones todas las columnas de la Hoja2 cuando la columna Marca coincida con el texto (marca) ingresado en B1 y el precio de venta sea Mayor al precio que figura en la columna "Pv" de la base de datos.

Una vez ejecutada la SQL los datos filtrados o coincidentes se mantienen en memoria (Recorset), hasta tanto sean usado y liberadas las variables.

Set rs = cn.Execute(sql)
b.Cells(3, 1).CopyFromRecordset Data:=rs

En el código anterior los datos filtrados son copiados a partir de la fila 1 columna 1 es decir celda A3, ya que en la fila 2 van los encabezados de columna.

Para liberar las variables y por ende liberar recursos, se usa:

Set rs = Nothing
cn.Close
Set cn = Nothing


El ejemplos denominado Como Filtrar Datos Excel con Consulta SQL vs. Bucle While ... Wend, se puede descargar desde el link del final que esta en forma posterior a la codificación del ejemplo que se encuentra a continuación.


Código que se inserta en un módulo

Sub ConsutaSQLExcel()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim ctl As Object
Dim cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
On Error Resume Next
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
Set b = Sheets("Hoja1")
Set a = Sheets("Hoja2")

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
sql = "SELECT * FROM [" & "Hoja2$" & "] WHERE Ucase(" & a.Range("D1") & ") LIKE Ucase('%" & b.Range("B1") & "%') AND pv " & b.Range("D1") & " " & b.Range("E1") & " ORDER BY pv ASC"

uf = b.Range("A" & Rows.Count).End(xlUp).Row
If uf < 3 Then uf = 2
b.Range("A3:G" & uf).Clear
a.Range("A1:G1").Copy Destination:=b.Range("A2")
Set rs = cn.Execute(sql)
b.Cells(3, 1).CopyFromRecordset Data:=rs
b.Range("B:B").NumberFormat = "dd/mm/yyyy"
Set rs = Nothing
cn.Close
Set cn = Nothing
If b.Range("A3") <> Empty Then
MsgBox ("La busqueda se realizó con éxito"), vbInformation, "AVISO"
Else
MsgBox ("No se encontraron regisgros para el criterio de búsqueda"), vbInformation, "AVISO"
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Sub ConsutaBucleWhileWend()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'On Error Resume Next
Set b = Sheets("Hoja1")
Set a = Sheets("Hoja2")
filabus = 2
fila = 3
uf = b.Range("A" & Rows.Count).End(xlUp).Row
If uf < 3 Then uf = 2
b.Range("A3:G" & uf).Clear
a.Range("A1:G1").Copy Destination:=b.Range("A2")

While a.Cells(filabus, "A") <> Empty
marca = UCase(b.Range("B1"))
signo = b.Range("D1")
valor = b.Range("E1")

marcabus = UCase(a.Cells(filabus, "D"))
valorbus = a.Cells(filabus, "E")
If marcabus = marca And valorbus > valor Then
a.Range("A" & filabus & ":G" & filabus).Copy Destination:=b.Range("A" & fila)
fila = fila + 1
End If
filabus = filabus + 1
Wend

b.Range("B:B").NumberFormat = "dd/mm/yyyy"
If b.Range("A3") <> Empty Then
MsgBox ("La busqueda se realizó con éxito"), vbInformation, "AVISO"
Else
MsgBox ("No se encontraron regisgros para el criterio de búsqueda"), vbInformation, "AVISO"
End If
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛


Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.


If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends