2017-10-13 12 views
1

Je tente de créer une instruction simple if dans Excel avec VBA.Si l'instruction ne fonctionne pas dans Excel VBA

Je crée une nouvelle case à cocher

Ajoute le code suivant à la boîte. Résultat: Les lignes sont cachées à la fois si la case est cochée ou décochée.

(case cochée)

Toutes les lignes sont visibles

décocher la case

Résultat: Toutes les lignes sont masquées

(case est cochée)

Toutes les lignes sont visible

Désélectionner t il checkbox

Résultat: Toutes les lignes sont cachées

Répondre

1

Vous pouvez mettre ceci dans un sous, son hypothèse d'une case à cocher activeX

Private Sub CheckBox1_Click() 
If CheckBox1 = True Then 
    [2:5].EntireRow.Hidden = False 
    Else: [2:5].EntireRow.Hidden = True 
End If 
End Sub 
2

En supposant son ActiveX CheckBox, placez ce code dans le module Sheet .. .

Private Sub CheckBox1_Click() 
If CheckBox1 = True Then 
    Rows("2:5").Hidden = True 
Else 
    Rows("2:5").Hidden = False 
End If 
End Sub 

Edit:

Ou tout simplement utiliser ...

Private Sub CheckBox1_Click() 
    Rows("2:5").Hidden = CheckBox1 
End Sub 
+2

Pourquoi pas seulement 'ActiveSheet.Rows. ("2: 5") fontcolor = CheckBox1.Value'? –

+0

@ Mat'sMug Oui, c'est vrai. Mais c'était juste pour montrer comment cela fonctionnerait plutôt que de trouver la méthode la plus courte pour atteindre le résultat final. Ce que vous avez suggéré ne nécessite même pas de le qualifier avec une référence de feuille puisque le code sera assis dans le module de feuille lui-même. :) – sktneer

+0

C'est correct (+1) - le qualificateur explicite applicable serait 'Moi' si ce code est dans le code-behind d'une feuille de calcul; sans doute la feuille active devrait/devrait être * cette feuille * mais, oui, 'Me' est sémantiquement plus approprié que' ActiveSheet' ... et 'Me' est toujours un qualificateur redondant. –

4

Vous voulez un changement d'événement.

Vous n'avez pas besoin du If Then. CheckBox1 retourne un VRAI/FAUX, utilisez-le.

Et le EntireRow n'est pas non plus nécessaire en se référant à Rows(). Vous faites déjà référence à toute la rangée.

De même, il est recommandé de toujours déclarer le parent à tout objet Range, ce qui correspond à Rows(). Si le code est dans le code de feuille de travail, alors utilisez Me comme il se référera à lui-même. Si le code est dans un module puis utilisez ActiveSheet ou de préférence la feuille spécifique, Worksheets("Sheet1"):

Private Sub CheckBox1_Change() 
    HideRows "2:5" 
End Sub 



Sub HideRows(rowRange) 
    'if this code is not in the worksheet code then change `Me` to `ActiveSheet` 
    Me.Rows(rowRange).Hidden = Not CheckBox1 

End Sub 
+0

Renvoyé pour souligner la redondance du bloc 'If ... Then' et des affectations booléennes ... Je qualifierais' Rows' avec 'ActiveSheet' et ferais explicitement référence' CheckBox1.Value' ;-) –

+0

dit ^^^^ – Tom

+0

@ Mat'sMug si, si c'est sur le code de la feuille est-il vraiment nécessaire ou 'Me' serait mieux? –