Combobox a otro Combobox filtrandose

24/06/2005 - 21:07 por José A. Castrejón | Informe spam
Buenas tardes, tengo en un archivo 2 hojas : listas y cheques
en la hoja listas tengo defuinido el rango "Cuentas" que abarca de a3 hasta
a13
ejem BBVA, Scotia, Banamex y en la hoja cheques tengo columnas :

A b c d e
Cuenta Cheq Mes Fecha Importe

en un combobox de userform deseo que aparezcan las cuentas del rango
cuentas, hasta ahí voy bien. lo que deseo es que al seleccionar una cuenta,
en el siguiente combobox me aparezcan los cheques que correspondan solo a la
cuenta seleccionada... como lo puedo hacer ?

Como Siempre gracias

Preguntas similare

Leer las respuestas

#11 José A. Castrejón
01/07/2005 - 23:11 | Informe spam
Hola de nuevo, perdon por la tardanza pero estaba fuera, mira ya puse tu
codigo y aunque no entiendo muy bien como funciona probando y estudiando +-
entiendo lo del listbox y el list(listindex), ahora el codigo esta asi

Private Sub ComboBox1_Change()
ListBox1.Clear: ListBox1.ColumnCount = 7

Dim Celda As Range, Fila As Integer

With Worksheets("depositos")
If .[a12].AutoFilter Then .[a12].AutoFilter
.Range(.[a12], .[a65536].End(xlUp)).AutoFilter Field:=1, Criteria1:="="
& ComboBox1
For Each Celda In .Range(.[a12],
.[a65536].End(xlUp)).SpecialCells(xlCellTypeVisible)
ListBox1.AddItem
ListBox1.List(Fila, 0) = Celda.Offset(, 1)
ListBox1.List(Fila, 1) = Celda.Offset(, 2)
ListBox1.List(Fila, 2) = Celda.Offset(, 3)
ListBox1.List(Fila, 3) = Celda.Offset(, 4)
ListBox1.List(Fila, 4) = Celda.Offset(, 5)
ListBox1.List(Fila, 5) = Celda.Offset(, 6)
ListBox1.List(Fila, 6) = Celda.Offset(, 7)

Fila = Fila + 1
Next
.[a1].AutoFilter
End With
End Sub

Private Sub ListBox1_Click()
Dim Fila As Long, Fx As Long, Dato

Fx = Worksheets("DEPOSITOS").[a65536].End(xlUp).Row
With ListBox1
Dato = ComboBox1 & "-" & .List(.ListIndex, 1)
End With
Sheets("depositos").Cells(1.1) = Dato
Fila = Evaluate("Match(""" & Dato & """,Depositos!a1:a" & Fx & "&
""""&Depositos!c1:c" & Fx & "&""""&Depositos!b1:b" & Fx & ",0)")
MsgBox "La fila en la hoja de depositos con el dato seleccionado es la
numero: " & Fila
End Sub

Puse el dato an A1 para ver la resultante, ahora 2 preguntas la funcion
match no la entiendo muy bien y no se si esta funcionando, siempre me dice
que la fila es 1 pero el dato que selecciono esta en a!15 o a16.
creo que me esta diciendo que es la fila 1 del listbox, pero necesito saber
en que fila de la hoja estan los datos
Ahora como lo debo de modificar ?, y por otro lado si en el cmbobox
selecciono una cuenta que no tiene registros me da el error 1004 como lo
evito ?

Porque fila +1 ? si lo cambio a 2 (sin saber que hace) me dice que esta
fuera de intervalo
sdos


"Héctor Miguel" escribió:

hola, José !

> ... hago click en el listbox y aparece un errror 13 en tiempo de ejecucion "No coinciden los tipos"
> en el listbox aparece solo el titulo de una columna que es Fecha y al depurar me manda a la linea :
> Fila = Evaluate("Match(""" & Dato & _
> """,Depositos!a1:a" & Fx & _
> "&""\""&Depositos!c1:c" & Fx & _
> "&""\""&Depositos!d1:d" & Fx & ",0)")

1) [posiblemente] el error 13 se debe a que [en mis supuestos]...
-> asumi que el arreglo de los datos en la hoja 'depositos' es/era como sigue...
colA -> las cuentas -> se 'cargan/selecconan' en el combobox1 -> desde la hoja 'inicio' [o como se llame]
cobB -> las fechas -> que estoy 'omitiendo' en la comparacion y busqueda de la fila por 'convencionalismos regionales'
colC -> los importes -> esta SI la estoy incluyendo en la comparacion y busqueda de la fila
colD -> los conceptos -> esta tambien la incluyo
-> si alguna de las columnas es diferente en la realidad de lo que 'tuve que' suponer... la linea que causa el error se forma +/- asi...
a) usa la misma formula que empleas para localizar los cheques [coincidir()] pero por codigo y en ingles que es 'Match' ;)
b) el dato que se busca [Dato] es una variable que se 'construyo' de concatenar el combobox1 y las columnas 2 y 3 del listbox
c) 'el resto' es 'comparar' el dato 'resultante' con el rango de las columnas 'A', 'C' y 'D' de la hoja 'depositos'
-> 'repito'... si alguna es diferente... habra que adaptarla en el codigo, en la linea donde se presenta el error 13 :-(

2) el que solo 'veas' en el listbox los datos-fecha... [probablemente] no viste el comentario de que el listbox era de 3 columnas -?-
si no lo quieres establecer en tiempo de diseño... puedes [ademas] establecerlo en tiempo de ejecucion ;)
modifica la linea en el evento '_change' del combobox1...
de -> ListBox1.Clear
a -> ListBox1.Clear: ListBox1.ColumnCount = 3

si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.



Respuesta Responder a este mensaje
#12 Héctor Miguel
02/07/2005 - 01:26 | Informe spam
hola, José !

... ya puse tu codigo y aunque no entiendo muy bien como funciona
... +- entiendo lo del listbox y el list(listindex), ahora el codigo esta asi [...]
... puse el dato en A1 para ver la resultante, ahora 2 preguntas


__ 1 __
la funcion match no la entiendo muy bien y no se si esta funcionando
siempre me dice que la fila es 1 pero el dato que selecciono esta en a!15 o a16...
creo que me esta diciendo que es la fila 1 del listbox, pero necesito saber en que fila de la hoja estan los datos
... como lo debo de modificar ?


__ 2 __
... por otro lado si en el combobox selecciono una cuenta que no tiene registros me da el error 1004 como lo evito ?


__ 3 __
Porque fila +1 ? si lo cambio a 2 (sin saber que hace) me dice que esta fuera de intervalo



1) la funcion match [coincidir en castellano] SI 'debe estar trabajando' :)... el 'problema' [seguramente] 'viene de que'...
-> esta 'comparando' [o tratando de comparar] 2 'cosas distintas' :-( [me explico]...
a) la 'intencion' de la variable 'Dato' es/era 'construir' una cadena de texto que estuviera 'conformada' por...
cuenta, importe y concepto [segun imaginaba YO el arreglo o disposicion de los titulos/datos/filas/etc.]
->utilizando el caracter '\' como separador entre los datos y [tambien] entre las celdas del rango donde se busca<-
porque el caracter '\' y no alguno otro como '-' [que es el que utilizaste] ?... por su uso poco 'convencional/normal' en formulas :))
b) la cadena que 'construyes' para la comparacion... en el dato 'de base'...
DOS elementos 'separados' por un guion: ->Dato = ComboBox1 & "-" & .List(.ListIndex, 1)<-
es MUY diferente de la que 'construyes' para comparar cada fila en el rango...
TRES elementos [columnas A, C y B de la hoja depositos] 'separados' por... nada... una cadena 'vacia' :-(
->Evaluate("Match(""" & Dato & """,Depositos!a1:a" & Fx & "& """"&Depositos!c1:c" & Fx & "&""""&Depositos!b1:b" & Fx & ",0)")<-

2) [como primera alternativa]... prueba a poner la siguiente instruccion DESPUES DE 'Limpiar' el listbox...
en el modulo de codigo del formulario... en el evento '_change' del combobox1 == If Application.CountIf(Worksheets("depositos").Columns("a"), ComboBox1) = 0 Then Exit Sub

3) los elementos en combos y listas 'se cuentan' iniciando de 0 [cero] y 'hasta' n_elementos MENOS 1 [uno]... entonces...
cuando se agrega un elemento al listbox con la instruccion: ->ListBox1.AddItem<- [en el evento '_change' del combo]...
-> la primera linea que se inserta lleva el numero de indice de 0 [cero]... -igual que la variable 'Fila' por omision]
-> despues de haber agregado los datos en sus columnas... la variable 'Fila' SE PREPARA para el siguiente INDICE...
que [obviamente] se necesita ir 'incrementando'... DE UNO EN UNO... y cuando la modificas a Fila = Fila + 2...
el codigo 'se molesta'... <\°|°/> y te manda el error 1004 [en otras palabras... no puedes agregar la fila 5 si solo llevas 3] :-(

espero no haberte confundido con tanto 'rollo' :)) y... si cualquier duda... comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#13 José A. Castrejón
05/07/2005 - 18:38 | Informe spam
Hola hector, ya esta funcionando, sin embargo tuve que hacer algunos cambios
pues realmente aunque estaba comparando cadenas completas, la repeticion de
datos es posible, asi que tuve que aumentar una columna de control (un
consecutivo ), el codigo quedo de esta manera, gracias por tuis respuestas
fue muy ilustrativo y sobre todo aprendi bastante, sigo con mi desarrollo y
si me atoro en otra cosa lo pongo en un nuevo post
gracias de nuevo
comentas ?


Private Sub ComboBox1_Change()

On Error GoTo ManejoDeError

ListBox1.Clear: ListBox1.ColumnCount = 7
Dim Celda As Range, Fila As Integer, CuentaFila As Integer

With Worksheets("depositos")
If .[a12].AutoFilter Then .[a12].AutoFilter
.Range(.[a12], .[a65536].End(xlUp)).AutoFilter Field:=1, Criteria1:="="
& ComboBox1

For Each Celda In .Range(.[a12],
.[a65536].End(xlUp)).SpecialCells(xlCellTypeVisible)
ListBox1.AddItem
ListBox1.List(Fila, 0) = Celda.Offset(, 1)
ListBox1.List(Fila, 1) = Celda.Offset(, 2)
ListBox1.List(Fila, 2) = Celda.Offset(, 3)
ListBox1.List(Fila, 3) = Celda.Offset(, 5)
'ListBox1.List(Fila, 4) = Celda.Offset(, 6)
ListBox1.List(Fila, 5) = Celda.Offset(, 4)
ListBox1.List(Fila, 6) = Celda.Offset(, 7)
ListBox1.List(Fila, 7) = Celda.Offset(, 8)
Fila = Fila + 1
Next
.[a1].AutoFilter
End With

MiSalida:
Exit Sub

ManejoDeError:
If Err.Number = 1004 Then
MsgBox "No hay depositos en ésta cuenta ! ", vbCritical, "Seleccion
Incorrecta"
Resume MiSalida
Else
MsgBox Err.Description
Resume MiSalida
End If

Private Sub ListBox1_Click()
Dim Fila As Long, Fx As Long, Dato

'Fx = Worksheets("DEPOSITOS").[a65536].End(xlUp).Row

' numero de fila lo tima del listbox

NumFila = ListBox1.List(ListBox1.ListIndex, 6)

'pone numero de fila en listas
Sheets("LISTAS").Cells(44, 2) = NumFila

'pone la fecha en listas

Sheets("LISTAS").Cells(44, 3) = Sheets("DEPOSITOS").Cells(NumFila, 2)

'pone el dia a modificar
Sheets("LISTAS").Cells(2, 3) = Sheets("LISTAS").Cells(44, 4)

'pone el mes a modificar en listas
Sheets("LISTAS").Cells(2, 4) = Sheets("LISTAS").Cells(44, 5)

Sheets("LISTAS").Cells(8, 11) = Importe.Text

Cuenta.Text = Sheets("DEPOSITOS").Cells(NumFila, 1)
Importe.Text = Sheets("DEPOSITOS").Cells(NumFila, 6)
Importe.Text = Format(Importe, "#,###,##0.00")

Dia.Text = Sheets("LISTAS").Cells(2, 3)
Mes.Text = Sheets("LISTAS").Cells(2, 4)
Factura.Text = Sheets("DEPOSITOS").Cells(NumFila, 3)
NC.Text = Sheets("DEPOSITOS").Cells(NumFila, 4)
Concepto.Text = Sheets("DEPOSITOS").Cells(NumFila, 5)


End Sub

"Héctor Miguel" escribió:

hola, José !

> ... ya puse tu codigo y aunque no entiendo muy bien como funciona
> ... +- entiendo lo del listbox y el list(listindex), ahora el codigo esta asi [...]
> ... puse el dato en A1 para ver la resultante, ahora 2 preguntas
__ 1 __
> la funcion match no la entiendo muy bien y no se si esta funcionando
> siempre me dice que la fila es 1 pero el dato que selecciono esta en a!15 o a16...
> creo que me esta diciendo que es la fila 1 del listbox, pero necesito saber en que fila de la hoja estan los datos
> ... como lo debo de modificar ?
__ 2 __
> ... por otro lado si en el combobox selecciono una cuenta que no tiene registros me da el error 1004 como lo evito ?
__ 3 __
> Porque fila +1 ? si lo cambio a 2 (sin saber que hace) me dice que esta fuera de intervalo

1) la funcion match [coincidir en castellano] SI 'debe estar trabajando' :)... el 'problema' [seguramente] 'viene de que'...
-> esta 'comparando' [o tratando de comparar] 2 'cosas distintas' :-( [me explico]...
a) la 'intencion' de la variable 'Dato' es/era 'construir' una cadena de texto que estuviera 'conformada' por...
cuenta, importe y concepto [segun imaginaba YO el arreglo o disposicion de los titulos/datos/filas/etc.]
->utilizando el caracter '\' como separador entre los datos y [tambien] entre las celdas del rango donde se busca<-
porque el caracter '\' y no alguno otro como '-' [que es el que utilizaste] ?... por su uso poco 'convencional/normal' en formulas :))
b) la cadena que 'construyes' para la comparacion... en el dato 'de base'...
DOS elementos 'separados' por un guion: ->Dato = ComboBox1 & "-" & .List(.ListIndex, 1)<-
es MUY diferente de la que 'construyes' para comparar cada fila en el rango...
TRES elementos [columnas A, C y B de la hoja depositos] 'separados' por... nada... una cadena 'vacia' :-(
->Evaluate("Match(""" & Dato & """,Depositos!a1:a" & Fx & "& """"&Depositos!c1:c" & Fx & "&""""&Depositos!b1:b" & Fx & ",0)")<-

2) [como primera alternativa]... prueba a poner la siguiente instruccion DESPUES DE 'Limpiar' el listbox...
en el modulo de codigo del formulario... en el evento '_change' del combobox1 ==> If Application.CountIf(Worksheets("depositos").Columns("a"), ComboBox1) = 0 Then Exit Sub

3) los elementos en combos y listas 'se cuentan' iniciando de 0 [cero] y 'hasta' n_elementos MENOS 1 [uno]... entonces...
cuando se agrega un elemento al listbox con la instruccion: ->ListBox1.AddItem<- [en el evento '_change' del combo]...
-> la primera linea que se inserta lleva el numero de indice de 0 [cero]... -igual que la variable 'Fila' por omision]
-> despues de haber agregado los datos en sus columnas... la variable 'Fila' SE PREPARA para el siguiente INDICE...
que [obviamente] se necesita ir 'incrementando'... DE UNO EN UNO... y cuando la modificas a Fila = Fila + 2...
el codigo 'se molesta'... <\°|°/> y te manda el error 1004 [en otras palabras... no puedes agregar la fila 5 si solo llevas 3] :-(

espero no haberte confundido con tanto 'rollo' :)) y... si cualquier duda... comentas?
saludos,
hector.



Respuesta Responder a este mensaje
#14 Héctor Miguel
05/07/2005 - 19:56 | Informe spam
hola, José !

... ya esta funcionando, sin embargo tuve que hacer algunos cambios
... aunque estaba comparando cadenas completas, la repeticion de datos es posible
... tuve que aumentar una columna de control (un consecutivo) el codigo quedo de esta manera [...]
comentas ?



[solamente] uno [o dos, o tres] 'comentarios' :))
1) [creo que] el 'manejo de errores' [tal como lo estas 'manejando']...
a) [de todas formas] esta 'dejando' que 'corra' el filtro para buscar datos que [realmente] no va a encontrar :-(
b) NO esta 'evitando' que el listbox quede 'lleno' de datos que [realmente] no son 'apegados' a la busqueda -?-
[aunque el dato 'buscado' sea 'inexistente'] :-(
c) [ademas de que]... esta 'omitiendo' restablecer/quitar/... el autofiltro -?-
2) [supongo que] la columna [de control] que agregaste [probablemente] contenga una funcion del tipo =Fila() -?-
3) no se cuantas 'coincidencias' [realmente] podrias tener donde 'coincidan' [exactamente] fecha, monto y concepto -?-

si lo anterior esta funcionando [tal cual o +/-] como lo requieres... [probablemente]...
solo te recomendaria 'evitar' [si te conviene] lo comentado en el punto uno :))
lo que podrias conseguir segun comentario anterior que 'decia' +/-...
2) [como primera alternativa]... prueba a poner la siguiente instruccion DESPUES DE 'Limpiar' el listbox...
en el modulo de codigo del formulario... en el evento '_change' del combobox1 ==> If Application.CountIf(Worksheets("depositos").Columns("a"), ComboBox1) = 0 Then Exit Sub


con una ligera adaptacion +/- a lo siguiente [con lo que podrias 'prescindir' del manejo de errores] :)
Respuesta Responder a este mensaje
#15 Héctor Miguel
05/07/2005 - 19:58 | Informe spam
hola, José !

=> perdon... el mensaje anterior 'se me chispotio' :))

... ya esta funcionando, sin embargo tuve que hacer algunos cambios
... aunque estaba comparando cadenas completas, la repeticion de datos es posible
... tuve que aumentar una columna de control (un consecutivo) el codigo quedo de esta manera [...]
comentas ?



[solamente] uno [o dos, o tres] 'comentarios' :))
1) [creo que] el 'manejo de errores' [tal como lo estas 'manejando']...
a) [de todas formas] esta 'dejando' que 'corra' el filtro para buscar datos que [realmente] no va a encontrar :-(
b) NO esta 'evitando' que el listbox quede 'lleno' de datos que [realmente] no son 'apegados' a la busqueda -?-
[aunque el dato 'buscado' sea 'inexistente'] :-(
c) [ademas de que]... esta 'omitiendo' restablecer/quitar/... el autofiltro -?-
2) [supongo que] la columna [de control] que agregaste [probablemente] contenga una funcion del tipo =Fila() -?-
3) no se cuantas 'coincidencias' [realmente] podrias tener donde 'coincidan' [exactamente] fecha, monto y concepto -?-

si lo anterior esta funcionando [tal cual o +/-] como lo requieres... [probablemente]...
solo te recomendaria 'evitar' [si te conviene] lo comentado en el punto uno :))
lo que podrias conseguir segun comentario anterior que 'decia' +/-...
2) [como primera alternativa]... prueba a poner la siguiente instruccion DESPUES DE 'Limpiar' el listbox...
en el modulo de codigo del formulario... en el evento '_change' del combobox1 ==> If Application.CountIf(Worksheets("depositos").Columns("a"), ComboBox1) = 0 Then Exit Sub


con una ligera adaptacion +/- a lo siguiente [con lo que podrias 'prescindir' del manejo de errores] :)
en el modulo de codigo del formulario ==Private Sub ComboBox1_Change()
ListBox1.Clear: ListBox1.ColumnCount = 7
If Application.CountIf(Worksheets("depositos").Columns("a"), ComboBox1) = 0 _
Then MsgBox "No hay depositos en esta cuenta ! ", vbCritical, "Seleccion Incorrecta": Exit Sub
' [aqui sigue el resto del codigo SIN el manejo de errores] ... ;)

si cualquier duda... comentas?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida