Cuestionario y auto desplegable con respuesta

Hola! Uso la versión 2003. No entiendo de programación VBa...
Quiero
crear un cuestionario con tres menús: destino (unas 50 variables)
horario: (diurno o nocturno) y origen (4 ó 5) variables. Tengo creada la
tabla con los distintos precios ordenada en 50 filas (destinos) y 5
columnas dobles (orígenes x2 horarios). Lo de crear las listas
despleglables, está controlado, lo hago con validación, permitir lista.
No consigo ajustar ninguna formula para que me arroje el resultado de la
celda a la que hacen referencia los desp. Como he visto en varios
tutoriales que me podría dar problemas al no estar en los encabezados,
podría optar a unir en 10 celdas las 5 dobles, pero aun así la formulas
BUSCAR, INDICE, etc no me dan el resultado buscado, sino errores.
Agradecido de antemano.

Un saludo de otro autodidacta.

1 Respuesta

Respuesta
1

Con tu explicación no estoy seguro de entenderte. Veamos, cuando eliges un desplegable la celda en la que está toma el valor elegido. Si ahora quieres que en función de ese valor se escoja otro de la misma fila que corresponde al valor escogido la función que necesitas es casi seguro VLOOKUP, (BUSCARV)

¿Has probado eso? Eso sí tienen que estar los valores ordenados para que te funcione.

De lo contrario indica un sencillo ejemplo con los valores y la fórmula que te da los problemas.

Hola de nuevo!

He probado la función que dices "BUSCARV", pero como la respuesta tiene que venir de la combinación de 2 o 3 despleglables distintos no sé los pasos a seguir.

Te explico mejor el proyecto, con el fin de insertarlo posteriormente en una web, pero ese es otro tema, quiero crear algo muy parecido a lo que utilizamos en las webs de búsquedas de vuelos. Permitir seleccionar un destino, origen y horario con sus respectivos menús, y que se muestre el precio, eso lo haré con una macro, pero no lo consigo.

Muchas gracias.

Creo que lo siguiente hace lo que necesitas. En mi ejemplo en lugar de destino, origen y horario he usado Proveedor, Tipo y Categoría, pero puedes copiar tus valores y cambiar las cabeceras de columna (que no se usan a efectos de código). Escribe en las columnas A, B y C lo siguiente o similar:

Columna1; Columna2; Columna3
Proveedor1; Tipo1; Categoría1
Proveedor2; Tipo3; Categoría1
Proveedor3; Tipo1; Categoría2
Proveedor1; Tipo1; Categoría4
Proveedor1; Tipo2; Categoría2
Proveedor4; Tipo5; Categoria3

Crea tres Combobox y asegurate que se llaman Combobox1, Combobox2 y Combobox3. Crea también un botón de Inicio que se llame CommandButton1. Todo esto son controles ActiveX y supongo que que sabes como insertarlos en la página.

Ahora ve al editor de VBA, selecciona la página donde están los controles e inserta el código. No lo insertes en un módulo, sino en la página que contiene los controles y los datos.

Option Explicit
Private Sub ComboBox1_Change()
Dim s As String
Dim e As Integer
Dim i As Integer
Dim maxi As Integer
Dim maxj As Integer
Dim m As Integer
'Para enseñar cambio el color de fuente del elemento elegido en la fila 12
e = ComboBox1.ListIndex 'los listindex empiezan en cero si hay seleccion
If e + 1 > 0 Then 'si no el combo no esta cargado y se activo el evento de cambio por el clear
 Cells(e + 1, 12).Font.ColorIndex = 3
 Call Relaciona(ComboBox1.Text, 2, 1, 1, 13) 'Coloreo las parejas
 Call CargaCom(13, ComboBox2, 3)
End If
End Sub
Private Sub ComboBox2_Change()
Dim e As Integer
e = ComboBox2.ListIndex '-1 si no es por selección de elemento
If e + 1 > 0 Then 'si no el combo no esta cargado y se activó el evento de cambio por el clear
 Call Relaciona(ComboBox2.Text, 2, 2, 1, 14) 'Coloreo las parejas
 Call CargaCom(14, ComboBox3, 3)
End If
End Sub
Private Sub CommandButton1_Click()
Dim i As Integer
Dim maxi As Integer
Dim s As String
'pone color negro en la fuente de las columnas de trabajo
Columns("L:N").Select
Selection.Font.ColorIndex = 1
Range("A1").Select
'borra los combos
ComboBox1.Clear
ComboBox2.Clear
ComboBox3.Clear
maxi = Cells(1, 1).End(xlDown).Row
Range("L:N").Value = ""
Call CopiaDistintos(1, 2, maxi, 12, 1)
Call CopiaDistintos(2, 2, maxi, 13, 1)
Call CopiaDistintos(3, 2, maxi, 14, 1)
'Carga el primer combo con los valores distintos
Call CargaCom(12, ComboBox1, 1)
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
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
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 Relaciona(s As String, fini As Integer, cini As Integer, ffin As Integer, cfin As Integer)
'Marca en rojo los valores de la columa final que tienen pareja en la siguiente a la inicial
Dim i As Integer
Dim maxi As Integer
Dim maxj As Integer
Dim m As Integer
maxi = Cells(1, cini).End(xlDown).Row
maxj = Cells(1, cfin).End(xlDown).Row
For i = fini To maxi 'recorro la columna inicial buscando el string
 If s = Cells(i, cini) Then 'busco su pareja de la siguiente columna en la columna final
 m = Encuentra(Cells(i, cini + 1).Value, cfin, ffin, maxj)
 If m > 0 Then 'si existe y lo pongo en rojo
 Cells(m, cfin).Font.ColorIndex = 3
 End If
 End If
Next i
End Sub
Sub CargaCom(col As Integer, com As ComboBox, color As Integer)
'Carga el combo con los elementos que estén en color indicado 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
 If Cells(i, col).Font.ColorIndex = color Then
 com.AddItem (Cells(i, col).Value)
 End If
Next i
End Sub

Una vez pulsas el botón de inicio, en las columnas L,M y N verás como funciona el programa a medida que vas seleccionando en los combos los diferentes valores.

Cuando veas y comprendas como funciona puedes eliminar la parte didáctica del código, la que muestra los colores y valores en las columnas L, M y N, y quedarte así solo con lo que necesitas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas