2015-04-27

Listas desplegables que permiten seleccionar múltiples elementos

Title

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.

  1. Creamos una lista desplegable basada en una lista de entradas válidas.
  2. Clic con el botón secundario del ratón sobre la hoja y clic sobre Ver código.
  3. Pegamos el siguiente código.
  4. ' 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 Sub
    
    Si 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.

  5. Si nuestro fichero no puede guardar macros, lo guardamos como *.xlsm

Referencias

26 comentarios:

  1. muchos días en la búsqueda de una solución como esta. muchas gracias!!

    ResponderEliminar
    Respuestas
    1. Me alegro. Como ves, el mérito no es mío. Saludos.

      Eliminar
  2. Buenas tardes.
    Que 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.

    ResponderEliminar
    Respuestas
    1. 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
      Saludos,

      Eliminar
  3. Buenas noches,

    No 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.

    ResponderEliminar
    Respuestas
    1. Buenos días. Si necesitas que trabaje con un fichero tuyo y solucionar un problema sería a cambio de una tarifa.
      Saludos,

      Eliminar
  4. 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?

    ResponderEliminar
    Respuestas
    1. Buenos 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.

      Eliminar
    2. A 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:
      ' 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

      Eliminar
    3. Muchas gracias por tu comentario. Saludos.

      Eliminar
    4. Vuelvo 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

      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

      End Select

      exitHandler:
      Application.EnableEvents = True
      End Sub

      Eliminar
    5. Gracias por el comentario.

      Eliminar
  5. Hola! Gracias por la información.
    Una duda: ¿cómo hago si la lista desplegable está en otra hoja del libro Excel?
    Gracias!

    ResponderEliminar
  6. 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 ??

    ResponderEliminar
    Respuestas
    1. Por favor, comparte lo que has intentado. Así quizá alguien te pueda ayudar. Gracias.

      Eliminar
  7. hola, no logro entender como hacer en el caso de listas desplegables en múltiples columnas,

    ResponderEliminar
  8. Hola! como se puede hacer en google sheets?

    muchas gracias

    ResponderEliminar
  9. Hola

    Hago 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

    ResponderEliminar
  10. Gracias, me salvaste unas cuantas malas noches

    ResponderEliminar
  11. Hola, 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

Nube de datos