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

Preguntas similare

Leer las respuestas

#6 Ivan
29/04/2007 - 01:25 | Informe spam
hola de nuevo, Mariano

como siempre (en mi caso), no hay dos sin tres.

a riesgo de parecer pesado te pongo estos nuevos codigos que te servirian
para cualquier numero de controles (siempre que tengan la propiedad 'Text'.
Pej. no te valdrian para un label [aunque podrias adaptarlo]). Solo tendrias
que modificar las constantes: 'controles' [poniendo todos los controles en
los que se introduzcan/seleccionen los datos, excepto los dos textbox
iniciales] y 'nro_col' [poniendo el nº de columna de tu lista que se
corresponda con el correspondiente control]. OJO: aqui es importante que
coincidan tanto el nº de controles y columnas, como su orden ( es decir, en
nro_col, el nº de columna debe ir en la misma posicion que su
correspondiente control en 'controles'). Tambien ten en cuenta que en ambos
casos los datos entre las comillas deben ir separados por UN espacio (solo
uno), y no deben tener espacios ni antes del primer dato, ni despues del
ultimo. Son para 'trabajar' con la funcion split.

la otra cosa a tener en cuenta [que creo ya tenias solucionado], seria el
introducir numeros(no texto) en los textbox. Aunque no pasaria nada,
consideraria que esta vacio. Asimismo, si introduces en el segundo textbox
un nº menor que en el 1º, se considera solo el nº del 1º

y, por supuesto asegurarte de que los nombres (diversos) se correspondan con
los existentes.

ya no necesitas hojas ocultas, las crea y elimina (... bueno, eso si,
tendras que tener un maximo de ... 2 hojas menos de las permitidas)

bueno, a ver que tal

un saludo y hasta pronto
Ivan

elimina todo el codigo, tanto del formulario como del modulo normal y pega
esto directamente en el de el formulario: (ojo a los saltos de linea y a los
trunques en el foro)

Option Explicit
Private Const LISTA As String = "Hoja1"
Private Const REPORTE As String = "Hoja5"
Private Const OCULTA As String = "hj_Oculta"
Private Const FILTRO As String = "hj_Filtro"
Private Const CAMPOS As String = "NºTalon Ciudad Cliente"
Private Const CONTROLES As String = "ComboBox1 ComboBox2"
Private Const NRO_COL As String = "2 3"
'--
Sub ListaVacia()
MsgBox "La lista de busqueda esta vacia"
End Sub
Sub SinCoincidencias()
MsgBox "No hay coincidencias"
End Sub
Sub SinDatos()
MsgBox "No has introducido ningun dato"
End Sub
Sub Correcto()
MsgBox "El dato se ha cargado correctamente"
End Sub
'-
Sub EliminarHojas()
Application.DisplayAlerts = False
On Error Resume Next
With Worksheets(FILTRO)
.Visible = True: .Delete
End With
With Worksheets(OCULTA)
.Visible = True: .Delete
End With
On Error GoTo 0
Application.DisplayAlerts = True
Worksheets(REPORTE).Activate
End Sub
'--
Function Intervalo(ByVal n1 As Long, _
ByVal n2 As Long, _
ByRef nroUnico As Boolean) As String
Dim fUlt As Long, fi1 As Long, fi2 As Long, rango As Range
With Worksheets(LISTA)
If .[a2] = "" Then ListaVacia: Exit Function
If n1 = 0 And n2 = 0 Then Exit Function
fUlt = .[a65536].End(xlUp).Row
With .Range("a1:a" & fUlt)
On Error Resume Next
If n1 <> 0 Then _
fi1 = .Find(n1, .Cells(1, 1), _
xlFormulas, xlWhole).Row
If n2 <> 0 Then _
fi2 = .Find(n2, .Cells(1, 1), _
xlFormulas, xlWhole).Row
On Error GoTo 0
End With
If fi1 = 0 And fi2 = 0 Then Exit Function
Select Case fi2 - fi1
Case Is < 0, Is = 0
Intervalo = "a" & fi1: nroUnico = True
Case Is = fi2
Intervalo = "a" & fi2: nroUnico = True
Case Else
Intervalo = "a" & fi1 & ":a" & fi2
End Select
End With
End Function
'--
Sub PruebaConBucles()
Dim nCt As Byte, n1 As Long, n2 As Long, _
ref As String, strCol As String, DatosCts As Variant, _
Seguir As Boolean, ConDatos As Boolean, DatoUnico As Boolean
strCol = "": n1 = Numero(TextBox1.Text): n2 = Numero(TextBox2.Text)
ConDatos = Datos(DatosCts, strCol)
If n1 = 0 And n2 = 0 And Not ConDatos Then SinDatos: Exit Sub
If n1 > 0 Or n2 > 0 Then
ref = Intervalo(n1, n2, DatoUnico)
If ref <> "" Then
If Not ConDatos Then
Worksheets(LISTA).Range(ref).EntireRow.Copy
Worksheets(REPORTE).[a65536] _
.End(xlUp).Offset(1).PasteSpecial xlPasteValues
Correcto
Exit Sub
Else
With ThisWorkbook: .Worksheets.Add _
after:=.Worksheets(.Worksheets.Count): End With
With ActiveSheet: .Name = OCULTA
.Visible = xlSheetVeryHidden
For nCt = 0 To UBound(Split(CAMPOS))
.Cells(1, nCt + 1) = Split(CAMPOS)(nCt)
Next
Worksheets(LISTA).Range(ref).EntireRow.Copy .[a2]
End With: End If: End If
Else
With ThisWorkbook: .Worksheets.Add _
after:=.Worksheets(.Worksheets.Count): End With
With ActiveSheet: .Name = OCULTA
.Visible = xlSheetVeryHidden
Worksheets(LISTA).UsedRange.Copy .[a1]: End With
End If
If ref = "" And Not ConDatos Then SinCoincidencias: Exit Sub
With ThisWorkbook: .Worksheets.Add _
after:=.Worksheets(.Worksheets.Count): End With
With ActiveSheet: .Name = FILTRO
.Visible = xlSheetVeryHidden: End With
With Worksheets(OCULTA)
For nCt = 0 To UBound(DatosCts)
FiltrarLista OCULTA, FILTRO, DatosCts(nCt), _
Split(strCol)(nCt), Seguir
.UsedRange.Clear: Worksheets(FILTRO).UsedRange.Copy .[a1]
If .[a2] = "" Then: SinCoincidencias: EliminarHojas: Exit Sub
Next
.Range("a2:a" & .[a65536].End(xlUp).Row).EntireRow.Copy
Worksheets(REPORTE).[a65536].End(xlUp).Offset(1).PasteSpecial _
xlPasteValues: Correcto: End With: EliminarHojas
End Sub
'--
Private Sub CommandButton1_Click()
PruebaConBucles
End Sub
'
Function Datos(ByRef strDatos As Variant, _
ByRef strColumnas As String) As Boolean
Dim nCt As Integer, texto As String
strDatos = Array(""): strColumnas = ""
For nCt = 0 To UBound(Split(CONTROLES))
texto = Me.Controls(Split(CONTROLES)(nCt)).Text
If Trim(texto) <> "" Then
If strDatos(0) = "" Then
strDatos(0) = Trim(texto)
Else
ReDim Preserve strDatos(UBound(strDatos) + 1)
strDatos(UBound(strDatos)) = Trim(texto)
End If
strColumnas = Trim(strColumnas & " " & Split(NRO_COL)(nCt))
End If
Next
If strColumnas <> "" Then Datos = True
End Function
'
Public Sub FiltrarColumna(ByVal hj_Bsq As String, _
ByVal col_Bsq As Long)
Dim Lt_Col As String
With Worksheets(hj_Bsq)
.[a:a].Sort key1:=.[a2], order1:=xlAscending, header:=True
If .[a2] = "" Then ListaVacia: Exit Sub
Lt_Col = Chr(64 + col_Bsq)
If .AutoFilterMode Then .AutoFilterMode = False
.[iv:iv].Clear
.Columns(Lt_Col).AdvancedFilter xlFilterCopy, , .[iv1], True
End With
End Sub
'--
Public Sub FiltrarLista(ByVal hj_Bsq As String, _
ByVal hj_Oct As String, ByVal d_Patron As String, _
ByVal Campo_B As Long, ByRef No_Buscar As Boolean)
With Worksheets(hj_Bsq)
If .[a2] = "" Then No_Buscar = True: Exit Sub
If .AutoFilterMode Then .AutoFilterMode = False
.UsedRange.AutoFilter
If .AutoFilterMode Then _
.Range("a1").CurrentRegion.AutoFilter _
Field:=Campo_B, _
Criteria1:=d_Patron
With .AutoFilter.Range
If .Rows.Count > 1 Then
On Error Resume Next
.SpecialCells(xlCellTypeVisible) _
.Copy Worksheets(hj_Oct).Range("a1")
On Error GoTo 0
Else
No_Buscar = True
End If
End With
If .AutoFilterMode Then .AutoFilterMode = False
End With
End Sub
'-
Function Numero(ByRef n_1 As String) As Long
If n_1 = "" Or Not IsNumeric(n_1) Then Exit Function
Numero = CLng(n_1)
End Function
'-
Private Sub UserForm_Initialize()
Filtrar_Columna LISTA, 2
With Worksheets(LISTA)
If .[iv2] <> "" Then _
ComboBox1.List = .Range("iv2:iv" & _
.[iv65536].End(xlUp).Row).Value
Filtrar_Columna LISTA, 3
If .[iv2] <> "" Then _
ComboBox2.List = .Range("iv2:iv" & _
.[iv65536].End(xlUp).Row).Value
End With
End Sub
Respuesta Responder a este mensaje
#7 Ivan
02/05/2007 - 00:03 | Informe spam
hola de nuevo Mariano,

lo 1º disculpame, pues revisando el ultimo codigo, creo que quedaban unos
cuantos flecos, y como supongo que aun andaras interesado en el tema, te
comento:
...
probablemente sea un 'plasta', pero la verdad es que gracias a este hilo he
conseguido sacarme (o al menos casi) una de las espinas que mas tiempo
llevaba clavadas: los dichosos 'Filtros Avanzados', que a pesar de
habermelos explicado (sobre todo HM [gracias mil]) mas de una vez, apenas
habia logrado comprenderlos/aplicarlos para algo mas que una columna.

ahora, tras unas cuantas pruebas para tu caso, empiezo a vislumbrar su
verdadero potencial, que sabia que tenian por los maestros, que ciertamente
es muy alto.

creo que un buen ejemplo de ello es tu consulta, que aunque posiblemente
haya maneras mas rapidas y/o sencillas de resolver, a mi me ha venido de
perlas para conocerlos.

como el codigo ya se ha alargado bastante, y para un adjunto en el foro
quizas tambien sea un poco gr (pesa 80 kb en zip) pongo el archivo con un
ej. con unas cuantas posibilidades, en esta direccion por si quieres/quereis
bajarlo

http://www.sendspace.com/file/a4a3ls

posiblemente tenga muchas redundancias y cosas simplificables (incluso
seguro que se ha colado alguna posibilidad de error, aunque he intentado
prever los que se me han ocurrido), aparte de algo de basura que se me haya
pasado borrar.

si te das cuenta, el codigo es casi totalmente adaptable con solo modificar
las constantes que veras en el Modulo1 (aunque quizas se me haya pasado
algo).

aunque apenas lleva comentarios si he intentado describir someramente cada
constante, variable y procedimientos/funciones. He dejado algunos registros
(las pruebas estan hechas con muchos miles mas, pero para quitar peso al
archivo los he quitado) en la 'Base de datos' por que veas su estructura,
pero puedes añadir los que quieras, o directamente cambiar todo mediante las
constantes (OJO a los comentarios) por tu caso real. (con copias)

bueno, disculpa el rollo, y si quieres le echas un ojo y comentas como te ha
ido o las dudas/problemas que veas

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#8 Insumos
03/05/2007 - 01:36 | Informe spam
Hola Ivan:

Antes que nada muchas gracias por tu ayuda! Y te pido disculpas si he
tardado tanto en contestar, lo que sucede es que hemos estado sin internet
en la oficina hasta el día de hoy. Recién he visto tus mensajes, y baje el
archivo del último. Lo estuve probando y es asombroso eso de los filtros
avanzados. Me gusto mucho la idea, así que voy a empezar a estudiar los
códigos para empezar a comprenderlos, ya que hay muchas cosas nuevas para mi
ahi! De todas formas, había podido solucionar el problema pero llegado a una
solución más primitiva que consistia en un bucle que va registro por
registro fijandose en cada campo si coincide con lo que está en cada
ComboBox o TextBox (e ignorandolo si esta vacio) y poniendo una marca en la
base de datos (una "L") por cada registro que coincide en cada campo. Luego,
mediante otro bucle, simplemente lista los registros que tienen la marca en
todos los campos. Funciona, pero es algo logrado con conocimientos muy
modestos y además debe seguramente irse haciendo cada vez más lento a medida
que aumenta la cantidad de registros. Lo publico abajo por si a alguien le
sirve, pero obviamente tu solución es mucho más avanzada y mejor, por lo que
recomiendo a todos los que les interese el tema que intenten aprender el uso
de esto de los filtros avanzados.
Bueno, cualquier duda que tenga pregunto por este medio.
Muchas gracias por todo!!

Mariano

Código de buscador "primitivo" basado en bucles y marcas:

Private Sub CommandButton7_Click()

Sheets("Base").Range("J:P").ClearContents
Sheets("Reporte2").Cells.ClearContents
Sheets("Reporte2").Range("A1").FormulaR1C1 = "REGISTRO"
Sheets("Reporte2").Range("B1").FormulaR1C1 = "FECHA"
Sheets("Reporte2").Range("C1").FormulaR1C1 = "NÚMERO"
Sheets("Reporte2").Range("D1").FormulaR1C1 = "EMPRESA"
Sheets("Reporte2").Range("E1").FormulaR1C1 = "SUCURSAL"
Sheets("Reporte2").Range("F1").FormulaR1C1 = "BENEFICIARIO"
Sheets("Reporte2").Range("G1").FormulaR1C1 = "CONCEPTO"
Sheets("Reporte2").Range("H1").FormulaR1C1 = "IMPORTE"

Dim SuperceldA As Range

With Worksheets("Base")
If .[A2] <> "" Then
For Each SuperceldA In .Range("A2:A" & _
.[A65536].End(xlUp).Row)
'Número
If TextBox2 = Empty And TextBox3 = Empty Then
SuperceldA.Offset(0, 9) = "L"
Else
If SuperceldA.Offset(0, 2) >= Val(TextBox2) And
SuperceldA.Offset(0, 2) <= Val(TextBox3) Then
SuperceldA.Offset(0, 9) = "L"
End If
End If
'Empresa
If ComboBox2 = Empty Then
SuperceldA.Offset(0, 10) = "L"
Else
If SuperceldA.Offset(0, 3) = ComboBox2 Then
SuperceldA.Offset(0, 10) = "L"
End If
End If
'Sucursal
If ComboBox3 = Empty Then
SuperceldA.Offset(0, 11) = "L"
Else
If SuperceldA.Offset(0, 4) = ComboBox3 Then
SuperceldA.Offset(0, 11) = "L"
End If
End If
'Fecha
If TextBox6 = Empty And TextBox5 = Empty Then
SuperceldA.Offset(0, 12) = "L"
Else
If Val(SuperceldA.Offset(0, 1)) >= Val(TextBox6) And
Val(SuperceldA.Offset(0, 1)) <= Val(TextBox5) Then
SuperceldA.Offset(0, 12) = "L"
End If
End If
'Beneficiario
If ComboBox4 = Empty Then
SuperceldA.Offset(0, 13) = "L"
Else
If SuperceldA.Offset(0, 5) = ComboBox4 Then
SuperceldA.Offset(0, 13) = "L"
End If
End If
'Concepto
If ComboBox5 = Empty Then
SuperceldA.Offset(0, 14) = "L"
Else
If SuperceldA.Offset(0, 6) = ComboBox5 Then
SuperceldA.Offset(0, 14) = "L"
End If
End If
'Concepto
If TextBox4 = Empty Then
SuperceldA.Offset(0, 15) = "L"
Else
If SuperceldA.Offset(0, 7) = Val(TextBox4) Then
SuperceldA.Offset(0, 15) = "L"
End If
End If
Next
End If
End With

