Ayuda con ListBox en Excel
Publicado por Antoni Masana (2574 intervenciones) el 27/07/2025 17:08:59
Ayuda con ListBox en Excel
En un Excel tengo un formulario con los siguientes objetos entre otros:
1 ListBox: donde tengo los datos con el parámetro MultiSelect activado.
2 OptionButton: Que marcan la condición del filtro.
2 CheckBox: Marca en el ListBox según la opción marcada en el OptionButton.
Funcionamiento:
OptionButton1
• Desmarca todo el ListBox
• Activa CheckBox1
• Descativa CheckBox2
OptionButton2
• Desmarca todo el ListBox
• Desactiva CheckBox1
• Activa CheckBox2
CheckBox1
• Marca todos los que el campo 3 está vacío.
CheckBox2
• Marca todos los que el campo 3 está lleno.
Hasta aquí todo bien.
Ahora resulta que el usuario puede ir al ListBox y marcar/desmarcar a su gusto.
Para ello creo dos eventos del ListBox:
* ListBox1_Change()
* ListBox1_Enter()
Que llaman a un procedimiento ListBox1_MARCAR que comprueba si lo marcado es correcto o no.
El código:
No se cual de los dos eventos es el que debo usar.
Al desactivar la opción incorrecta del ListBox se vuelve a ejecutar el evento Change y entra en un circulo infinito.
Como no se me ocurre otra opción lo he solucionado con una variable pública.
Resulta que si se mueve el ratón por el ListBox con el botón izquierdo pulsado va marcando o seleccionando todos los registros y los eventos Change y Enter parece que no se ejecutan o no tienen el efecto de corregir.
Cuando se ejecutan los CheckBox se activa el evento Change y no es necesario ¿Cómo lo evito?
Alguna solución a estos problemas
Gracias
Saludos
\\//_
En un Excel tengo un formulario con los siguientes objetos entre otros:
1 ListBox: donde tengo los datos con el parámetro MultiSelect activado.
2 OptionButton: Que marcan la condición del filtro.
2 CheckBox: Marca en el ListBox según la opción marcada en el OptionButton.
Funcionamiento:
OptionButton1
• Desmarca todo el ListBox
• Activa CheckBox1
• Descativa CheckBox2
OptionButton2
• Desmarca todo el ListBox
• Desactiva CheckBox1
• Activa CheckBox2
CheckBox1
• Marca todos los que el campo 3 está vacío.
CheckBox2
• Marca todos los que el campo 3 está lleno.
Hasta aquí todo bien.
Ahora resulta que el usuario puede ir al ListBox y marcar/desmarcar a su gusto.
Para ello creo dos eventos del ListBox:
* ListBox1_Change()
* ListBox1_Enter()
Que llaman a un procedimiento ListBox1_MARCAR que comprueba si lo marcado es correcto o no.
El código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
' </> ----------------------------------------------------------' </> ---&--- ListBox1' </> ----------------------------------------------------------Private Sub ListBox1_Change()
Call ListBox1_MARCAR
End Sub
Private Sub ListBox1_Enter()
Call ListBox1_MARCAR
End Sub
Private Sub ListBox1_MARCAR()
If OptionButton1.Value ThenPun = ListBox1.ListIndex
If ListBox1.List(Pun, 3) <> Empty Then
ListBox1.Selected(Pun) = False
End If
End If
If OptionButton2.Value ThenPun = ListBox1.ListIndex
If ListBox1.List(Pun, 3) = Empty Then
ListBox1.Selected(Pun) = False
End If
End If
End Sub
PROBLEMA 1
No se cual de los dos eventos es el que debo usar.
PROBLEMA 2
Al desactivar la opción incorrecta del ListBox se vuelve a ejecutar el evento Change y entra en un circulo infinito.
Como no se me ocurre otra opción lo he solucionado con una variable pública.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub ListBox1_MARCAR()
If SW_Saltar Then Exit Sub
If OptionButton1.Value ThenPun = ListBox1.ListIndex
If ListBox1.List(Pun, 3) <> Empty Then
SW_Saltar = True: ListBox1.Selected(Pun) = False
SW_Saltar = FalseEnd If
End If
If OptionButton2.Value ThenPun = ListBox1.ListIndex
If ListBox1.List(Pun, 3) = Empty Then
SW_Saltar = True: ListBox1.Selected(Pun) = False
SW_Saltar = FalseEnd If
End If
End Sub
PROBLEMA 3
Resulta que si se mueve el ratón por el ListBox con el botón izquierdo pulsado va marcando o seleccionando todos los registros y los eventos Change y Enter parece que no se ejecutan o no tienen el efecto de corregir.
PROBLEMA 4
Cuando se ejecutan los CheckBox se activa el evento Change y no es necesario ¿Cómo lo evito?
Alguna solución a estos problemas
Gracias
Saludos
\\//_
Valora esta pregunta


0

