Masquer des colonnes en VBA

Bonjour,

J'ai créé un tableau (voir P.J.) qui me calcule les différentes combinaisons possibles en fonction de 3 critères renseignés en B1, B2 et B3 et je cherche le code VBA qui me permettrait de masquer toutes les colonnes où le chiffre de la ligne 6 est = à 0.

J'ai trouvé un code pour masquer les lignes :

Sub MasquerLigneselonValeur()
Debut = 2
Fin = 17
ColNb = 4
For i = Debut To Fin
If Cells(i, ColNb).Value = 0 Then
Cells(i, ColNb).EntireRow.Hidden = True
Else
Cells(i, ColNb).EntireRow.Hidden = False
End If
Next i
End Sub

Je souhaite l'équivalent pour les colonnes.

Merci d'avance pour votre aide ;)

Bonjour,

Si j'ai bien compris, en reprenant votre exemple :

Sub MasquerColslonValeur()
  Debut = 2
  Fin = 17
  LinNb = 6

  For i = Debut To Fin
    With Cells(LinNb, i)
        .EntireColumn.Hidden = (.Value = 0)
    End With
  Next i
End Sub

Bonjour Lolo80, saboh12617, le forum,

Un essai avec un bouton à bascule...

34lolo80.xlsm (76.43 Ko)

Cordialement,

@saboh12617 Merci pour ta réponse. Le code VBA que je mets dans ma demande est un code qui fonctionne pour masquer des lignes. C'est un exemple de code mais il n'est pas du tout en lien avec mon tableau.

@xorsankukai Merci pour ta réponse. par contre, est-il possible de le faire automatiquement (sans bouton) puisque mon tableau se remplit à partir d'un autre onglet ?

J'aimerais que les colonnes s'affichent ou se masquent sans avoir à cliquer sur un bouton.

D'autre part, j'ai essayé de copié ton code VBA dans mon tableau final (en modifiant le nom dans la ligne : With Sheets("Répartition")) et quand je souhaite le lancer, j'ai un message d'erreur (voir P.J.).

Pour info, je n'y connais absolument rien en VBA donc je m'y prends certainement mal :D

message erreur vba

Je remets ici mon tableau avec le bon nom d'onglet (Répartition) pour éviter de devoir modifier vos codes

Re,

Merci pour le retour,

A quel moment veux-tu que le code s'exécute ?

A l'activation de la feuille Répartition ?

Cordialement,

@xorsankukai

Merci beaucoup. Le code fonctionne.

