Buscar registros que coincidan con múltiples parámetros en una base de datos desde un UserForm

25/04/2007 - 23:51 por Insumos | Informe spam
Hola Gente del Foro:

Espero que todos esten muy bien. Les cuento cual es mi pregunta de hoy.
Resulta que tengo una hoja llamada "Base" con una base de datos con 7
campos, siendo los campos:

Número Empresa Sucursal Fecha Beneficiario
Concepto Importe

Ahora, en un UserForm he implementado un buscador, para que de acuerdo a los
parámetros ingresados construya, al clickear un CommnadButton, en una hoja
llamada "Reporte" un reporte con los registros que coinciden con los
parámetros ingresados . Los parámetros para buscar en la base se ingresan
así:
Primer Número a buscar (desde) en TextBox2
Último Número a buscar (hasta) en TextBox3
Empresa en ComboBox2
Sucursal en ComboBox3
Primera Fecha a buscar (desde) en TextBox6
Última Fecha a buscar (hasta) en TextBox5
Beneficiario en ComboBox4
Concepto en ComboBox5
Importe en TextBox6

Lo que quiero es que el código busque los registros que coinciden con todos
los parámetros, pero que si en uno de los parámetros no se completó nada o
bien ignore ese parámetro para la búsqueda o bien interprete que ese
parámetro tiene valor "cualquiera". No se me ocurre como hacer esto!
Estuve experimentando con códigos del tipo:

With Worksheets("Base")
For Each celda In .Range("A2:A" & .[A65536].End(xlUp).Row)
If celda.Offset(0, 1) = ComboBox2 Then
If celda.Offset(0, 2) = ComboBox3 Then
celda.EntireRow.Copy
Worksheets("Reporte").[A65536].End(xlUp).Offset(1) _
.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, _
Transpose:=False
End If
End If
Next

Con un código de este estilo puedo lograr que traiga los registros que
coinciden con los parámetros, pero con los siguientes problemas: a) Cuando
no se completa nada en un parámetro lo toma como que debe traer los
registros que estan "vacios" en ese campo, b) Entro en una casi infinita
sucesión de código del tipo IF y tal vez exista una manera de hacer esto sin
eroscar IF tras IF.
Bueno, espero me haya explicado bien. Desde ya muchas gracias por todo!!
Saludos

Mariano

CONTADURIA
 

Leer las respuestas

#1 Ivan
26/04/2007 - 02:27 | Informe spam
hola Mariano,

lo 1º una pregunta (aunque no estoy del todo seguro de haberte entendido
bien): ¿tienes algun campo unico(sin datos repetidos) en la tabla? por tu
anterior consulta creo entender que si, que no puede haber dos talones con
el mismo nº aunque en el resto de los campos se repitieran algunos.

si esto es asi, te comentoa algunas cosas:

1.- quizas ya lo estes haciendo, pero puedes 'sincronizar' el llenado de
todos los controles para que se llenen/muestren automaticamente en todos
ellos los campos correspondientes al introducir el nº de talon.

una forma de hacerlo es crear una matriz de 'nombres' de controles (o usar
un rango de celdas) en el mismo orden que tienen los registros
correspondientes y usar la propiedad controls del userform para rellenarlos.
Puedes hacer algo parecido a esto (no pongo tus controles, sino al tuntun):

sub PruebaSinChecar()
Dim c as byte, f as Long, MisCtls as variant, celda as range
MisCtls = Array("Textbox2", "Textbox3", "Textbox4", "ComboBox1",
"ComboBox2")
With <TuHoja>
if .[a22]="" then exit sub
for each celda in .range("a1:a" & .[a65536].end(xlup).row
If celda < nroTalon and nroTalon <= celda + 50 then
f = celda.row
for c = 0 to Ubound(MisCtls)
Me.Controls(c).Text = celda(1,c+1).value
next
exit sub
end if
next
end with
msgbox "No se ha encontrado el valor buscado"
end sub

en cuanto al reporte, una vez obtenida la fila de origen de los datos, no
deberias tener ningun problema. Un ej. podria ser algo asi:

With Worksheets("TuHojaDeDestino")
Worksheets("TuHojaDeOrigen").Range("a" & fila).EntireRow:Copy
.[a65536].end(xlup).Offset(1).PasteSpecial '<aqui los parametros que
quieras para pegar>
end with

nota: si los combos los llenas con todos los registros de la lista en el
mismo orden que estan, y en el momento de cargar el reporte se supone que el
item seleccionado en ellos es el correspondiente, puedes obtener el nº de
fila sumando el nº de la 1ª fila con datos de la hoja de origen (en el ej.
2, pues en la 1 irian los titulos) al listindex del combo -> f =
combo.ListIndex + 2

espero te sirva
un saludo
Ivan

Preguntas similares