Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Merci Job
Et dire que j'avais fait un effort pour essayer d'etre clair
A trop forcer sur les macros...
Il s'agit bien de masquer les colonnes (en-tête compris) si celles-ci sont vides.
Cela ressemblerai au fichier en Pj. avec "cache et montre les colonnes vides"
Mon pb est de rechercher les cellules vides d'une série de colonne en excluant les en-tête de colonne de cette recherche.
esperant que cette fois c'est compréhensible et comptant sur votre aide.
voici un ptit code que je viens de faire qui pourrait peut être correspondre à ce que tu veux
Je l'ai fait pour les colonne A à O il faut donc l'appliquer à ton exemple
Débutant dans le VBA et ne sachant pas encore comment récupérer les lettres des colonnes, j'ai commencé par définir les lettres des colonnes en fonction de leur numéro, afin de pouvoir les utiliser dans la fonction Range.
je pense qu'il doit exister un moyen bcp plus simple, mais je ne le connais pas encore.
Pour la suite pas grand chose à dire, en fait je recherche l'adresse de la dernière cellule de la colonne qui est remplie et si elle est égale à l'adresse de la cellule d'en-tête la colonne est considérée comme vide
Code:
Sub masque()
For rw = 1 To 15
If rw = 1 Then
Lettre_col = "A"
ElseIf rw = 2 Then
Lettre_col = "B"
ElseIf rw = 3 Then
Lettre_col = "C"
ElseIf rw = 4 Then
Lettre_col = "D"
ElseIf rw = 5 Then
Lettre_col = "E"
ElseIf rw = 6 Then
Lettre_col = "F"
ElseIf rw = 7 Then
Lettre_col = "G"
ElseIf rw = 8 Then
Lettre_col = "H"
ElseIf rw = 9 Then
Lettre_col = "I"
ElseIf rw = 10 Then
Lettre_col = "J"
ElseIf rw = 11 Then
Lettre_col = "K"
ElseIf rw = 12 Then
Lettre_col = "L"
ElseIf rw = 13 Then
Lettre_col = "M"
ElseIf rw = 14 Then
Lettre_col = "N"
ElseIf rw = 15 Then
Lettre_col = "O"
End If
adresse = Range(Lettre_col & "65536").End(xlUp).Address
adressse_entete = "$" & Lettre_col & "$1"
If adresse = adressse_entete Then
Range(Lettre_col & "1").EntireColumn.Hidden = True
End If
Next rw
End Sub
Après j'ai peut être pas bien compris ce que tu voulais exactement
Private Sub CommandButton1_Click()
Static flag As Boolean
Dim col As Range
Application.ScreenUpdating = False
flag = Not flag
For Each col In Columns("AJ:CX")
col.Hidden = flag And Application.CountA(col) = 1 [COLOR="Red"]'toutes les colonnes ont un en-tête...[/COLOR]
Next
Application.ScreenUpdating = True
End Sub
Grâce à la variable (Static) flag, le clic alternativement masque ou affiche les colonnes vides.
EDITION : si à l'ouverture du fichier les colonnes sont masquées, il faudra cliquer 2 fois sur le bouton pour les afficher. C'est un petit inconvenient. On peut y remédier comme suit :
Code:
Private Sub CommandButton1_Click()
Static flag As Boolean
Dim col As Range, [COLOR="Red"]test As Boolean[/COLOR], vide As Boolean
Application.ScreenUpdating = False
1 flag = Not flag
For Each col In Columns("AJ:CX")
vide = Application.CountA(col) = 1
[COLOR="Red"]If Not test Then test = vide And Not col.Hidden[/COLOR]
col.Hidden = flag And vide
Next
[COLOR="Red"]If flag + test = -1 Then GoTo 1[/COLOR]
Application.ScreenUpdating = True
End Sub
Je pends connaissance de vos messages, j'ai de mon coté pas mal avancé, je vous proposera tres prochainement mon resultat mais je vais des ce soir tester vos propositions.
Je l'ai fait pour les colonne A à O il faut donc l'appliquer à ton exemple
Débutant dans le VBA et ne sachant pas encore comment récupérer les lettres des colonnes, j'ai commencé par définir les lettres des colonnes en fonction de leur numéro, afin de pouvoir les utiliser dans la fonction Range.
Code:
Sub masque()
For rw = 1 To 15
[COLOR="Orange"][B]If rw = 1 Then
Lettre_col = "A"
ElseIf rw = 2 Then
Lettre_col = "B"
ElseIf rw = 3 Then
Lettre_col = "C"
ElseIf rw = 4 Then
Lettre_col = "D"
ElseIf rw = 5 Then
Lettre_col = "E"
ElseIf rw = 6 Then
Lettre_col = "F"
ElseIf rw = 7 Then
Lettre_col = "G"
ElseIf rw = 8 Then
Lettre_col = "H"
ElseIf rw = 9 Then
Lettre_col = "I"
ElseIf rw = 10 Then
Lettre_col = "J"
ElseIf rw = 11 Then
Lettre_col = "K"
ElseIf rw = 12 Then
Lettre_col = "L"
ElseIf rw = 13 Then
Lettre_col = "M"
ElseIf rw = 14 Then
Lettre_col = "N"
ElseIf rw = 15 Then
Lettre_col = "O"
End If[/B][/COLOR]
adresse = Range(Lettre_col & "65536").End(xlUp).Address
adressse_entete = "$" & Lettre_col & "$1"
If adresse = adressse_entete Then
Range(Lettre_col & "1").EntireColumn.Hidden = True
End If
Next rw
End Sub
A vrai dire, j'avais essayé avec Cells(), mais je devais surement merder quelque part parceque ça ne marchais pas comme je voulais, à chaque fois il me marquait une erreur.
Si je trouve un peu de temps, je retenterai le coup pour voir, pour moi y a pas de raison que ça ne marche pas avec Cells()
Bien que le sujet initial ne me concerne pas, je vous remerci tous pour ces conseils
En fait j'ai retravaillé le code que j'avais proposé et il est bien plus simple :
Code:
Sub masque()
Dim rw As Long
For rw = 1 To 15
adr = Cells(65536, rw).End(xlUp).Address
adr_entete = Cells(1, rw).Address
If adr = adr_entete Then
Cells(1, rw).EntireColumn.Hidden = True
End If
Next rw
End Sub
Pourtant j'avais essayé avec Cells() mais ça n'avait pas marché, je devais surement être un peu trop fatigué.
mromain, je trouve ton astuce également très interessante, même si ça merde au dela de la lettre Z, dans d'autres circonstances je pense que ça peut être très utile.
Merci à tous et pour tout, avec trois mois de retard. c'est ce qu'il m'a fallut pour finaliser et optimiser mon outil. Il donne entière satisfaction, à moi et surtout aux utilisateurs. Job75 ta solution est idéale.
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.