lunes, 23 de julio de 2012

VBA: Elementos seleccionados de un ListBox en Excel.

Continuando con el post anterior, en el que vimos cómo contar el número de elementos seleccionados en un ListBox, hoy veremos como identificar estos elementos; lo que haremos añadiéndolos a una Matriz-Array.
El trabajo consistirá en Redimensionar nuestra matriz de acuedo al número de elementos seleccionados, para luego recorrer todos los elementos del ListBox, comprobando cuáles están Seleccionados, en este caso, lo añadiremos como item de nuestra matriz-Array redimenensionada.
A continuación del código de la entrada anterior ,insertaremos en la Hoja1 (en la hoja donde se encuentre nuestro ListBox) del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel, con un evento click, quedando:

Private Sub CommandButton1_Click()
Dim lItem As Long, seleccionados As Integer
Dim MiMatriz() As Variant
'recorremos cada elemento del ListBox
For i = 0 To ListBox1.ListCount - 1
    'verificamos si está o no seleccionado
    'en caso afirmativo, acumulamos el contador
    If ListBox1.Selected(i) = True Then
        seleccionados = seleccionados + 1
    End If
Next i
'comprobamos que hay algún elemento seleccionado
If seleccionados = 0 Then
    MsgBox "Debes marcar al menos un cliente"
    Exit Sub
End If

'redefinimos la matriz con el número de items seleccionados
ReDim MiMatriz(1 To seleccionados, 1) As Variant
x = 1
'recorremos todos los elementos del Listbox
For lItem = 0 To ListBox1.ListCount - 1
    'en caso de que el elemento esté seleccionado
    'lo añadimos a una matriz
    'que luego emplearemos para comparar en el gráfico
    If ListBox1.Selected(lItem) = True Then
    'añadimos el item a la matriz redimensionada
    MiMatriz(x, 1) = ListBox1.List(lItem)
    'dejamos el Listbox sin selección
    ListBox1.Selected(lItem) = False
    x = x + 1
    End If
Next lItem
End Sub


Con este código hemos creado una matriz con los elementos seleccionados en el ListBox; con estos item de dicha matriz, posteriormente (en el post siguiente) formatearemos la serie de datos de nuestro gráfico, dando un color distinto a los Puntos coincidentes con los seleccionados.

VBA: Elementos seleccionados de un ListBox en Excel.


El próximo y último post, incluiremos la última parte del código de VBA para Excel que recorrera los puntos que compornen la serie, hasta encontrar los ocincidentes con los item seleccionados...

14 comentarios:

  1. Los felicito por tratar de ser lo más claro posible, especialmente por el hecho de ir explicando lo que hacen las líneas de código, es muy util para analizar y reutilizar código similar

    ResponderEliminar
    Respuestas
    1. Muchas gracias!
      la idea es enseñar... asi que no hay mejor forma que ir explicando cada línea.
      me alegra te sirva para atacar otros problemas similares.
      Un saludo

      Eliminar
  2. hola tengo una pequeña duda
    tengo un useform y tengo el boton de salir y quiero que me de la opcion de Si o No pero cuando le doy a No se me sale de todas maneras cual es la linea de codigo correcta para que cuando yo le diga que No me deje en el formulario

    ResponderEliminar
    Respuestas
    1. Hola,
      por lo que entiendo al presionar el botón de Salida de un Useform, te aparece otro UserForm 'secundario' con dos nuevos botones (un SI y un NO), supongo que al presionar el SI descargas los formularios o sales a la hoja de cálculo (o similar); si quieres que al presionar el NO, quede activo el UserForm principal o visible, yo asociaría al NO
      Userform1.Show
      Espero te oriente.

      Slds

      Eliminar
  3. hola
    MsgBox "¿Esta seguro que desea salir?", vbYesNo, "Formulario", esto es lo que tengo
    y como lo relaciono no manejo mucho VB6

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola...
      deberías tener un línea asociando una variable al MsgBox
      pregunta=MsgBox "¿Esta seguro que desea salir?", vbYesNo, "Formulario"
      y a continuación evalúas la respuesta
      if pregunta =vbYes then Exit Sub
      if pregunta =vbNo then Userfom1.Show

      pero con las condiciones que hayas puesto.
      Slds

      Eliminar
  4. Buenos días,

    Si quisiera enviar un correo via outlook a cada uno de los seleccionados, teniendo en cuenta que los correos estan en la columna E, osea la columna 5, como seria?

    de antemano muchas gracias

    mi correo: gonzalez.jhonatan@gmail.com

    ResponderEliminar
    Respuestas
    1. Hola Jhonatan,
      procuraré subir una explicación al respecto en cuanto me sea posible.
      Saludos

      Eliminar
  5. Estimado:
    Muy buena guía para ir avanzando en la comprensión de los códigos de macros.
    Una consulta ¿Cual sería el codigo? para que una vez seleccionado un item del listbox, se despliegue un userform con datos especificos del item seleccionado

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      la cuestión es ¿cuál es la regla para completar el UserForm a partir de los elementos seleccionados?, ¿cuántos elementos deben marcarse y cuantos y qué tipo de controles tienes en el Useform?...
      En función a las respuestas podrías modificar la línea 28 del código para rellenar los controles del userform, por ejemplo
      userform1.textbox1.value= ListBox1.List(lItem)
      ...
      Saludos

      Eliminar
  6. buenas noches, excelente codigo, quisiera saber como hago hago para borrar los datos sellecinados en el listbox ya que cuando los borro la primera vez, se borran bn, pero cuando voy a seguir borrando los items que quedaron no los borra completos, me toca borralos uno por uno.
    de ante mano muchas gracias y excelente labor la que haces.
    cordial saludo.

    ResponderEliminar
    Respuestas
    1. Hola Juan Camilo,
      supongo que quieres eliminar los registros en la hoja de cálculo a partir de los elemento seleccionados...
      El asunto es delicado, ya que para eliminar filas correctamente en la hoja de cálculo hay que realizar un recorrido inverso desde la fila inferior.
      Si vas de uno en uno tendrás que refrescar constantemente el ListBox para tener actualizado la fila correcta en cada momento

      En todo caso, procuraré subir un post al blog en cuanto me sea posible

      Un saludo

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  7. hola Ismael gracias por responder, solo quiero borrarlos del listbox, este listbox es de venta, cuando borro los datos seleccionados ellos se borran correctamente, pero si selecciono los datos restantes para borrarlos no se borran todos, se van borrando por mitad, si son 8 datos y los borro todos solo se borran 4, luego selecciono esos 4 y se borran 2 y luego 1.
    cordial saludo.

    ResponderEliminar

Nota: solo los miembros de este blog pueden publicar comentarios.