Listas de validación Excel - poner en blanco la celda de una de ellas, si cambio la otra

Tengo en una fila varias celdas con listas de validación, enlazadas en cadena.

Con visual basic y el parámetro target, he conseguido que si cambio el valor de cualquiera, las otras se pongan en blanco, para evitar lo siguiente: su c3 son continentes, d3 países y e3, ciudades, podría pasar que una vez seleccionada un continente, país y ciudad, al ir y cambiar el continente, se mantuvieran país y ciudad hasta que, las cambiemos.

Mi problema es como hacer que haga eso si tengo las listas varias veces, es decir c3, d3 y e3 se repiten en c4, d4 y e4, y luego c5, d5 y e5 y así 50 filas.

¿Qué debo hacer?

Respuesta
1

.19.01.17

Buenas tardes,

Pues estás bastante cerca.

Para que funcione, activa el editor de Visual Basic (presiona Alt+F11) y en el panel de la izquierda busca la hoja donde quieres que esto ocurra. Da doble click sobre ella. (Otra forma de llegar a este punto es hacer click derecho sobre la solapa de esta hoja y elegir la opción "Ver Código)

Allí pega el siguiente procedimiento de VBA:

Private Sub Worksheet_Change(ByVal Target As Range)
ColCont = "C" 'indica la columna donde se seleccionan los continentes  
'  
If Target.Column = Range(ColCont & "1").Column Then
    Target.Offset(0, 1).ClearContents
    Target.Offset(0, 2).ClearContents
End If
End Sub

Esto borrará las selecciones previas de las celdas a la derecha de aquella donde hiciste el cambio.

.

Lo pruebo y estaré encantado de puntuarte fenomenal por tu rapidez.

Con eso que m dices, ¿funcionará indefinidamente? Es decir si pulso c87, limpiara, de y e 87, y si al rato pulso c54,¿hará lo mismo en d54y e 54?

X cierto si m puedo aprovechar de ti, sabes como hacer en word, para que un botón que tiene un código vb asignado, ¿no salga al imprimir?

.

Efectivamente.

Esta rutina está observando qué celda modificaste y borrará ambas hacia la derecha sin importar en qué fila lo hagas.

Es más, lo hará incluso si seleccionas varias celdas en ese rango.


Lamentablemente, casi no uso Word. De todos modos, buscaría en las propiedades del objeto dentro del menú contextual que surge con botón derecho del mouse sobre él.

Abrazo

Fer

Huy creo que lo conseguí

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
ColCont = "B" 'indica la columna donde se seleccionan los continentes
'
If Target.Column = Range(ColCont & "1").Column Then
Target.Offset(0, 1).ClearContents
Target.Offset(0, 2).ClearContents
Target.Offset(0, 3).ClearContents

Else

ColCont = "D" 'indica la columna donde se seleccionan los continentes
'
If Target.Column = Range(ColCont & "1").Column Then
Target.Offset(0, 1).ClearContents
Target.Offset(0, 2).ClearContents
Else

ColCont = "E" 'indica la columna donde se seleccionan los continentes
'
If Target.Column = Range(ColCont & "1").Column Then
Target.Offset(0, 1).ClearContents


End If

End If


End If

Application.EnableEvents = True

End Sub

Tengo otra consulta pués

Si hago un botón en Excel que ejecuta una macro, como puedo hacer que desaparezca con Visual Basic a la hora de imprimir

mil gracias

Perdonaaaa de nuevo, el codigo q t adjunte, hace lo q te digo, pero a veces deja de funcionar y si pulsas en el editor de visual, aparecen como dos instancias del mismo fichero.

¿Lo puedes probar y devirme que debo arreglar?

.

Buenas,

Me parece que hubo algún cambio en tu concepto.

Por ello será que no entiendo por qué no usas la rutina tal como te la pasé.

En la que me muestras, inicias evaluando la columna B cuando en tu ejemplo original se trataba de la columna C, la que contendría los continentes.

Pero al margen de qué columna fuera, siempre borra las dos celdas que tenga a la derecha de esa celda.

Entonces no entiendo por qué cambias de columna a evaluar luego a D y de nuevo a E ...

Yo insistiría con el código tal como te lo pasé.

A menos que haya otras consideraciones que no me hayas comentado.

En tal caso, dime qué faltó para poder darte una solución que te sea de utilidad.


Para que no se imprima un botón de MS Excel, dale click derecho del mouse sobre él y elige Formato de control.

En la ventana que surge ve a la de Propiedades:

Y quita la marca que haya en Imprimir Objeto.

Con ello no necesitas macro para que no se imprima

Saludos

Fer

.

Ante todo gracias y perdona por explicarme tan mal.

Imagina: Europa, españa, madrid, calle perez.

Europa, Francia, parís, rue san martin

Con tu código, si alguien cambia europa, tantp arriba como abajo, se variarán las otras celdas.

Pero y si alguien lo que cambia, es españa, lo que quiero es que se vacíe madrid y la calle, solo.

De ahí mis bucles..

Puedes ayudarme por favor

Y otra cosilla, m da vergüenza tanta pregunta

En una, celda f3 tengo una, liata de validación y en f4 una función buscarv, dectal manera que si en f3 selecciono de la lista, villaquilambre, en f4 m pone león, porque busca el correlativo de villaquilambre en una tabla.

1) querria q permitiera tb al reves, es decir bucar en un lista en f4 y q diera su correlativo en f3

2) La lista de validación de f3, si pico y escojo funciona, pero no me deja escribir el valor y que lo pille o parte de el. Es decir escribir villaquilambre o villaq...

Gracias

.

Pues si, efectivamente, había algo distinto.

La siguiente variante hace lo que solicitas. Sólo tienes que indicarle -al principio del código- cuales son las columnas correspondientes a cada zona.

Private Sub Worksheet_Change(ByVal Target As Range)
ColCont = "C" 'indica la columna donde se seleccionan los continentes
ColPais = "D" 'indica la columna donde se seleccionan los países
ColCiudad = "E" 'indica la columna donde se seleccionan las Ciudades
'  
Application.EnableEvents = False
If Target.Column = Range(ColCont & "1").Column Then
    Target.Offset(0, 1). ClearContents
    Target.Offset(0, 2). ClearContents
    Target.Offset(0, 3). ClearContents
ElseIf Target.Column = Range(ColPais & "1").Column Then
    Target.Offset(0, 1). ClearContents
    Target.Offset(0, 2). ClearContents
ElseIf Target.Column = Range(ColCiudad & "1").Column Then
    Target.Offset(0, 1).ClearContents
End If
Application.EnableEvents = True
End Sub

Desde luego, esta rutina -como la anterior- asume que las columnas son contiguas.

Si así no fuese, habrá que modificar el número de columna a borra dentro de cada instrucción

Target.Offset(0, X ). ClearContents


Respecto a tu otra consulta, he desarrollado algo para busquedas inversas como la que mencionas, pero antes quería comentarte que eso es válido sí hay una relación uno a uno entre ambos campos. Por ejemplo: Buscar un producto por su número de código o buscar el número de código con el nombre de producto.

Pero esto no parece ser el caso de los municipios.

Si bien Villakilambre es un municipio de León, al elegir León podría ser esa localidad U otra (Navatejara, por caso). A menos que por cada provincia tengas una y solo una ciudad, por alguna razón especial. Luego me dirás.

Finalemente, las listas de validación no cuentan con la funcionalidad de elegir sus elementos escribiendo ni sus primeras letras, lamentablemente.

Un abrazo
Fer

.

Para eso no, pero m valdría para otra cosa. ¿M puedes decir como lo haces?

Y mil gracias

Te cuento, en celda c 35 tengo lista de validacion con codigos para países y en celda d35, una funcion buscarv, de tal manera q si en c35, seleccionas por ejemplo el código 24, en d35 pone españa.

En otra hoja tengo una tabla con muchas filas y dos columnas ( codigo y país)

Querria q se pudiera  poder seleccionar indistintamente codigo en c35 o pais en d35 y q en el otro lado ponga su correlativo. Osea pichas en c35 y eliges decla lista 24, pues en d35 pone españa, pero q si ahora pincho en d35 y selecciono francia, en c35 ponga 25.

No se si m expliqué. Perdona.

Lo q m dijiste es qvno secpueden ordenar ademas, verdad?

Mil gracias

. 23.01.17 #VBA Listas desplegables cruzadas

Ok, esto es claramente otra pregunta, pero aquí tienes una solución:

Entiendo que las listas desplegables se alimentarán de tus listado de países en la Hoja 1, por ejemplo, y que, por tanto tendrás un rango con nombre para los códigos y otro rango para las descripciones o nombres de cada país.

Si no fuera así, crea esos dos nombres de rango

En este ejemplo, como ves, lo llamé LDescr. Mientras que el de al lado LCod. Pero pueden ser cualquiera.

Como sabrás eso te permite, además, usarlos para la lista de validación y -de esa manera- te aseguras de que lo que busques, efectivamente esté en la tabla.

Asegurate de que ambas listas de validación permitan escribir la opción, no sólo elegirla. Es decir que la no esté marcada la opción de Mostrar mensaje de error:

Siendo así, la siguiente rutina basada en el evento de cambio en las columnas B o C de la hoja de búsqueda hace lo que solicitas.

Para que funcione, activa el editor de Visual Basic (presiona Alt+F11) y en el panel de la izquierda busca la hoja donde quieres que esto ocurra. Da doble click sobre ella. (Otra forma de llegar a este punto es hacer click derecho sobre la solapa de esta hoja y elegir la opción "Ver Código).

Allí pega el siguiente procedimiento de VBA:

Private Sub Worksheet_Change(ByVal Target As Range)
'---- Variables modificables ----
'=== Aquí modifica estos datos de acuerdo a tu proyecto:
HojaTabla = "Hoja 1"
ColSeleCod = "C" 'columna donde se selecciona el código del país
ColSeleDescr = "D" 'columna donde se selecciona el nombre del país
RangoCod = "LCod" 'rango de lista de Codigos
RangoDes = "LDescr" 'rango de lista de Descripciones
'---- fin Variables
'
'---- inicio de rutina:
'  
ColSeleCod = Range(ColSeleCod & "1").Column
ColSeleDescr = Range(ColSeleDescr & "1").Column
If Target.Column = ColSeleCod And Not IsEmpty(Target) And Target.Rows.Count = 1 Then
        On Error Resume Next
        Encontrado = Sheets(HojaTabla).Range(RangoCod).Find(What:=Target.Value, LookAt:=xlWhole).Address
        If Err.Number = 0 And Len(Encontrado) > 0 Then
        Application.EnableEvents = False
            Target.Offset(0, 1).Value = Sheets(HojaTabla).Range(Encontrado).Offset(0, 1).Value
        Application.EnableEvents = True
        End If
ElseIf Target.Column = ColSeleDescr And Not IsEmpty(Target) And Target.Rows.Count = 1 Then
        On Error Resume Next
        Encontrado = Sheets(HojaTabla).Range(RangoDes).Find(What:=Target.Value, LookAt:=xlWhole).Address
        If Err.Number = 0 And Len(Encontrado) > 0 Then
        Application.EnableEvents = False
            Target.Offset(0, -1).Value = Sheets(HojaTabla).Range(Encontrado).Offset(0, -1).Value
        Application.EnableEvents = True
        End If
End If
End Sub

Nota que, al principio del código, hay unas variables para que lo adaptes a tu archivo.

A partir de ahora, si eliges un código en la columna C, aparecerá el nombre en la columna D y, cuando elijas una descripción en la columna D apararecerá el código en la columna C, tal como solicitaste.

Un abrazo

Fernando

¡Gracias! Si quieres que copie la pregunta y la ponga como nueva, por si te viene bien para puntos experto...

Tengo un par de cosas más, las pongo como nuevas, ¿ok?

.

Esta bien así. Lo importante es que tengas resuelto el problema.

Sólo por una cuestión de búsqueda lógica, conviene que el título de la pregunta se corresponda con la respuesta. Sólo por eso. Lo del puntaje es lo de menos.

Si tus nuevas consultas no tuvieran que ver con el título de esta, entonces sí, sugiero que abras una nueva consulta.

Abrazo
Fer

.

Ok, hago dos nuevas preguntas

.

Ok, perfecto.

Saludos

Fer

.

Hola, buenas noches Fer.

Estas son las dos preguntas que he puesto

1-Excel-crear filas nuevas después rellenar cada una

2-¿Pueden ordenarse las listas desplegables cruzadas? En excel

Gracias

Hola Fer, perdona ser tan pesado, te transcribo una de las dos por si no la encuentras:

Excel-crear filas nuevas después rellenar cada una

Imaginemos una fila que tiene cedas con listas de validación y listas desplegables cruzadas, etc..., se puede hacer que cuando alguien cumplimente una fila, ¿automáticamente cree otra vacía pero con las características de la primera?

Se me olvidaba además la última fila hace una suma de datos de algunas columnas.

Osea fila 1 contiene celdas con diferentes características y fila 3 da suma de datos de columna A y columna F.

Cdo alguien rellena fula 1, q aparezca una fila 2, con características iguales a fula 1, y q fila 3, q ahora seria fila 4, sume los datos columna A y F

.

Hola,¿?

Sí, ví tus dos preguntas y acabo de contestarte uno de ellas.

Esta otra, la lelvo leída varias veces y me cuesta entender qué necesitas.

A priori pareciera que quieres que inserte una fila que tenga las dos celdas en blanco pero preparadas para seleccionar el país o el código. ¿Es así?

Ayudaría una imagen...

Abrazo

Fer

.

Estoy intentan dp mandarte imagen y no m deja.

Puedes darme un mail?

.

Ok. Cerremos esta pregunta, por favor.

Ya está enviado el mail de respuesta.

Saludos

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas