.
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.
if (payload.eventType == ‘subscribe’) {
// Add code to handle subscribe event.
} else if (payload.eventType == ‘unsubscribe’) {
// Add code to handle unsubscribe event.
}
if (window.console) { // for debugging only
window.console.log(‘YT event: ‘, payload);
}
}
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:
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.
⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
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.
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.
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:
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
⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
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
.
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