Je pensais que lorsque le chiffre en ligne 6 était modifié, cela exécutait la macro (colonnes qui s'affichent ou se masquent automatiquement).
Est-ce envisageable puisque les chiffre en ligne 6 se calculent à partir de données renseignées dans un autre onglet ?

Si ce n'est pas possible, peut-on exécuter la marco à chaque fois que le chiffre en case B1 est modifié ?

Re,

Je pensais que lorsque le chiffre en ligne 6 était modifié, cela exécutait la macro (colonnes qui s'affichent ou se masquent automatiquement).

Non, la macro s'exécute uniquement si tu actives la feuille Répartition (évènement Worksheet_Activate).

Peut-on exécuter la macro à chaque fois que le chiffre en case B1 est modifié ?

Cordialement,

@xorsankukai

Encore merci.

Ca fonctionne mais après 3 ou 4 changement de chiffres dans la cellule B1, toutes les colonnes sont masquées. J'ai l'impression que la macro ne permet pas de faire réapparaitre les colonnes qui ont été précédemment masquées. As-tu une solution pour corriger ce problème ?

Est-ce qu'on pourrait exécuter la macro après changement d'un des chiffres des cellules B1 ou B2 ou B3 car se sont les 3 variables de mon tableau ou il peut y avoir qu'une seule consigne ?

Bonjour,

Ajoutez cette ligne dans la macro de xorsankukai (après le IF), cela devrait résoudre le problème :

Range(Cells(6, 3), dercol).EntireColumn.Hidden = False

Le résultat doit etre :

Private Sub Worksheet_Change(ByVal Target As Range) '�v�nement CHANGE de la feuille
  Dim dercol%, c%
  Application.ScreenUpdating = False             'd�sactive le rafraichissment de l'�cran
  dercol = Cells(6, Columns.Count).End(xlToLeft).Column 'd�finit la derni�re colonne de la feuille (en fonction de la ligne 6)
  If Not Application.Intersect(Target, Range("B1")) Is Nothing Then 'si changement en B1
    Range(Cells(6, 3), dercol).EntireColumn.Hidden = False
    For c = dercol To 3 Step -1                  'boucle de la derni�re colonne � la troisi�me
      With Cells(6, c)                           'cellule de la ligne 6 en fonction de la colonne
        .EntireColumn.Hidden = (.Value = 0)      'si valeur � 0, on masque la colonne
      End With
    Next c                                       ' colonne suivante
  End If
  Application.ScreenUpdating = True              'r�active le rafraichissment de l'�cran
End Sub

Re,

Effectivement, il faut ré-initialiser l'affichage des colonnes avant de les masquer...

Cordialement,

@saboh12617 et @xorsankukai

Merci beaucoup à vous 2.

Ca fonctionne bien mais il reste juste un souci. Lorsque je renseigne la case B1, les colonnes se masquent mais lorsque je la renseigne à nouveau, les 1ères colonnes à 0 en ligne 6 se masquent bien mais les colonnes à 0 après celles qui ne sont pas à 0 ne se masque pas (voir P.J.).
J'ai l'impression que ça fonctionne bien une fois sur deux. Vous voyez d'où peut venir le problème ?

Si je souhaite que la Macro se lance après avoir renseigné les cases B1 ou B2 ou B3, il suffit que je modifie cette ligne :

If Not Application.Intersect(Target, Range("B1")) Is Nothing Then

Par :

If Not Application.Intersect(Target, Range("B1:B3")) Is Nothing Then

?

capture d ecran 20241112

Bonjour,

Je ne comprends pas votre problème. Je viens de télécharger le dernier fichier de xorsankukai et la macro masque bien toujours les mêmes lignes, même quand on relance à la suite… Utilisez vous bien son dernier fichier ?

Pour votre 2e demande, oui “B1” est la “cible” qui lance la macro, vous pouvez la modifier comme vous l’avez écrit pour couvrir plus de cellules.

Bonjour à tous,

Nouvel essai....

Cordialement,

@saboh12617

@xorsankukai

Merci encore pour votre aide.

J'ai essayé le nouveau code mais ça ne résout pas le souci.
Je pense avoir compris le problème.
Quand je modifie les données des cellules B1:B3 la macro masque bien les colonnes où les cellule en ligne 6 sont égales à 0 mais elle n'est pas capable de réafficher les colonne masquées où les cellules en ligne 6 sont devenues > à 0 (après avoir été masquées précédemment).
Je pense qu'il faut lui donner la consigne en début de macro de réafficher les colonnes C:CT.

J'ai essayé de modifier le code de la macro comme ci-dessous. Ca résout le problème mais ça grise l'ensemble de mes colonnes.
Auriez-vous la solution pour éviter de griser les colonnes C:CT ?

Code modifié :

Private Sub Worksheet_Change(ByVal Target As Range)

Columns("A:CT").Select

Selection.EntireColumn.Hidden = False

Dim dercol%, c%

Application.ScreenUpdating = False

dercol = Cells(6, Columns.Count).End(xlToLeft).Column

If Not Application.Intersect(Target, Range("B1")) Is Nothing Then

Columns.Hidden = False

For c = dercol To 3 Step -1

With Cells(6, c)

.EntireColumn.Hidden = (.Value = 0)

End With

Next c

End If

Application.ScreenUpdating = True

End Sub

Bonjour,

Elles sont grisées car vous utilisez .Select (selectionnez les cellules).

On peut l'éviter en écrivant directement

Columns("A:CT").EntireColumn.Hidden = False

Utilisez les balises de code (bouton </>) quand vous écrivez un message, s'il vous plait. C'est beaucoup plus lisible.

@saboh12617

Merci beaucoup pour votre aide. Ca fonctionne parfaitement.

Rechercher des sujets similaires à "masquer colonnes vba"