Una vez habilitados los CheckBox con la propiedad Enabled, es hora de activar o desactivarlos con la propiedadValue. Para ello se utiliza un condicional para evaluar el valor True o False y actuar en consecuencia. Entonces se entra en el eventoClick del CheckBox y se comienza el
condicional llamando al procedimiento que se utilizó para mostrar el país en la Tabla Dinámica.
Private Sub CheckAlemania_Click()
If CheckAlemania.Value = True Then
Call Filtro_tabladinamica("ALEMANIA", True)
Ahora hay que introducir una línea para el caso de que se quiera desactivar, por lo que se introduce un Else, ya que sólo hay dos posibilidades,
Else
Call Filtro_tabladinamica("ALEMANIA", False)
End If
Con esto ya se podría mostrar u ocultar el país en la Tabla Dinámica y pegarlo en cada uno de los CheckBox, pero ¿qué pasaría si todos los CheckBox
están desactivados? Pues que el programa se caería ya que siempre debe haber un CheckBox activo. Entonces en el Else de cada CheckBox hay que imponer una condición de que únicamente si hay, al menos, un CheckBox
activo se pueda desactivar el CheckBox del país. Pero claro ¿cómo se cuentan cuántos CheckBox activos hay?
Así de primeras es un poco difícil de imaginar, pero se puede crear un
procedimientoFunction, en un nuevo módulo, que devuelva un número con los CheckBox activos y hacer una llamada a él en cada Else del país. En este procedimiento Function se va a crear una variable llamada N_Checks cuyo valor inicial va a ser 10. Entonces si un CheckBox está deshabilitado o
desactivado se le resta una unidad a la variable N_Checks y esto se consigue mediante un condicional.
Function numero_checks() As Integer
'Procedimiento function sin parametros a introducir cuando se le llame () y se define el resultado como entero
Dim N_checks As Integer
N_checks = 10 ' El número total de paises es 10 If Formulario.CheckAlemania.Value = False Or
Formulario.CheckAlemania.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckCanada.Value = False Or
Formulario.CheckCanada.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckEspana.Value = False Or
Formulario.CheckEspana.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckEspana.Value = False Or
Formulario.CheckEspana.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckFrancia.Value = False Or
Formulario.CheckFrancia.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckFrancia.Value = False Or
Formulario.CheckFrancia.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckItalia.Value = False Or
Formulario.CheckItalia.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckJapon.Value = False Or
Formulario.CheckJapon.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckReinoUnido.Value = False Or
Formulario.CheckReinoUnido.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckSuecia.Value = False Or
Formulario.CheckSuecia.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
If Formulario.CheckTaiwan.Value = False Or
Formulario.CheckTaiwan.Enabled = False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
If Formulario.CheckUsa.Value = False Or Formulario.CheckUsa.Enabled =
False Then 'si es falso se le resta un número al total de checks
N_checks = N_checks - 1
End If
Ahora hay que igualar el valor de la variable N_Checks después de todos los condicionales al procedimientoFunction. Por último, se cierra el
procedimiento.
numero_checks = N_checks
End Function
Entonces ahora se introduce el valor en el Else con un nuevo condicional
anidado. Se dice que si el valor devuelto por el procedimiento
Numero_Checks es mayor o igual que uno, entonces sí puede desactivar el
CheckBox del país, s ino, es decir si es 0, entonces en un nuevo Else del
condicional anidado, se muestra un MsgBox diciendo que no tiene que haber al menos, un check activado y devolviendo el valor del CheckBox del país a
True y se cierran los dos condicionales.
Private Sub CheckAlemania_Click()
If CheckAlemania.Value = True Then
Call Filtro_tabladinamica("ALEMANIA", True)
Else
If numero_checks >= 1 Then
Call Filtro_tabladinamica("ALEMANIA", False) Else
MsgBox ("Tiene que haber al menos un check activo." & vbCrLf & "Se quedará el filtro activo")
CheckAlemania.Value = True End If
End Sub
El código anterior hay que repetirlo en cada uno de los eventosClick de los
CheckBox de los países cambiando las variables necesarias.
Figura 31: Mensaje de advertencia