With Worksheets("Base")
If .[A2] <> "" Then
For Each SuperceldA In .Range("A2:A" & _
.[A65536].End(xlUp).Row)
If SuperceldA.Offset(0, 9) = "L" And SuperceldA.Offset(0, 10) "L" And SuperceldA.Offset(0, 11) = "L" And SuperceldA.Offset(0, 12) = "L"
And SuperceldA.Offset(0, 13) = "L" And SuperceldA.Offset(0, 14) = "L" And
SuperceldA.Offset(0, 15) = "L" Then
SuperceldA.EntireRow.Copy
Worksheets("Reporte2").[A65536] _
.End(xlUp).Offset(1) _
.PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, _
Transpose:=False
End If
Next
End If
End With

cEldasUmaAs = Worksheets("Reporte2").[H65536].End(xlUp).Address
With Sheets("Reporte2").PageSetup
.PrintArea = "A1:" + cEldasUmaAs
End With

UserForm5.Hide
UserForm1.Hide

Sheets("Reporte2").PrintPreview

UserForm1.Show
UserForm5.Show

End Sub


"Ivan" escribió en el mensaje
news:
hola de nuevo Mariano,

lo 1º disculpame, pues revisando el ultimo codigo, creo que quedaban unos
cuantos flecos, y como supongo que aun andaras interesado en el tema, te
comento:
...
probablemente sea un 'plasta', pero la verdad es que gracias a este hilo


he
conseguido sacarme (o al menos casi) una de las espinas que mas tiempo
llevaba clavadas: los dichosos 'Filtros Avanzados', que a pesar de
habermelos explicado (sobre todo HM [gracias mil]) mas de una vez, apenas
habia logrado comprenderlos/aplicarlos para algo mas que una columna.

ahora, tras unas cuantas pruebas para tu caso, empiezo a vislumbrar su
verdadero potencial, que sabia que tenian por los maestros, que


ciertamente
es muy alto.

creo que un buen ejemplo de ello es tu consulta, que aunque posiblemente
haya maneras mas rapidas y/o sencillas de resolver, a mi me ha venido de
perlas para conocerlos.

como el codigo ya se ha alargado bastante, y para un adjunto en el foro
quizas tambien sea un poco gr (pesa 80 kb en zip) pongo el archivo con un
ej. con unas cuantas posibilidades, en esta direccion por si


quieres/quereis
bajarlo

http://www.sendspace.com/file/a4a3ls

posiblemente tenga muchas redundancias y cosas simplificables (incluso
seguro que se ha colado alguna posibilidad de error, aunque he intentado
prever los que se me han ocurrido), aparte de algo de basura que se me


haya
pasado borrar.

si te das cuenta, el codigo es casi totalmente adaptable con solo


modificar
las constantes que veras en el Modulo1 (aunque quizas se me haya pasado
algo).

aunque apenas lleva comentarios si he intentado describir someramente cada
constante, variable y procedimientos/funciones. He dejado algunos


registros
(las pruebas estan hechas con muchos miles mas, pero para quitar peso al
archivo los he quitado) en la 'Base de datos' por que veas su estructura,
pero puedes añadir los que quieras, o directamente cambiar todo mediante


las
constantes (OJO a los comentarios) por tu caso real. (con copias)

bueno, disculpa el rollo, y si quieres le echas un ojo y comentas como te


ha
ido o las dudas/problemas que veas

un saludo y hasta pronto
Ivan


Respuesta Responder a este mensaje
#9 Ivan
03/05/2007 - 18:29 | Informe spam
hola Mariano,

Y te pido disculpas si he


tardado tanto en contestar, lo que sucede es



no hay nada que disculpar, por un lado por que estaba convencido que
seguias por 'ahi' , y por otro porque cada uno es libre de querer/
poder responder o no una consulta. Aunque hay que reconocer que
siempre resulta mas agradable obtener un cierto feedback.

aparte, gracias tambien a ti, y no solo por el mencionado feedback,
tambien porque, gracias a el, y a tu consulta, he resuelto la duda de
los filtros.Y te aseguro que para mi ha sido una autentica gozada

en cuanto a tu codigo, aunque no lo he podido mirar mucho, decirte que
'me suena' un monton. Creo que seria dificil calcular la cantidad de
kilometros que he debido hacer yendo de bucle en bucle. Y,
posiblemente, gracias a ellos, y por supuesto a estos foros y sus
gentes, poco a poco vas descubriendo otras vias, en ocasiones
sustitutorias y en otras complementarias.

tambien comentarte un par de cosas que me han llamado la atencion, por
si te vienen bien (aunque no te fies demasiado de mi):

1º en cuanto a este parte de tus codigos:

Sheets("Reporte2").Range("A1").FormulaR1C1 = "REGISTRO"
Sheets("Reporte2").Range("B1").FormulaR1C1 = "FECHA"
Sheets("Reporte2").Range("C1")...



que supongo que pone los titulos de campo, (aparte de que hubieras
podido usar una estructura 'WithEnd With') existe una manera
sumamente sencilla, y en mucho menos espacio utilizando la funcion
Array:


Sheets("Reporte2").Range("A1:H1")=Array("REGISTRO","FECHA","NUMERO","EMPRESA","SUCURSAL","ETC..)

como ves sencillo y 'barato' que dicen por ahi

2º por otro lado, y aqui es mas una consulta que una respuesta ¿cual
es el motivo de usar 'Empty' en vez de, pej.: ""? sobre todo es por
que, aunque supongo que es valido (e incluso es posible que mas
efectivo <no tengo ni idea>), es la primera vez que lo veo aplicado
para los casos que tu expones, y, como soy un poco cotillo, supongo
que tus razones tendras. Si te apetece comentarlas, pues una duda
menos.

bueno, de nuevo disculpa el rollo, y un saludo y hasta pronto
Ivan

PD: si vas viendo el tema y sigues interesado, sigo añadiendo
posibilidades al ejemplo (son parte de mis practicas), y, auque las
voy modificando continuamente, creo que hay cosillas interesantes para
ir aprendiendo.
Respuesta Responder a este mensaje
#10 Insumos
04/05/2007 - 22:52 | Informe spam
Hola Ivan:

Como estás? Espero que bien! Me alegra que mi consulta te ha servido para
despejar tus dudas de los filtros. Y espero que otros hayan visto el ejemplo
que hiciste con los filtros porque esta muy bueno y pueden ser de utilidad
para muchos.
En cuanto a tu pregunta de porque yo uso Empty en lugar de "", la verdad que
lo he vsito en los códigos del foro, porque todo lo que se en cuanto a
códigos lo he sacado de acá o (a lo sumo) de alguna página de internet
buscando via google. Creo que la primera vez que lo ví estaba en un código
publicado por KL o Héctor Miguel. Por lo cual no se exactamente si tiene o
no ventajas con otros métodos, pero en varios códigos que tengo en uso está
esa instrucción y hasta ahora siempre me ha funcionado bien. Especialmente
lo tengo en uso en códigos referenciados a objetos como TextBoxes o
ComboBoxes, en que Empty lo toma como que no se ha hecho ninguna imputación
al objeto mencionado, ni por el usuario ni via código. También tengo usado
Empty referenciado a una celda que está vacia y funciona sin inconvenientes.
Por lo que me parece que surte exactamente el mismo efecto que "". Habría
que preguntar a alguien más a ver si sabe de alguna diferencia. Ahora que
recuerdo, la única diferencia que hasta ahora yo he podido encontrar en usar
uno u otro es en el caso de un ComboBox en el que entre las opciones de la
lista hay un o algunos renglones en blanco y que entonces selecciones uno de
esos renglones "vacios" y el código lo interpreta como que es igual a ""
pero que el Combo no está Empty al haberse seleccionado una item de la lista
, entonces en ese caso "" no sería lo mismo a usar la opción Empty (o sea el
código interpreta que el Combo es igual a "" en el caso que se seleccione
una linea en blanco o en el caso en que no se seleccione nada, mientras que
interpreta que el Combo esta Empty sólo si no se selecciona nada).
Por otra parte aprovecho para hacerte algunas preguntas del código del
ejemplo que armaste de los filtros avanzados (por favor disculpas si es muy
básico lo que voy a preguntar):
Que significa Option Explicit?
Hay algunas comandos que nunca habia visto: Ubound, CLng y Preserve. Para
que sirve cada uno?
Para que sirven las variables tipo Boolean? Puede ser que tomen valor True o
False?
Para que sirve poner ByRef, ByVal y Optional ByVal en referencia a las
variables entre los paréntesis de los Sub o Function?
Ya prové lo del Array para los títulos de columnas. Lo usaré de ahora en
más. Un Array se puede usar también para otras cosas más complejas, verdad?
Bueno, creo que muchas preguntas por hoy! Muchas gracias por todo. Y hasta
pronto.
Saludos!

Mariano


"Ivan" escribió en el mensaje
news:
hola Mariano,

Y te pido disculpas si he


tardado tanto en contestar, lo que sucede es



no hay nada que disculpar, por un lado por que estaba convencido que
seguias por 'ahi' , y por otro porque cada uno es libre de querer/
poder responder o no una consulta. Aunque hay que reconocer que
siempre resulta mas agradable obtener un cierto feedback.

aparte, gracias tambien a ti, y no solo por el mencionado feedback,
tambien porque, gracias a el, y a tu consulta, he resuelto la duda de
los filtros.Y te aseguro que para mi ha sido una autentica gozada

en cuanto a tu codigo, aunque no lo he podido mirar mucho, decirte que
'me suena' un monton. Creo que seria dificil calcular la cantidad de
kilometros que he debido hacer yendo de bucle en bucle. Y,
posiblemente, gracias a ellos, y por supuesto a estos foros y sus
gentes, poco a poco vas descubriendo otras vias, en ocasiones
sustitutorias y en otras complementarias.

tambien comentarte un par de cosas que me han llamado la atencion, por
si te vienen bien (aunque no te fies demasiado de mi):

1º en cuanto a este parte de tus codigos:

Sheets("Reporte2").Range("A1").FormulaR1C1 = "REGISTRO"
Sheets("Reporte2").Range("B1").FormulaR1C1 = "FECHA"
Sheets("Reporte2").Range("C1")...



que supongo que pone los titulos de campo, (aparte de que hubieras
podido usar una estructura 'WithEnd With') existe una manera
sumamente sencilla, y en mucho menos espacio utilizando la funcion
Array:


Sheets("Reporte2").Range("A1:H1")=Array("REGISTRO","FECHA","NUMERO","EMPRESA
","SUCURSAL","ETC..)

como ves sencillo y 'barato' que dicen por ahi

2º por otro lado, y aqui es mas una consulta que una respuesta ¿cual
es el motivo de usar 'Empty' en vez de, pej.: ""? sobre todo es por
que, aunque supongo que es valido (e incluso es posible que mas
efectivo <no tengo ni idea>), es la primera vez que lo veo aplicado
para los casos que tu expones, y, como soy un poco cotillo, supongo
que tus razones tendras. Si te apetece comentarlas, pues una duda
menos.

bueno, de nuevo disculpa el rollo, y un saludo y hasta pronto
Ivan

PD: si vas viendo el tema y sigues interesado, sigo añadiendo
posibilidades al ejemplo (son parte de mis practicas), y, auque las
voy modificando continuamente, creo que hay cosillas interesantes para
ir aprendiendo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida