Ayuda con Listbox de VBA Excel

Buen día expertos soy un novato pero aficionado al VBA de Excel, entiendo lo básico pero ahora que estoy trabajando con Listbox no puedo entender un procedimiento es por eso que les pido y espero puedan ayudarme con esta situación, sucede lo siguiente: tengo una base de datos, son como 10,000 registros, pero necesito hacer filtros y mostrar los resultados en un listbox, todo bien hasta ahí, el problema comienza cuando necesito seleccionar la celda correspondiente cuando doy click en un elemento del listbox. Investigué en internet y encontré este procedimiento para el evento click

Private Sub ListBox1_Click()

Range("a2").Activate

Cuenta = Me.ListBox1.ListCount
Set Rango = Range("A1").CurrentRegion
For i = 0 To Cuenta - 1
If Me.ListBox1.Selected(i) Then
Valor = Me.ListBox1.List(i)
Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
End If
Next i

End Sub

pero sinceramente no le logro captar como funciona, el ejemplo funciona perfectamente pero me gustaría entender bien la función de cada parte del código antes de utilizarlo.

Espero me puedan ayudar, en serio se los voy a agradecer. 

el ejemplo está en ésta página:

http://blogs.itpro.es/exceleinfo/2014/03/29/formularios-para-bsqueda-alta-baja-y-actualizacin-de-registros-en-excel/ 

Que tengan un excelente día.

2 respuestas

Respuesta
3

Te anexo la macro con los comentarios de lo que hace cada línea

Private Sub ListBox1_Click()
'cometado por Dante Amor
    '
    'Activa la celda A2
    Range("a2"). Activate
    '
    'Cuenta el número de registros que existen en el listbox1
 'y lo almacena en la variable Cuenta
    Cuenta = Me.ListBox1.ListCount
    '
    'Establece en la variable rango todas las celdas que están
 'en la región actual
    Set Rango = Range("A1").CurrentRegion
    '
    'Inicia un ciclo, empieza en 0 y termina en la cantidad
 'almacenda en la variable cuenta
 'le resta 1, porque los datos en el listbox empiezan en el contador 0
 'es decir, el registro 1 está almacenado en la fila 0 del listbox
 'el registro 2 está almacenado en la fila1, etc
    For i = 0 To Cuenta - 1
        '
        'Pregunta si el registro del listbox es el seleccionado
        If Me.ListBox1.Selected(i) Then
            '
            'Si el registro es el seleccionado entonces
            'Almacena en la variable Valor el dato que está en
            'registro seleccionado
            Valor = Me.ListBox1.List(i)
            '
            'Ahora busca ese valor en las celdas almacenadas en Rango
            'Si lo encuentra, entonces selecciona la celda
            Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
        End If
    Next i
    '
End Sub

Saludos.Dante Amor

No olvides valorar la respuesta.

Muchas gracias por la explicación, me quedó casi totalmente claro excepto por la partes del 'Selected(i), pero lo pondré en otra consulta.

Saludos.

Respuesta
2

Son correctas las explicaciones dejadas por el experto anterior.

Pero quizás tu dificultad para comprender este código se deba a que utiliza instrucciones innecesarias para este caso... en otra consulta te explicaré el uso de 'selected (i).

Si se trata de 'reconocer' el elemento seleccionado no es necesario 'recorrer' el listbox sino consultar por su nro de índice o posición.

Observa que con solo 4 instrucciones logras lo mismo .

'Activar la celda del registro elegido
Private Sub ListBox1_Click()
'comentado x Elsamatilde
    'activa la celda A2 (de la hoja activa)
Range("a2").Activate
    'declara una variable que contendrá las celdas de la región actual
Set Rango = Range("A1").CurrentRegion
    'guarda en la variable 'Valor' el dato seleccionado de la lista
 'listindex indica el nro de índice del elemento seleccionado
Valor = ListBox1.List(ListBox1.ListIndex)
    'busca ese valor en el rango y si lo encuentra lo selecciona
Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
End Sub

Sdos y no olvides valorar esta respuesta.

Muchísimas Gracias Licenciada Elsa, usted como siempre, sacándome de apuros, ya probé su código, si funciona pero como usted comenta es sólo para 'reconocer' el elemento seleccionado, pero en esta ocasión me gustaría presentar los datos que contiene el registro seleccionado en el Listbox en unos Label, supongamos que sean tres columnas, nombre, apellido paterno, apellido materno.

Después de esto me gustaría que al dar Click en uno de esos registros se almacenará en tres variables diferentes sus datos (las del registro), esto con la finalidad de hacer posteriormente la búsqueda mediante un bucle (dentro del mismo procedimiento.

Básicamente mi pregunta sería entonces

¿Como extraigo el valor de un registro que me presenta un ListBox?

La idea de mi código final sería más o menos así:

> Evento Click en registro de Listbox

> Almacenar datos de registro en tres variables:

variable1, variable2 y variable3

> Utilizar el bucle para encontrar el elemento seleccionado en la Hoja:

For i = 1 to 100 (por ejemplo)

If cells(i, 1).value = variable1 And cells(i,2).value = variable2 And cells(i,3).value = variable3 then

cells(i,1).activate

End if

De antemano muchas gracias. Que tenga un excelente día.

Next i

Con mucho gusto seguiré tu tema, pero te hemos 'explicado' el código tal como lo solicitaste. Y ahora el resto amerita una nueva consulta ... y prometo explicar lo del Selected(i) ;)

Sdos

Elsa

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas