Buscar celda desde Combobox dependientes

Hola,
Tengo un userform con 2 combobox, el primer combobox me lista los datos de la columna F sin repetirlos, o sea si hay algún dato repetido sólo sale una vez; el segundo combobox me lista los datos de la columna L dependiendo de que haya elegido en el primer combobox, en este segundo combobox sí se repiten los datos si los hay repetidos.
Ahora lo que quiero es que me busque la celda exacta del dato que elijo en el segundo combobox.
Por ejemplo, teniendo:
    F L
aaaaa 1111
BBBBB 2222
CCCCC 3333
aaaaa 1111
BBBBB 2222
CCCCC 3333
aaaaa 1111
BBBBB 2222
CCCCC 3333
En el primer combobox saldría:
aaaaa
BBBBB
CCCCC
Si elijo "AAAAA", en el segundo combobox me saldría:
1111
1111
1111
Pues bien, quiero que si en este segundo combobox, elijo la tercera línea "1111" y le pulso a buscar, fuera a la celda exacta, que en este caso sería L7, y que si pulso otra vez buscar no vaya a otra celda con "1111", si no que se quede en esa, que no siga buscando más "1111".
Gracias.
Saludos.
Respuesta
Ok, ¿me facilitarías tu archivo con el combo box para estudiarlo? [email protected]

7 respuestas más de otros expertos

Respuesta
1
Se me ocurre que puedes emplear lo siguiente:
Al momento de elegir el valor en el ComboBox2

Private Sub ComboBox2_Change()
Dim valcel, valform As String
Dim fila As Integer
fila = 0
valor = ComboBox2.ListIndex
ffinal = Application.WorksheetFunction.CountA(Range("F:F").Cells)
For I = 1 To ffinal
  valcel = Range("F" & I) & Range("L" & I)
  valform = ComboBox1 & ComboBox2
 If valform = valcel Then
  If valor = fila Then
   Range("L" & I).Select
  End If
  fila = fila + 1
 End If
Next
End Sub
Al momento de pulsar un botón
Private Sub CommandButton1_Click()
Dim valcel, valform As String
Dim fila As Integer
fila = 0
valor = ComboBox2.ListIndex
ffinal = Application.WorksheetFunction.CountA(Range("F:F").Cells)
For I = 1 To ffinal
  valcel = Range("F" & I) & Range("L" & I)
  valform = ComboBox1 & ComboBox2
 If valform = valcel Then
  If valor = fila Then
   Range("L" & I).Select
  End If
  fila = fila + 1
 End If
Next
End Sub
Si tienes duda me lo haces saber
Saludos
Rene Nochebuena
Hola Rene!
Muchas gracias por tu tiempo, funciona muy bien tu solución, pero como no me expliqué bien, pues tengo otro problemilla... (culpa mía!)
Verás, los datos del combobox2 dependientes del combobox1 no siempre son repetitivos... te pongo un ejemplo:
Por ejemplo, teniendo:
    F L
aaaaa 1111
BBBBB 2222
CCCCC 3333
aaaaa xx00
BBBBB 6666
CCCCC 3333
aaaaa 1111
BBBBB 0000
CCCCC 3333
aaaaa 1111
BBBBB 2222
CCCCC 3333
aaaaa yyyy
En el primer combobox saldría:
aaaaa
BBBBB
CCCCC
Si elijo "AAAAA", en el segundo combobox me saldría:
1111
XX00
1111
1111
YYYY
Pues bien, quiero que si en este segundo combobox, elijo la tercera línea "1111" vaya a la celda exacta, que en este caso sería L7, hasta aquí lo hace correctamente, pero lo hace si los datos están repetidos, si no se repiten no va a la celda, quisiera que si elijo XX00 fuera a esa celda, o si elijo YYYY fuera a esa celda.
A ver si puedes ser.
Muchas gracias.
Saludos.
Para evitarlo solo debemos quitar la concatenación del segundo valor
Private Sub ComboBox2_Change()
Dim valcel, valform As String
Dim fila As Integer
fila = 0
valor = ComboBox2.ListIndex
ffinal = Application.WorksheetFunction.CountA(Range("F:F").Cells)
For I = 1 To ffinal
  valcel = Range("F" & I) '& Range("L" & I)
  valform = ComboBox1 '& ComboBox2
 If valform = valcel Then
  If valor = fila Then
   Range("L" & I).Select
  End If
  fila = fila + 1
 End If
 Next
End Sub
Saludos
Rene Nochebuena
Hola Rene!
Muchas gracias por tu ayuda y por tu tiempo, sin ti no lo hubiera conseguido.
Funciona todo perfectamente.
Gracias!
Saludos!!  :O)
Respuesta
1
¿Creo qué en tu caso es mejor usar un filtro avanzado con un listbox pero lo estas aplicando en un userform o en la hoja de excel?
En un userform...
Enviame el archivo y yo te lo arreglo
[email protected]
Hola,
Muchas gracias por tu ofrecimiento, ya lo tengo solucionado, te pongo el código para que lo veas:
********************************************************
Sub CopiaDistintos(colini As Integer, desde As Integer, hasta As Integer, _
colfin As Integer, desdefin As Integer)
Application.ScreenUpdating = False
Dim i As Integer
Dim j As Integer
Range(Cells(desdefin, colfin), Cells(65000, colfin)).Clear 'borra datos de la columna destino
j = desdefin
For i = desde To hasta
If Encuentra(Cells(i, colini).Value, colfin, desdefin, j) = 0 Then 'no esta y lo copio
Cells(j, colfin).Value = Cells(i, colini).Value
j = j + 1
End If
Next i
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("EO1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Hoja1").Sort
        .SetRange Range("EO1:EO65000")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
Application.ScreenUpdating = True
End Sub
Sub CargaCombo(col As Integer, com As ComboBox)
'Carga el combo con los elementos de una columa
Dim i As Integer
Dim maxi As Integer
com.Clear
maxi = Cells(1, col).End(xlDown).Row
For i = 1 To maxi 'cargo el combobox
com.AddItem (Cells(i, col).Value)
Next i
End Sub
Function Encuentra(s As String, col As Integer, desde As Integer, hasta As Integer) As Integer
'Indica la fila donde está lo buscado o 0 si no está
Dim esta As Boolean
Dim i As Integer
esta = False
i = desde - 1
While Not esta And (i < hasta)
i = i + 1
If Cells(i, col).Value = s Then
esta = True
End If
Wend
If esta Then Encuentra = i Else Encuentra = 0
End Function
Private Sub CODIGOPT_BUSCAR_Change()
Dim valcel, valform As String
Dim fila As Integer
fila = 0
valor = CODIGOPT_BUSCAR.ListIndex
ffinal = Application.WorksheetFunction.CountA(Range("F:F").Cells)
For i = 1 To ffinal
  valcel = Range("F" & i) '& Range("L" & i)
  valform = CLIENTE_BUSCAR '& CODIGOPT_BUSCAR
 If valform = valcel Then
  If valor = fila Then
   Range("L" & i).Select
  End If
  fila = fila + 1
 End If
Next
End Sub
Private Sub UserForm_Initialize()
Dim i As Integer
Dim maxi As Integer
Dim s As String
maxi = Cells(1, 6).End(xlDown).Row 'largo de la columna 1 donde está el origen
Call CopiaDistintos(6, 1, maxi, 145, 1) 'copia temporal a la celda (20,1) y sucesivas
Call CargaCombo(145, CLIENTE_BUSCAR)
End Sub
Private Sub CLIENTE_BUSCAR_Change()
Dim i As Integer
Dim maxi As Integer
CODIGOPT_BUSCAR.Clear
maxi = Cells(1, 12).End(xlDown).Row
For i = 1 To maxi 'cargo el combobox
If Cells(i, 6).Value = CLIENTE_BUSCAR.Text Then
CODIGOPT_BUSCAR.AddItem (Cells(i, 12).Value)
End If
Next i
End Sub
***************************************************
Combobox1 es CLIENTE_BUSCAR
y
Combobox2 es CODIGOPT_BUSCAR
Muchas gracias.
Saludos.
Respuesta
1
Bueno disculpa la espera, pero es que sois unos cuantos preguntando y me cuesta a veces.
El siguiente código lo tienes que poner en un Módulo, por ejemplo el Modulo1.
Sub CopiaDistintos(ro As Range, rd As Range)
Dim c As Range
Dim d As Range
Dim tm As Range
Dim i As Integer
Dim esta As Boolean
i = 0
For Each c In ro
    esta = False
    If tm Is Nothing Then
        Set tm = c
    Else
        For Each d In tm 'no es muy eficiente pero...
            If c = d Then esta = True
        Next d
    End If
    If Not esta Then 'copio al destino la celda
        rd.Offset(i, 0) = c
        Set tm = Union(tm, c)
        i = i + 1
        esta = False
    End If
Next c
End Sub
Sub BuscaPar(ro1 As Range, ro2 As Range, target As Range, rd As Range)
'Busca en ro1 el dato target y añade a rd la pareja de ro2
Dim i As Integer
Dim c As Range
i = 0
For Each c In ro1
    If target = c Then 'añado su pareja
        rd.Offset(i, 0) = Cells(c.Row, ro2.Column)
        rd.Offset(i, 1) = c.Row ' al lado pongo la fila
        i = i + 1
    End If
Next c
End Sub
Y esta parte dentro del formulario que contiene los dos combobox.
Private Sub ComboBox1_Change()
    Call BuscaPar(Range("f1:f9"), Range("l1:l9"), _
         Range("g" & 1 + ComboBox1.ListIndex), Range("m1"))
    ComboBox2.Clear
    For Each c In Range(Range("m1"), Range("m1").End(xlDown))
        Me.ComboBox2.AddItem (c)
    Next c
End Sub
Private Sub ComboBox2_Change()
Dim fila As Integer
    If ComboBox2.ListIndex > -1 Then 'ha sido un cambio al elegir no por clear
        fila = Range("n" & 1 + ComboBox2.ListIndex).Value
        Range("l" & fila).Select
    End If
End Sub
Sub userform_Initialize()
Call CopiaDistintos(Range("f1:f9"), Range("g1"))
    ComboBox1.Clear
    For Each c In Range(Range("g1"), Range("g1").End(xlDown))
        Me.ComboBox1.AddItem (c)
    Next c
End Sub
Luego tienes que ejecutar el formulario bien desde el editor de VBA o con un botón en la hoja al que le asocias el código.
Private Sub CommandButton1_Click()
    UserForm1.Show
End Sub
Para que veas como trabaja el código y lo puedas adaptar a tus necesidades hago que la selección del combo 1 se copia a partir de G2 y la del segundo a partir de M1. Al lado en la columna N está la fila del elemento que queda seleccionado cuando eliges los dos valores en los dos combo. Conviene borrar las columnas G, M y L para que veas bien como funciona. Una vez lo compruebes y entiendas lo puedes adaptar a tus gustos y posiblemente no necesitarás copiar valores en la hoja.
Respuesta
1
Ok creo haber entendido tu pregunta. La solución es acudir a los códigos de VBA untilizando la propiedad index del mismo. Utiliza un bucle y las sencias if- Si tienes dudas aquí estoy para servirte.
Respuesta
1
No veo la forma de hacer ello en excel, si lo averiguas no dejes de informarme.
Respuesta
1
Debes hacer una tabla dinámica:
Aquí te dejo el link de un video tutorial para que aprendas a crearlas.
http://www.youtube.com/watch?v=Z_G2rC4qurk
La opción de búsqueda de referencia... hey! Ya había respondido este tema y había enviado hasta un link en donde descargar una hoja de calculo de ejemplo.
Para lo segundo te recomendaría usar el filtrado avanzado.
Respuesta
1
Siempre te mostraría los datos como si usarás un buscarv
los datos de la columna L se ensuentran repetidos al igual que de la columna F.
Busca la manera que los datos de ambas columnas no sean repetidos, usa un consecutivo; coloca caracteres en mayúsculas o minúsculas... etc...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas