En macro: Cambiar el tipo de Validación de datos en función del valor de una celda

En una lista desplegable dependiente necesito que según el valor de la primera lista desplegable, en su dependiente pueda escribir. Naturalmente para eso debo cambiar la validación de datos de "Lista" a "Cualquier valor", ¿pero cómo lo consigo?

Ejemplo:

F10 = lista desplegable que contiene "Texto", "País". Seleccionando "País", en G10 se despliega la correspondiente lista de países anteriormente introducidos. Pero si seleccionara "Texto", debería cambiar la Validación de datos de Lista a Cualquier valor para poder escribir en G10.

Naturalmente contemplando la posibilidad de si volviera a seleccionar "País" en F10, en F11 volviera a aparecer la lista desplegable dependiente.

He probado a grabarlo en una macro pero no contempla el valor de F10 ("Texto")... Y me he quedado bloqueado. ¿A alguien se le ocurre como hacerlo?

1 respuesta

Respuesta
1

La macro tenés que colocarla en el Editor, en el objeto HOJA donde vayas a trabajar.

Private Sub Worksheet_Change(ByVal Target As Range)

'x Elsamatilde
If Target.Address = "$F$10" Then
'se controla el valor de la selección en F10
If Target.Value = "Texto" Then
Range("G10").Validation.Delete
Else
'Range("G10").Validation.Delete
Range("G10").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=J1:J4"
End If
Range("G10").Select
End Sub

Ajustá el rango de la validación para G10.

Sdos y no dejes la consulta sin finalizar

Elsa

PD) Todo lo que necesitas saber a la hora de trabajar con 'desplegables' de todo tipo lo encontrarás en la Guía Temática N° 2.

http://aplicaexcel.galeon.com/guias.htm

Gracias Elsa por prestarte a ayudarme.

Desde ya te digo que no la he probado todavía por que soy partidario de comprender y aprender antes que de aprovechar los conocimientos de los demás.

Como ya dije, no domino este tipo de rutinas, así que me permitirás preguntarte por la descripción de tu macro; y más concretamente esto:

Range("G10").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=J1:J4"

No comprendo las características de este comando, ni el por que haces referencia a J1:J4. Podrías explicármelo?

Tampoco entiendo tu comentario de "Ajustá el rango de la validación para G10." Intuyo que quieres decirme que tengo que añadir, o configurar, el "INDIRECTO(F10)" en el Origen de la lista...¿No se puede dejar como estaba en la misma macro?

Gracias nuevamente por el interés.

Te aclaro en la rutina:

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
If Target.Address = "$F$10" Then
'se controla el valor de la selección en F10
If Target.Value = "Texto" Then

'si el valor seleccionado del desplegable que se encuentra en F10 es 'Texto' entonces se quita la validación de la celda G10. Cuando digo que ajustes esta referencia es porque en tu consulta LUEGO HACES MENCIÓN A F11... y no queda claro dónde está la 2da celda con desplegable
Range("G10").Validation.Delete
Else

'Si no es la palabra 'Texto' entonces debe volver a colocar la validación (Validation.Add) con opción Lista (Type:=xlValidateList) y designar el rango asociado. COMO NO INDICAS DÒNDE ESTÀ LA LISTA ASOCIADA puse como ejemplo J1:J4. (*) (**)
Range("G10").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=J1:J4"
End If
Range("G10").Select
End Sub

(*) El resto de los argumentos de la validación son los predeterminados de la opción: Mensaje de Error tiene tilde en Detener y en pestaña Configuraciòn aparece el campo Datos: entre (Operator:= xlBetween). Si bien está desactivado en esta opción y este argumento se puede quitar, dejalo para evitar errores de sintaxis.

(**) En lugar de un rango de valores como en el ejemplo J1:J4, puede ser que tengas un nombre de rango, en ese caso serìa:
Formula1:="=tulista"

Creo que está cada detalle explicado, así que luego de hacer los ajustes necesarios ya la podés probar tranquilo.

Hola de nuevo y nuevamente agradecido.

Ahora comprendo mejor el contexto. Gracias.

Con referencia al F11, debo decir que fue un desliz, se me coló un 1 en vez del 0; siempre me refería a la celda F10 que es donde está la segunda con desplegable.

He transcrito tu macro propuesta y lo primero que me devuelve es que falta un End If. ¿Dónde debo colocarlo?

La formula que tengo en el desplegable de la celda G10 es esta:

"=DESREF(INDIRECTO(F10);0;0;CONTARA(INDIRECTO(F10));1)"

Pero sustituyendo esa función por "=J1:J4", me devuelve un error '1004 en tiempo de ejecución. Al depurar el error, me resalta en amarillo precisamente

Range("G10").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=DESREF(INDIRECTO(C20);0;0;CONTARA(INDIRECTO(C20));1)"

imagino que el error debe estar en la sintaxis de la formula pero entiendo que no se le pide que la ejecute si no que la ponga, no?

Gracias de nuevo, Elsa, por la paciencia

Perdón. La celda a la que hace referencia la función DESREF es F10 y no C20. Al copiar la formula de me confundí de celda, aunque la sintaxis es la misma.

¿No estás haciendo una referencia circular entre F10 y G10?

F10 tiene un desplegable que presenta x valores, entre ellos la palabra Texto.

G10 tiene que mostrar otro desplegable con y valores ... salvo que F10=Texto en ese caso G10 no tiene lista validada.

Mejor enviame la hoja donde estén los 2 desplegables para que pueda observar lo que intentas ya que así no me queda claro. El correo podes tomarlo de mi sitio que dejo al pie o dejame un correo tuyo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas