VBA Dépannage sur un Range

Bonjour

Est ce que quelqu'un peut me résoudre mon problème ci-dessous, je ne m'en sors pas!!

Sub Masquerlescolonnes()
'
' Masquerlescolonnes Macro
'
Dim rng As Range
' Dim rng2 As Range
Dim DernCol As Integer
Sheets("Production").Select
DernCol = Cells(5, Cells.Columns.Count).End(xlToLeft).Column
ActiveSheet.Unprotect
Cells(1, 5) = DernCol
Application.ScreenUpdating = False
' rng2 = [Cells(5, 20): Cells(RowIndex:=5, ColumnIndex:=DernCol)]
For Each rng In [Cells(5,20),Cells(RowIndex:=5, ColumnIndex:=Derncol)]
' For Each rng In [rng2]
' For Each rng In [t5:xfd5]
If rng.Value = Range("e2") Then rng.EntireColumn.Hidden = False Else rng.EntireColumn.Hidden = True
Next rng
Application.ScreenUpdating = True
ActiveSheet.Protect
End Sub

Merci d'avance

C'est cette ligne qui coince!!

For Each rng In [Cells(5,20),Cells(RowIndex:=5, ColumnIndex:=Derncol)]

Bonjour,

Un test qui ne provoque pas d'erreur chez moi :

Sub Masquerlescolonnes()
Dim rng As Range
Dim DernCol As Integer
With Sheets("Production")
    DernCol = .Cells(5, .Cells.Columns.Count).End(xlToLeft).Column
    .Unprotect
    .Cells(1, 5) = DernCol
    Application.ScreenUpdating = False
    For Each rng In .Range(.Cells(5, 20), .Cells(5, DernCol))
        If rng.Value = .Range("E2") Then
            rng.EntireColumn.Hidden = False
            Else
            rng.EntireColumn.Hidden = True
        End If
    Next rng
    Application.ScreenUpdating = True
    .Protect
End With
End Sub

Cdlt,

Edit : Pensez à baliser votre code sur le forum pour le rendre plus compréhensible.

Edit 2 : Vous ne pouvez pas mettre des [] avec des cells il me semble. De plus, mieux vaut-il qualifier les cells via le With Sheets et le .

Re
J'ai fait le nettoyage de tous mes essais infructueux
J'en suis là:
Et le message est "Référence incorrecte ou non qualifiée" sur .cells(5,20) ligne 9
' Masquerlescolonnes Macro
'
    Dim rng As Range
    Dim DernCol As Integer
    Sheets("Production").Select
    DernCol = Cells(5, Cells.Columns.Count).End(xlToLeft).Column
    ActiveSheet.Unprotect
    Application.ScreenUpdating = False
    For Each rng In .Range(.Cells(5, 20), .Cells(5, DernCol))
        If rng.Value = Range("e2") Then rng.EntireColumn.Hidden = False Else rng.EntireColumn.Hidden = True
    Next rng
    Application.ScreenUpdating = True
    ActiveSheet.Protect
End Sub

Bonjour tout le monde,

Un autre essai....assez similaire à la proposition d'Ergotamine () que tu ne sembles pas avoir testée....

Sub Masquerlescolonnes()
 Dim cel As Range, plage As Range
 Dim DernCol%

     With Sheets("Production") '...................................................agit sur cette feuille uniquement
        DernCol = .Cells(5, .Cells.Columns.Count).End(xlToLeft).Column '...........dernière colonne en fonction de la ligne 5
        Set plage = .Range(.Cells(5, 20), .Cells(5, DernCol)) '....................définit la plage
        .Unprotect '...............................................................enlève la protection
        Application.ScreenUpdating = False '.......................................désactive le rafraichissement de l'écran
         For Each cel In plage '...................................................boucle sur toutes les cellules de la plage
          cel.EntireColumn.Hidden = IIf(cel.Value = .Range("E2"), False, True) '...si valeur cellule<>E2 : on masque la colonne
         Next cel '................................................................prochaine cellule
        Application.ScreenUpdating = True '........................................on réactive le rafraichissement de l'écran
        .Protect '.................................................................on protège la feuille
     End With
End Sub
1antoines.xlsm (21.00 Ko)

Cordialement,

Bonsoir

Avec cela ca fonctionne.

Donc merci même si je ne vois pas ce qui a été modifié!!

Sub Masquerlescolonnes()
'
' Masquerlescolonnes Macro
'
Dim rng As Range
Dim DernCol As Integer
Sheets("Production").Select
    DernCol = Cells(5, Cells.Columns.Count).End(xlToLeft).Column
    ActiveSheet.Unprotect
    Application.ScreenUpdating = False
    For Each rng In Range(Cells(5, 20), Cells(5, DernCol))
        If rng.Value = Range("e2") Then rng.EntireColumn.Hidden = False Else rng.EntireColumn.Hidden = True
    Next rng
    Application.ScreenUpdating = True
    ActiveSheet.Protect
End Sub

Re,

même si je ne vois pas ce qui a été modifié!!

Tu as enlevé les "." à Range et Cells

Comme tu n'utilises pas

With Sheets("Production")

(qui est pourtant préférable au .Select, comme te l'a conseillé Ergotamine), ils sont inutiles.

De plus, mieux vaut-il qualifier les cells via le With Sheets et le .


Cordialement,

Rechercher des sujets similaires à "vba depannage range"