¿ Como puedo enlazar varios criterios de Combobox hacia un Textbox o listbox en VBA?

Mi pregunta mas concretamente se refiere a lo siguiente:

Todo esto es realizado mediante un Userform

En la parte de Userform_Active cargué los datos de mis Combobox mediante dos columnas y el siguiente código

ComboBox1.RowSource = "Combos!B4:B20"

Posteriormente agregue un Textbox y un Botón y a este ultimo le quiero asignar el código que me permita buscar en una hoja en especifico un valor pero esto dependiendo de los valores asignados a los 2 combobox

Un pequeño ejempo:

En el primer combobox se cargan datos de nombres y puedo elegir ROBERTO

En el segundo combobox se cargan datos de edades y eligo 37

Lo que necesito que me arroje es el dato el cual corresponde a ROBERTO de 37 años que se encuentra en otra columna

*Adicional, me parece buena idea cargar los datos de los combobox mediante una matriz, esto es que en el combobox 1 cargue datos en filas y en el combobox cargue datos de columnas y esto es para que al momento de generar los dos criterios me encuentre el cruce de ambos y me lo arroje en un textbox

Anexo imagen ejemplo si es que se puede realizar de esa manera:

Me refiero a que me arroje el valor de color VERDE en Textbox

1 respuesta

Respuesta
1

¿Algo asi?, en el primer combobox se cargan solo los nombres, en el segundo solo las edades y en base a indices encuentra el cruce de datos

y esta es la macro, puedes empezar por cualquiera de los 2 combobox en ambos se validara que el otro tenga datos para hacer el cruce

Private Sub ComboBox1_Change()
Set datos = Range("datos")
With ComboBox1
    nombre = .Value
    indice = .ListIndex + 1
End With
With ComboBox2
    edad = .Value
    indice2 = .ListIndex + 1
End With
If indice > 0 And indice2 > 0 Then
    MsgBox (datos.Cells(indice + 1, indice2 + 1))
End If
set datos=nothing
End Sub
Private Sub ComboBox2_Change()
Set datos = Range("datos")
With ComboBox1
    nombre = .Value
    indice = .ListIndex + 1
End With
With ComboBox2
    edad = .Value
    indice2 = .ListIndex + 1
End With
If indice > 0 And indice2 > 0 Then
    MsgBox (datos.Cells(indice + 1, indice2 + 1))
End If
set datos=nothing
End Sub
Private Sub UserForm_Click()
End Sub
Private Sub UserForm_Initialize()
Set datos = Range("b1").CurrentRegion
With datos
    r = .Rows.Count: c = .Columns.Count
    matriz = .Cells(2, 1).Resize(r - 1, 1)
    matriz2 = .Cells(1, 2).Resize(1, c - 1)
    .Name = "datos"
End With
ComboBox1.List = matriz
ComboBox2.List = WorksheetFunction.Transpose(matriz2)
set datos=nothing: erase matriz: erase matriz2
End Sub

James Bond muchas gracias por tu pronta respuesta

Sin embargo tengo unas dudas con respecto a tus códigos

¿En dónde pones la leyenda "datos" tengo que poner el rango de los datos que quiero guardar en ambos combobox cierto?, esto es de "B4:B20" para el primero y para el segundo "D3:H3".. ¿me dejará poner esos rangos?

¿Y en la ultima que pusiste en userform_initialize puedo ponerla en la de Commandobtton (Botón de buscar)? ¿Pero en donde pusiste que el Rango es "b1" tengo que poner el rango de la matriz?

Este es un ejemplo usando rangos, es muy poco practico, ya que si agregas filas o columnas tendrás que estar cambiando el código cada que lo hagas,

y esta es la macro solo cambia los rangos por los que tu manejes.

Private Sub ComboBox1_Change()
carga
End Sub
Private Sub ComboBox2_Change()
carga
End Sub
Private Sub CommandButton1_Click()
Set datos = Range("b2:b4")
Set edad = Range("c1:e1")
With datos
    r = .Rows.Count: c = .Columns.Count
    matriz = datos
    matriz2 = edad
    .Name = "datos"
End With
ComboBox1.List = matriz
ComboBox2.List = WorksheetFunction.Transpose(matriz2)
Erase matriz: Erase matriz2
Set datos = Nothing: Set edad = Nothing
End Sub
Private Sub UserForm_Initialize()
End Sub
Sub carga()
Set datos = Range("b2:e4")
With ComboBox1
    nombre = .Value
    indice = .ListIndex + 1
End With
With ComboBox2
    edad = .Value
    indice2 = .ListIndex + 1
End With
If indice > 0 And indice2 > 0 Then
    TextBox1.text = datos.Cells(indice, indice2 + 1)
End If
Set datos = Nothing
End Sub

El estar cambiando de rango por el momento no es un problema, primero quisiera entender éste código para poder cambiar el rango automáticamente si es que alimento la base.

Tu macro me parece perfecta sin embargo me sale una falla, no me deja correr la Macro por la siguiente linea:

Combobox1.list=matriz

y honestamente no se porque :/

Si tienes esta instrucción activa en las propiedades del combobox ComboBox1. RowSource = "Combos!B4:B20", o en la línea de código no va a funcionar, necesitas borrarla, si esta activa la macro no va poder cargar el combobox porque este ya tiene una instrucción para cargar la info, o es una o es otra

James Bond, una disculpa por responder tarde 

Aun tengo ciertas dudas, 

Mencionas que no debo de poner el código ya que se estaria repitiendo pero es necesario ponerlo ya que el Userform lo puse de tal forma que apareciera en otra hoja pero los datos son justamente de otra hoja llamada COMBOS

Coloqué tu primer código tal cual y lo fui modificando a mis datos, solamente que tuve que poner el codigo para cargar los combos, ya me arroja un dato en el textbox solamente que no encuentro como enlazar el dato que necesito, te adjuntaré imagenes y espero puedas apoyarme

En la primera imagen es mi base en una pestaña llamada COMBOS y lo que quiero es que me arroje los números adentro de la matriz.

En la segunda imagen es en una pestaña llamada Hoja1 la cual me muestra e userform pero me arroja datos de la misma pestaña ( Elcodigo es el primero que me anexaste, no se que cambiar para que se muestre los numeros adentro de la matriz de la primera imagen)

Adicional

Yo en tu código había primero llamado a hoja COMBOS para que me llamara los datos desde ahí, pero me saca errores en el código

Es muy diferente lo que pides ahora a tu requerimiento inicial, para empezar hay que rehacer una parte de la macro para incluir el listbox, el cual no mencionas cual es su fin, te falta proporcionar las referencias de las celdas donde esta la información y el useform1 oculta datos que me impiden ver que información se requiere para hacer el cruce, si puedes explicar mejor y enviar una imagen sin el userform.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas