Microsoft 365 Code VBA - si toutes les valeurs d'une cellule égale à "Y" grouper la colonne

RCAVBA

XLDnaute Junior
Bonjour à tous,

Je souhaiterais vérifier le contenu des cellules d'une colonne C à partir de la ligne 25.

Pour i=1 to la fin (la dernière ligne de la feuille excel)
J =3

Condition à partir de la ligne 24+i, si toutes les valeurs de la colonnes égales à "Y", DONC grouper la colonne, sinon ne rien faire.

Merci beaucoup
Cdt,
 
Solution
Je m'en doutais un peu, sinon ça fait de gros fichiers ! :)
J'ai modifié la macro, il vous faut adapter les trois premières déclarations :
VB:
Sub Groupe()
NombreDeColonnes = 5    ' déclare le nombre de colonnes concernées
DébutTableau = 24       ' définit le debut du tableau
FinTableau = 100        ' définit la fin du tableau
For NCol = NombreDeColonnes To 1 Step -1                    ' Fait le test sur les 5 premières colonnes
    Ny = Application.CountIf(Range(Cells(DébutTableau, NCol), Cells(FinTableau, NCol)), "Y") ' compte de bnre de Y de L24 à la fin
    If Ny = FinTableau - DébutTableau + 1 Then              ' Si nombre de "Y" est egal à 1048576-24 alors
        Columns(NCol).Columns.Group                         ' On applique...

RCAVBA

XLDnaute Junior
Bonjour @sylvanu,

Grouper la colonne : c'est appliquer la procédure : Données > Plan > Grouper. Pour avoir le PLUS (+) en dessus de la colonne.

Si on trouve les Y de la ligne 24 à la dernière ligne (TOUTES LES LIGNES), donc on groupe la colonne et on la masque.

Merci
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Pourquoi chipoter sur de futiles détails ?
Vous selectionnez une colonne.
Le petit +/- apparait au dessus des colonnes.
2.jpg

Le langage utilisé est celui présenté par XL
Le principal est que l'on comprenne exactement ce que veut Rcavba.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re le fil,
J'ai mis la PJ en xlsb pour être moins gros car évidemment le fichier test est énorme :
https://www.cjoint.com/c/JEAhsIV0lyY
( 9.45Mo en xlsm, 2.62Mo en xlsb )
J'ai utilisé cette macro :
VB:
Sub Groupe()
For NCol = 1 To 5       ' Fait le test sur les 5 premières colonnes
    Ny = Application.CountIf(Range(Cells(24, NCol), Cells(1048576, NCol)), "Y") ' compte de bnre de Y de L24 à la fin
    If Ny = 1048553 Then                ' Si nombre de "Y" est egal à 1048576-24 alors
        Columns(NCol).Columns.Group     ' On applique Grouper à la colonne
        ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
    End If
Next NCol
End Sub
Plus une petite macro pour revenir en arrière pour le test :
Code:
Sub Degrouper()
On Error GoTo Fin   ' Evite l'erreur si demande de dégroupage alors qu'il n'y a pas de Groupe
    Cells.Select                            ' on selectionne tout
    Selection.Columns.Ungroup               ' on "degroupe"
    Selection.EntireColumn.Hidden = False   ' on rend visible toutes les colonnes
Fin:
[A1].Select
End Sub
Je n'ai qu'une colonne pleine de Y, la colonne C car sinon le fichier est vraiment trop gros. Je ne fais le test que sur 5 colonnes, il est facilement adaptable suivant besoin.
 

RCAVBA

XLDnaute Junior
Parfait @sylvanu,

Le code fonctionne très bien. Merci beaucoup.

Sub Groupe()
For NCol = 1 To 5 ' Fait le test sur les 5 premières colonnes
Ny = Application.CountIf(Range(Cells(24, NCol), Cells(1048576, NCol)), "Y") ' compte de bnre de Y de L24 à la fin
If Ny = 1048553 Then ' Si nombre de "Y" est egal à 1048576-24 alors
Columns(NCol).Columns.Group ' On applique Grouper à la colonne
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
End If
Next NCol
End Sub


J'ai juste un détail à modifier s'il vous plaît, je voulais juste remplacer 1048576 (dernière ligne) par la dernière ligne remplie dans la colonne, par exemple si ma colonne se limite à la ligne 100.

Merci beaucoup
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Je m'en doutais un peu, sinon ça fait de gros fichiers ! :)
J'ai modifié la macro, il vous faut adapter les trois premières déclarations :
VB:
Sub Groupe()
NombreDeColonnes = 5    ' déclare le nombre de colonnes concernées
DébutTableau = 24       ' définit le debut du tableau
FinTableau = 100        ' définit la fin du tableau
For NCol = NombreDeColonnes To 1 Step -1                    ' Fait le test sur les 5 premières colonnes
    Ny = Application.CountIf(Range(Cells(DébutTableau, NCol), Cells(FinTableau, NCol)), "Y") ' compte de bnre de Y de L24 à la fin
    If Ny = FinTableau - DébutTableau + 1 Then              ' Si nombre de "Y" est egal à 1048576-24 alors
        Columns(NCol).Columns.Group                         ' On applique Grouper à la colonne
        ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
    End If
Next NCol
End Sub
 

Pièces jointes

  • Rcavba2.xlsb
    21.9 KB · Affichages: 11

sylvanu

XLDnaute Barbatruc
Supporter XLD
Un addon :
Si votre tableau contient des "numéro de lignes" et des entêtes de colonne alors cela peut être fait automatiquement avec CurrentRegion qui sait détecter la taille de votre tableau.
Mais il lui faut obligatoirement une colonne pour compter les lignes et une ligne où il comptera les colonnes.
 

Discussions similaires

Réponses
5
Affichages
169
Réponses
22
Affichages
746

Statistiques des forums

Discussions
312 109
Messages
2 085 386
Membres
102 880
dernier inscrit
ADEL N