VBA excel: autofiltro con varias condiciones

He hecho un formulario de carga de datos de comprobantes, el cual tiene unos 30 campos entre textbox y combobox.
Quisiera saber como puedo hacer para poder buscar un comprobante ya almacenado con hasta 4 datos de búsqueda. Por ejemplo: necesito poder buscar por código, empresa, tipo de trabajo realizado y fecha. Es decir que me muestre los registros que coincidan con 1,2,3, o 4 campos de búsqueda.
Espero me puedan ayudar.
Muchísimas Gracias por su altruismo
Nota: estoy iniciándome con vba excel. Agradecería si me pueden recomendar algún libro que me pueda ayudar a seguir creciendo en la programación de Vba Excel.

1 Respuesta

Respuesta
1
Imagino que parte de esos 30 controles son textbox donde ingresas los 4 criterios de búsqueda, en mi ejemplo los llamé Textbox1 hasta el 4.
También imaginé que la col código empieza en A2 y el resto de los campos en B, C y DE respectivamente. Se devuelven en TextBox5, 6 ... los datos de las col siguientes.
Con esa información probá esta rutina extraída de mi manual 400MacrosPlus. Se ejecuta luego de cargar el 4to textbox:
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'rango donde buscará el código
rango = "A2:A200"
dato = Val(TextBox1.Value) 'Ver *
Set midato = ActiveSheet.Range(rango).Find(dato, LookIn:=xlValues, LookAt:=xlWhole)
'si la búsqueda es exitosa.....
If Not midato Is Nothing Then
'compara si el resto de campos coinciden con los otros controles
If midato.Offset(0, 1) = TextBox2 And midato.Offset(0, 2) = TextBox3 And midato.Offset(0, 3) = cdate(TextBox4) Then 'Ver **
'llena los otros controles con los datos del registro encontrado
TextBox5 = midato.Offset(0, 5)
TextBox6 = midato.Offset(0, 6)
'completar el resto
End If
End If
'libera la variable
Set midato = Nothing
End Sub
* Si el código será un campo numérico utilizar la función Val, sino quitarla
** Utilizo la función CDate por tratarse de un campo fecha.
Pruébalo y comentame si esto resuelve tu consulta.
Saludos
Elsa
PD) Te puedo recomendar mis 2 manuales: Introducción a las Macros (nivel inicial) y 400MacrosPlus. Podes descargar las demos desde mi sitio o solicitármelas a mi correo.
http://es.geocities.com/lacibelesdepunilla/manuales
Hola Elsa.
Muchas gracias por tu respuesta.
Los campos que necesito poder buscar por código, empresa, y tipo de trabajo realizado son 3 combobox, donde selecciono los campos de las listas que tienen cada respectivo combobox. Y el campo fecha es un textbox.
Pregunta:
¿Cambio la palabra Textbox por combobox, o hay que hacer algo más?
Otras pregunta:
¿Si quiero buscar por ejemplo, solamente por código, y por empresa; y dejar los campos "tipo de trabajo" y "fecha" en blanco? ¿Me sirve esta misma rutina? O tengo que poner un botón que diga "seleccionar por código y empresa", ¿y agregarle a este botón la rutina modificada?
TE envío una rutina ajustada según los últimos requerimientos. Evaluará si cada 1 de los 3 controles siguientes está vacío o si no lo está, que sean = a los campos sgtes del registro.
Esto te permitirá utilizar la misma rutina para búsquedas por 1, 2,3 o 4 criterios.
Ajustá el nombre de los controles a los tuyos (textbox o combobox)
Saludos
Elsa
http://es.geocities.com/lacibelesdepunilla/manuales
Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ind = 0
rango = "A2:A200"
dato = Val(TextBox1.Value)
Set midato = ActiveSheet.Range(rango).Find(dato, LookIn:=xlValues, LookAt:=xlWhole)
'si la búsqueda es exitosa.....
If Not midato Is Nothing Then
'guarda la direcci´n del primer registro encontrado
PrimCoinc = midato.Address
'comienza el bucle comparando otras col con cada dato encontrado en col A
Do
If midato.Offset(0, 1) = Val(TextBox2) Or TextBox2 = "" Then
If midato.Offset(0, 2) = Val(TextBox3) Or TextBox3 = "" Then
If midato.Offset(0, 3) = CDate(TextBox4) Or TextBox4 = "" Then
TextBox5 = midato.Offset(0, 5)
TextBox6 = midato.Offset(0, 6)
'otras instrucciones
ind = 1
End If
End If
End If
'busca la siguiente entrada
Set midato = ActiveSheet.Range(rango).FindNext(midato)
'repite la búsqueda hasta encontrar el registro o hasta que comience nuevamente por el principio de la lista
Loop While Not midato Is Nothing And midato.Address <> PrimCoinc And ind = 0
End If
'libera la variable
Set midato = Nothing
End Sub
Hola Elsa
Muchas gracias nuevamente.
Te pido disculpas por lo inexperto que soy en esto.
Me sale un mensaje de error en la primera linea que dice "Error de Compilació: Se ha detectado un nombre ambiguo:combobox4_exit".
La rutina la he puesto dentro del mismo formulario de altas de registros, y he adaptado la rutina (por los combobox que tengo) y ha quedado así:
Private Sub ComboBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
ind = 0
'rango donde buscará el código
rango = "b2:b200"
dato = Val(ComboBox1.Value) 'Ver *
Set midato = ActiveSheet.Range(rango).Find(dato, LookIn:=xlValues, LookAt:=xlWhole)
'si la búsqueda es exitosa.....
If Not midato Is Nothing Then
'guarda la direcci´n del primer registro encontrado
PrimCoinc = midato.Address
'comienza el bucle comparando otras col con cada dato encontrado en col A
Do
If midato.Offset(0, 1) = Val(ComboBox2) Or ComboBox2 = "" Then
If midato.Offset(0, 2) = Val(ComboBox3) Or ComboBox3 = "" Then
If midato.Offset(0, 3) = CDate(ComboBox4) Or ComboBox4 = "" Then
TextBox5 = midato.Offset(0, 5)
TextBox6 = midato.Offset(0, 6)
'otras instrucciones
ind = 1
End If
End If
End If
'busca la siguiente entrada
Set midato = ActiveSheet.Range(rango).FindNext(midato)
'repite la búsqueda hasta encontrar el registro o hasta que comience nuevamente por el principio de la lista
Loop While Not midato Is Nothing And midato.Address <> PrimCoinc And ind = 0
End If
'libera la variable
Set midato = Nothing
End Sub
Si quieres te envío el archivo para ver "donde No he metido la pata".
Nuevamente muchas Gracias
Francisco
Aparentemente no tenés un combobox llamado 4 o tenés 2... ajustá los nombres de cada control en cada línea y si no lo resolvés enviame tu libro al correo que aparece a mi sitio.
Hola Elsa.
Gracias por solucionarme el problema.
La verdad que se me hizo un lío con tantos textbox y combobox, y por eso es que había puesto mal los números de columna en el offset.
Tengo alguna pregunta más que hacerte sobre este mismo tema, que sería la forma de ver dos o más registros que coinciden con los criterios de búsqueda; pero esto lo dejo para otra pregunta.
Me estarían faltando "estrellas" para poder valorarte; y como solamente tengo 5 para puntuarte, entonces, te doy un EXCELENTE no sólo valorando tu esfuerzo y conocimientos, sino también por tu paciencia y dedicación, ayudándome a aprender, y a resolver este problema.
Muchísimas gracias.
Atentamente
Francisco

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas