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?
1 Respuesta
.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
.
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
.
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
.
- Compartir respuesta