.
Esta macro que se presenta en el post muestra como buscar datos en el mismo libro dependiendo de varios criterios utilizando SQL, es decir que la macro filtrará los datos dependiendo de varias condiciones y los mostrará en otra hoja de Excel, la base de datos donde se buscan los datos están en el mismo libro de Excel, todo lo anterior se realiza combinando VBA y SQL.
Al usar SQL se pueden realizar búsqueda muchísimos más rápida, es bastante útil para bases de datos grandes, ya que la rapidez con se buscan y muestran los datos es inigualable, este es un vídeo de la saga de vídeos dedicados a combinar VBA con SQL sigue el link para ver la saga completa en nuestro canal de YouTube, suscribe y recibirás el contenido actualizado y gratuito que semana a semana se publica.
Descargar el ejemplo en forma gratuita sin ninguna restricción desde el final del post, 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);
}
}
El filtrado de datos se hace a través de una conexión ADODB – OLEDB, usando el siguiente código:
cn.Open «Provider=Microsoft.Jet.OLEDB.4.0;» & «Data Source=» & ThisWorkbook.FullName & «;Extended Properties=»»Excel 8.0;HDR=Yes;»»»
Se debe tener en cuenta que se está usando Excel 365 / Excel 2016, posterior a ellos se realiza la SQL o string de consulta en este caso pueden ser dos distintas, ya que existe un checkbox donde se indica si se requiere una coincidencia exacta o también se filtrarán registros que contengan la cadena de texto o palabra escrita en la celda I1.
sql = «SELECT * FROM [» & «Hoja1$» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘%» & Range(«I1») & «%’) AND pv » & a.Range(«K1″) & » » & a.Range(«L1″) & » ORDER BY pv ASC»
El String de consulta se lee así: Seleccione todas las columnas de la hoja1 cuando la columna «Marca» sea al valor contenido en la celda H1 y además la columna «PV» sea mayor (en este ejemplo es el valor contenido en K1) al valor contenido en la celda L1 (en ese ejemplo ese valor es 5); luego ordene los datos en forma ascendente por la columna «PV».
Quizá sea de utilidad también
Como dar formato de fecha a textbox de userform de Excel
Como seleccionar con macro impresora distinta a la activa
Como determinar si una celda tiene formulas
⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛⇛
Posteriormente se ejecuta la SQL para que filtre los datos dependiendo de las condiciones dadas, manteniendolos en memoria, de esta forma:
Set rs = cn.Execute(sql)
Luego se copian los datos en el lugar indicado en este caso en la celda A2 de la hoja2., de esta manera:
b.Cells(2, 1).CopyFromRecordset Data:=rs
Para terminar la macro denominada Conectar Excel con Excel Búsqueda de Datos por Varios Criterios con Base de Datos en el mismo Libro, sale un msgbox (quieres aprender más sobre msgbox) mostrando un mensaje si fueron filtrados datos o no existen coincidentes con los criterios dados.
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 a = Sheets(«Hoja1»)
Set b = Sheets(«Hoja2»)cn.Open «Provider=Microsoft.Jet.OLEDB.4.0;» & «Data Source=» & ThisWorkbook.FullName & «;Extended Properties=»»Excel 8.0;HDR=Yes;»»»
‘uf = a.Range(«A» & Rows.Count).End(xlUp).Row
If a.CheckBox1 = False Then
sql = «SELECT * FROM [» & «Hoja1$» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘%» & Range(«I1») & «%’) AND pv » & a.Range(«K1″) & » » & a.Range(«L1″) & » ORDER BY pv ASC»
Else
sql = «SELECT * FROM [» & «Hoja1$» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘» & Range(«H2») & «‘) ORDER BY ID ASC»
‘sql = «SELECT * FROM [» & «Hoja1$A1:V65000» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘» & Range(«H2») & «‘) ORDER BY ID ASC»
End If
b.Cells.Clear
a.Range(«A1:G1»).Copy Destination:=b.Range(«A1»)
Set rs = cn.Execute(sql)
b.Cells(2, 1).CopyFromRecordset Data:=rs
b.Range(«B:B»).NumberFormat = «dd/mm/yyyy»
Set rs = Nothing
cn.Close
Set cn = Nothing
If b.Range(«A2») <> 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 a = Sheets(«Hoja1»)
Set b = Sheets(«Hoja2»)
cn.Open «Provider=Microsoft.Jet.OLEDB.4.0;» & «Data Source=» & ThisWorkbook.FullName & «;Extended Properties=»»Excel 8.0;HDR=Yes;»»»
‘uf = a.Range(«A» & Rows.Count).End(xlUp).Row
If a.CheckBox1 = False Then
sql = «SELECT * FROM [» & «Hoja1$» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘%» & Range(«I1») & «%’) AND pv » & a.Range(«K1″) & » » & a.Range(«L1″) & » ORDER BY pv ASC»
Else
sql = «SELECT * FROM [» & «Hoja1$» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘» & Range(«H2») & «‘) ORDER BY ID ASC»
‘sql = «SELECT * FROM [» & «Hoja1$A1:V65000» & «] WHERE Ucase(» & a.Range(«H1») & «) LIKE Ucase(‘» & Range(«H2») & «‘) ORDER BY ID ASC»
End If
b.Cells.Clear
a.Range(«A1:G1»).Copy Destination:=b.Range(«A1»)
Set rs = cn.Execute(sql)
b.Cells(2, 1).CopyFromRecordset Data:=rs
b.Range(«B:B»).NumberFormat = «dd/mm/yyyy»
Set rs = Nothing
cn.Close
Set cn = Nothing
If b.Range(«A2») <> 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