XL 2016 VBA : Cacher colonnes

Guillaume25

XLDnaute Nouveau
Bonjour à tous !

Je sais que le sujet à été abordé de nombreuses fois. J'ai donc essayé par moi-même mais je bloque :
Je cherche à masquer les colonnes qui comportent un 0 sur la ligne "Total général" (Le tableau étant un TCD)
Mon "Total général" étant toujours dans la colonne A.
Les colonnes à traiter s'étendent de F:AB (d'ou le j=28 To 6)

J'obtiens comme message d'erreur. Je suppose qu'il sagit d'une erreur de syntaxe...
1599641654962.png


VB:
Sub Hide()

Dim i%
Dim j%
For i = 200 To 1 Step -1

If Cells(i, 1).Value = "Total général" Then

    For j = 28 To 6 Step -1
    If Cells(i, j).Value = "0" Then Cells(i, j).EntireColumn.Hidden = True
    Next j

Next i
End Sub


Merci d'avance pour votre aide :)
 
Solution
Bonjour Guillaume25, Roblochon,

Une seule boucle suffit :
VB:
Sub Masque()
Dim lig As Variant, c As Range
lig = Application.Match("Total général", [A:A], 0)
Application.ScreenUpdating = False
With [F:AB]
    .Columns.Hidden = False
    If IsError(lig) Then Exit Sub
    For Each c In .Rows(lig).Cells
        If c = 0 Then c.Columns.Hidden = True
    Next
End With
End Sub
A+

job75

XLDnaute Barbatruc
Bonjour Guillaume25, Roblochon,

Une seule boucle suffit :
VB:
Sub Masque()
Dim lig As Variant, c As Range
lig = Application.Match("Total général", [A:A], 0)
Application.ScreenUpdating = False
With [F:AB]
    .Columns.Hidden = False
    If IsError(lig) Then Exit Sub
    For Each c In .Rows(lig).Cells
        If c = 0 Then c.Columns.Hidden = True
    Next
End With
End Sub
A+
 

Guillaume25

XLDnaute Nouveau
Merci pour ta réponse ! Ca me semble plus optimisé en effet ! J'ai encore pas mal à apprendre avant d'écrire cela par moi même !


Bonjour Guillaume25, Roblochon,

Une seule boucle suffit :
VB:
Sub Masque()
Dim lig As Variant, c As Range
lig = Application.Match("Total général", [A:A], 0)
Application.ScreenUpdating = False
With [F:AB]
    .Columns.Hidden = False
    If IsError(lig) Then Exit Sub
    For Each c In .Rows(lig).Cells
        If c = 0 Then c.Columns.Hidden = True
    Next
End With
End Sub
A+
 

Hasco

XLDnaute Barbatruc
Repose en paix
re,

If Cells(i, j).Value = "0" Then Cells(i, j).EntireColumn.Hidden = True

J'ai juste du mal à comprendre pourquoi il est necessaire d'ajouter un End If pour le j et non pour le i.

Parceque votre instruction if sur le i était écrite en une seule ligne.
Quand une ligne contenant un if se termine par 'Then' alors le moteur vba attend un End IF sur une autre ligne. Quand elle se termine par une instruction le moteur vba considère que le traitement de la condition du début de ligne est terminé.

Cordialement
 

Guillaume25

XLDnaute Nouveau
Ah merci beaucoup pour l'info ;)

re,

If Cells(i, j).Value = "0" Then Cells(i, j).EntireColumn.Hidden = True



Parceque votre instruction if sur le i était écrite en une seule ligne.
Quand une ligne contenant un if se termine par 'Then' alors le moteur vba attend un End IF sur une autre ligne. Quand elle se termine par une instruction le moteur vba considère que le traitement de la condition du début de ligne est terminé.

Cordialement
 

Discussions similaires

Réponses
11
Affichages
280