Problema
Deseamos incluir en una celda más de un elemento de una lista desplegable.
En las celdas B4 y B5 se observa como hemos incluido más de un elemento mediante la lista desplegable.
Solución
Empleamos una solución propuesta en un artículo del blog de Office de Microsoft por Debra Dalgleish.
- Creamos una lista desplegable basada en una lista de entradas válidas.
- Clic con el botón secundario del ratón sobre la hoja y clic sobre Ver código.
- Pegamos el siguiente código.
- Si nuestro fichero no puede guardar macros, lo guardamos como *.xlsm
' Developed by Contextures Inc. ' www.contextures.com Private Sub Worksheet_Change(ByVal Target As Range) Dim rngDV As Range Dim oldVal As String Dim newVal As String 'Ejecuta el código sólo si cambia una celda If Target.Count > 1 Then GoTo exitHandler Select Case Target.Column Case 2 'Esta línea sólo funciona para la columna B 'Case 2, 5, 6 'Esta línea en caso de múltiples columnas On Error Resume Next 'check the cell for data validation Set rngDV = Target.SpecialCells(xlCellTypeAllValidation) On Error GoTo exitHandler If rngDV Is Nothing Then GoTo exitHandler If Intersect(Target, rngDV) Is Nothing Then 'No hace nada Else Application.EnableEvents = False newVal = Target.Value Application.Undo oldVal = Target.Value Target.Value = newVal If oldVal <> "" Then If newVal <> "" Then Target.Value = oldVal _ & ", " & newVal End If End If End If End Select exitHandler: Application.EnableEvents = True End SubSi la lista desplegable no está en la columna B debemos cambiar una línea de código. En lugar de Case 2 pondremos el número de la columna correspondiente. Si tenemos listas desplegables en múltiples columnas escribiremos el número de las mismas seguido de comas, por ejemplo: Case 2, 5, 6.
Referencias
- Artículo de Microsoft: Tricks for creating dropdown lists that let you select multiple items
- Excel Data Validation - Select Multiple Items
Por alguna razón el artículo anterios de Microsoft no permite descargar el fichero con el código utilizado. Aunque en el blog Contextures de la autora, hay disponibles diferentes opciones y vídeos:
muchos días en la búsqueda de una solución como esta. muchas gracias!!
ResponderEliminarMe alegro. Como ves, el mérito no es mío. Saludos.
Eliminarexcelente
ResponderEliminarMuchas gracias, Gabriel.
Eliminar¡ Gran nivelazo !
ResponderEliminarGracias
Buenas tardes.
ResponderEliminarQue buen articulo, gracias.
Pregunta: Cómo hacer para que al seleccionar quede organizada cada palabra debajo de la anterior, ejemplo:
Casa.
Carro.
Motocicleta.
ya que actualmente queda; casa, carro, Motocicleta.
Buenos días Carlos. Necesitas inserta un salto de línea con VBA (vbCrLf). Cambia la línea antes de 'End if' por esta: & ", " & vbCrLf & newVal
EliminarSaludos,
Buenas noches,
ResponderEliminarNo se si me puedes echar una mano, necesitaba usar esta macro en un excel que tengo, pero aunque la introduzco no me sale, no se si podrá ser que tengo otra macro en la misma página, podría mandarte de algun modo el excel que he creado?
Muchas gracias de antemano.
Buenos días. Si necesitas que trabaje con un fichero tuyo y solucionar un problema sería a cambio de una tarifa.
EliminarSaludos,
Hola, He introducido el codigo, y la primera vez que lo pruebo me funciona correctamente. A continuación, intento añadir más listas mediante validación, en la misma columna pero unas filas mas abajo, y me deja de funcionar todo. He revisado el código varias veces, incluso en la página d ela autora y no logro encontrar el problema, no se si es algun tipo de permiso... Estoy trabajando en Excell 2007, puede ser esto un problema?
ResponderEliminarBuenos tardes. Es raro que funcione la primera vez y no las siguientes. Repasa bien qué haces diferente cuando deja de funcionar. Descartaría un problema de versión si funciona la primera vez. Saludos.
EliminarA mi me ha pasado lo mismo y luego he cambiado yo el codigo poniendolo todo en la misma fila y me ha funcionado. Funciona bien a la primera si solo tengo una columna, pero cuando quiero hacerlo para más de 1 ya falla. De esta forma no falla:
Eliminar' Developed by Contextures Inc.
' www.contextures.com
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngDV As Range
Dim oldVal As String
Dim newVal As String
'Ejecuta el código sólo si cambia una celda
If Target.Count > 1 Then GoTo exitHandler
Select Case Target.Column
Case 15, 19, 25, 27 'Esta línea sólo funciona para la columna O, S, Y, AA
On Error Resume Next
'check the cell for data validation
Set rngDV = Target.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitHandler
If rngDV Is Nothing Then GoTo exitHandler
If Intersect(Target, rngDV) Is Nothing Then
'No hace nada
Else
Application.EnableEvents = False
newVal = Target.Value
Application.Undo
oldVal = Target.Value
Target.Value = newVal
If oldVal <> "" Then
If newVal <> "" Then
Target.Value = oldVal _
& "; " & newVal
End If
End If
End If
Muchas gracias por tu comentario. Saludos.
EliminarVuelvo a pegar el código con mi caso especifico, quiero que funcione en 4 columnas, puse mal el final del código. También decir que guardé el archivo y abrí otro día y no funcionaba y fue porque no lo había guardado como "xlsm". Las indicaciones de "nube de datos" funcionan por lo tanto perfectamente, gracias
EliminarPrivate Sub Worksheet_Change(ByVal Target As Range)
Dim rngDV As Range
Dim oldVal As String
Dim newVal As String
'Ejecuta el código sólo si cambia una celda
If Target.Count > 1 Then GoTo exitHandler
Select Case Target.Column
Case 15, 19, 25, 27 'Esta línea sólo funciona para la columna O, S, Y, AA
On Error Resume Next
'check the cell for data validation
Set rngDV = Target.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitHandler
If rngDV Is Nothing Then GoTo exitHandler
If Intersect(Target, rngDV) Is Nothing Then
'No hace nada
Else
Application.EnableEvents = False
newVal = Target.Value
Application.Undo
oldVal = Target.Value
Target.Value = newVal
If oldVal <> "" Then
If newVal <> "" Then
Target.Value = oldVal _
& ";" & newVal
End If
End If
End If
End Select
exitHandler:
Application.EnableEvents = True
End Sub
Gracias por el comentario.
EliminarHola! Gracias por la información.
ResponderEliminarUna duda: ¿cómo hago si la lista desplegable está en otra hoja del libro Excel?
Gracias!
Hola Gracias funciona muy bien, si yo quisiera que solo fuera la columna 2 y un renglon especifico para que no aplicara a toda la columna que me pudes sugerir ??
ResponderEliminarPor favor, comparte lo que has intentado. Así quizá alguien te pueda ayudar. Gracias.
Eliminarhola, no logro entender como hacer en el caso de listas desplegables en múltiples columnas,
ResponderEliminarHola! como se puede hacer en google sheets?
ResponderEliminarmuchas gracias
Hola
ResponderEliminarHago este comentario un poco tarde en respuesta a tu inquietud; el código del blog funciona correctamente pero como las sentencias no son dinámicas, hay que tener cuidado al insertar columnas antes de aquella que contiene el listbox; probablemente te funcionó hasta un punto donde insertaste una columna y esto cambia el valor de case en
Select Case Target.Column
Case 2
Segundo, el archivo debe ser guardado como "documento de excel habilitado para macros".
Espero le pueda servir a alguien esto
Gracias, me salvaste unas cuantas malas noches
ResponderEliminarA ti por el comentario. Saludos.
EliminarGRACIAS TOTALES!
ResponderEliminarMe alegro de que te haya ayudado. Saludos.
EliminarHola, buenas noches. Como puedo hacer para borrar de la selección uno de los valores seleccionados. Lo intento pero para poder borrar un valor seleccionado tengo que borrar todos los valores seleccionados previamente.
ResponderEliminar