Vincular combobox sin repetir dato inicial

Tengo en una misma hoja datos en la columna A y en la columna DE, los datos se corresponden entre si, o sea, A1 con D1, A2 con D2... Etc. Quisiera hacer un useform con dos combobox, en el combobox1 que se listen los datos de la columna A, y que al seleccionar un dato salga en el comobobox2 su dato correspondiente de la columna D.
En la columna A, hay datos que se repiten en distintas celdas, quisiera que sólo saliera una vez en el combobox1 los que se repitan, y que al seleccionarlo, salga en el combobox2 los datos relacionados con ese valor de la columna D. Es decir, un ejemplo:
Columna-A columna-D
   Aaaa 0000
   BBBB 1111
   CCCC 2222
   Aaaa 3333
Que con este ejemplo, en el combobox1 sólo saliera una vez "AAAA", y que al seleccionarlo, en el combobox2 salga en la lista "0000" y "3333". Y así sucesivamente si se repitiese 3 o 4 o las veces que sea.

9 Respuestas

Respuesta
1
-Ante todo, me disculpo por el silencio, debido a razones de agenda. Y entrando en materia, sepa que toda la explicación que voy a darte es para que entiendas la dinámica del código.
-Para este caso y otros muchos, siempre hay varias alternativas, pero tomaremos la que mejor nos vengas. Vamos a establecer dos aéreas a modo de tablas de datos, donde uno contendrá los valores del ComboBox1 y el otro, los valores del ComboBox2.
-En el área uno aparece la lista de datos que llamaremos Padre, y en ella los nombres no se repiten. Esta lista solo tiene un campo que a la vez llamamos Clave.
Clave
--------
A
B
C
.
n
-La lista dos, a la que llamaremos Hijo, tiene dos campos, Uno que llamaremos, Puntero, y que contendrá las claves de Padre, y el otro que llamaremos Valores, que es el contenido de cada clave. Esto se ve así:
Puntero Valor
---------- -------
   A whisky
   B Agua
   C Vino
   A Sidra
   A Vinagre
   C Limón
   A Aceite
-Este es el planteamiento a nivel de los datos. Ahora bien, es obvio que este tipo de tratamientos no podemos dejar de lado a VBA, si queremos un resultado consistente.
-Si tuviésemos que cargar el ComboBox1 desde la columna 'Puntero', la cosa sería mucho más complicada. Por lo que las tres columnas son necesarias.
-Para el tratamiento de estos datos se recurará al código siguiente, una vez creado el UserForm y colocado los dos ComboBox:
Option Explicit
Dim Fil As Integer, Col As Integer
Private Sub ComboBox1_click()
    Fil = 2: Col = 1
    With ComboBox2
        .Clear
        Do
            If Cells(Fil, Col + 2) = ComboBox1.Value Then
                .AddItem Cells(Fil, Col + 3)
            End If
            Fil = Fil + 1
        Loop Until Cells(Fil, Col + 2) = Empty
    End With
End Sub
Private Sub UserForm_Initialize()
    Fil = 2: Col = 1
    Do
        If Cells(Fil, Col) <> Empty Then
            ComboBox1.AddItem Cells(Fil, Col)
        Else
            Exit Do
        End If
        Fil = Fil + 1
    Loop
End Sub
Suponiendo que las claves únicas están en la columna A de una hoja de trabajo cualquiera, damos por sentado que la fila 1 de la HT (hoja de trabajo) contiene los títulos de los campos. Ten en cuenta que las dos áreas no tienen mucho que ver, pueden estar separadas por una Columna, o estar en diferentes HT.
El condigo básicamente funciona de la siguiente manera:
Se inicializan las variables de fila y columna, Fil y Col.
Se cargan el ComboBox1, con los datos de la columna A
Este proceso se hace durante la carga del formulario.
Respecto al ComboBox2. Suponiendo que el puntero está en la columna C y los valores en la columna DE, al hacer un clic en el combobox1, se cargarán los valores del Combobox2 que coincidan cola la clave.
Esta es en resumen la explicación del código. Es posible que otro experto piense en otro planteamiento, pero para mí, este es el que propongo, y espero que sirva de ayuda. A mi funciona bien, ais que a ti también debería funcionarte. Para cualquier otra pregunta no dudes en contar conmigo.
Respuesta
1
Lo primero que debes hacer es llenar el combobox1 al iniciar el formulario con el siguiente código:
Private Sub UserForm_Initialize()
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
 If InStr(cadena, ActiveCell) = 0 Then
  cadena = cadena & " " & ActiveCell
 End If
 ActiveCell.Offset(1, 0).Select
Loop
 cadena = Right(cadena, Len(cadena) - 1)
 valor = Split(cadena, " ")
For i = 0 To UBound(valor)
 ComboBox1.AddItem valor(i)
Next
End Sub
'Una vez que llenaste los datos del combobox1 y dependiendo del valor seleccionado debes llenar el combobox2 con este código:
Private Sub ComboBox1_Change()
ComboBox2.Clear
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
 If ActiveCell.Value = ComboBox1.Value Then
  fila = ActiveCell.Row
  ComboBox2.AddItem Range("D" & fila).Value
 End If
 ActiveCell.Offset(1, 0).Select
Loop
End Sub
'
Respuesta
1
Si lo entendí, mira, en excel no se me ocurre una forma que simplifique los valores de la columna A y agrupe los de la columna B, en access ´podría ser pero no aquí... sorry
Respuesta
1
No entiendo lo que necesitas, y no sé lo que es useform y combobox. Esta vez, como dice es programa "paso la pregunta a otro experto".
Respuesta
1
Usa una tabla dinámica checa este link y descarga el archivo, es un ejemplo que te mando según el ejemplo que tu me dices.
En el te muestro los resultados de 2 diferentes ejemplos de tabla dinámica. No tiene virus el archivo.
http://www.mediafire.com/?qep7k74ek789hlg
La tabla dinámica es sencilla crearla te dejo este otro link de un video tutorial en youtube que te dice como realizarla.
http://www.youtube.com/watch?v=Z_G2rC4qurk
Se me hace sencillo que cheques esta forma ya que de una forma escrita es muy tedioso.
Hola,
gracias por tu respuesta, mi consulta era que lo hiciera en un userform, me lo solucionaron con este código:
'Lo primero que debes hacer es llenar el combobox1 al iniciar el formulario con el siguiente código:
Private Sub UserForm_Initialize()
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
 If InStr(cadena, ActiveCell) = 0 Then
  cadena = cadena & " " & ActiveCell
 End If
 ActiveCell.Offset(1, 0).Select
Loop
 cadena = Right(cadena, Len(cadena) - 1)
 valor = Split(cadena, " ")
For i = 0 To UBound(valor)
 ComboBox1.AddItem valor(i)
Next
End Sub
'Una vez que llenaste los datos del combobox1 y dependiendo del valor seleccionado debes llenar el  combobox2 con este código:
Private Sub ComboBox1_Change()
ComboBox2.Clear
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
 If ActiveCell.Value = ComboBox1.Value Then
  fila = ActiveCell.Row
  ComboBox2.AddItem Range("D" & fila).Value
 End If
 ActiveCell.Offset(1, 0).Select
Loop
End Sub
Gracias por tu tiempo.
Saludos.
Respuesta
1
Creo que sí que entiendo lo que quieres. Para construir la solución he creado varios procedimientos y funciones, ya que el filtro avanzado de Excel duplica el primer valor o recurrir a errores para generar una colección de objetos únicos no me convence.
En el código del userform1 donde están los dos combobox que pides.
Sub CopiaDistintos(colini As Integer, desde As Integer, hasta As Integer, _
                    colfin As Integer, desdefin As Integer)
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
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 UserForm_Initialize()
Dim i As Integer
Dim maxi As Integer
Dim s As String
maxi = Cells(1, 1).End(xlDown).Row 'largo de la columna 1 donde está el origen
Call CopiaDistintos(1, 1, maxi, 20, 1)  'copia temporal a la celda (20,1) y sucesivas
Call CargaCombo(20, ComboBox1)
End Sub
Private Sub ComboBox1_Change()
Dim i As Integer
Dim maxi As Integer
ComboBox2.Clear
maxi = Cells(1, 2).End(xlDown).Row
For i = 1 To maxi 'cargo el combobox2
    If Cells(i, 1).Value = ComboBox1.Text Then
        ComboBox2.AddItem (Cells(i, 2).Value)
    End If
Next i
End Sub
Este código copia los valores únicos de la columna a la columna 20 para hacer cálculos. Si la tienes ocupada con otra cosa cambia adecuadamente el procedimiento CopiaDistintos.
Hola,
muchas gracias por tu respuesta, me lo solucionaron con este código:
'Lo primero que debes hacer es llenar el combobox1 al iniciar el formulario con el siguiente código:
Private Sub UserForm_Initialize()
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
 If InStr(cadena, ActiveCell) = 0 Then
  cadena = cadena & " " & ActiveCell
 End If
 ActiveCell.Offset(1, 0).Select
Loop
 cadena = Right(cadena, Len(cadena) - 1)
 valor = Split(cadena, " ")
For i = 0 To UBound(valor)
 ComboBox1.AddItem valor(i)
Next
End Sub
'Una vez que llenaste los datos del combobox1 y dependiendo del valor seleccionado debes llenar el  combobox2 con este código:
Private Sub ComboBox1_Change()
ComboBox2.Clear
Range("A1").Select
Do While Not IsEmpty(ActiveCell)
 If ActiveCell.Value = ComboBox1.Value Then
  fila = ActiveCell.Row
  ComboBox2.AddItem Range("D" & fila).Value
 End If
 ActiveCell.Offset(1, 0).Select
Loop
End Sub
Gracias por tu tiempo.
Saludos.
Respuesta
1
Disculpa por no haber contestado antes, pero quiero aclararte que no tengo experiencia con VBA en Excel porque apenas me estoy integrando al estudio de programación.
Respuesta
1
Perdón por la tardanza en responder, estuve unos días ausente. Bien creo tener la solución para relacionar ambos combobox de acuerdo al dato correspondiente. Si pudieras darme tu correo te enviaría un ejemplo desarrollado para que puedas aplicarlo.
Respuesta
No puedo ayudarte en esto, lo siento.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas