Script qui ne se lance plus

Bonjour à tous, je suis confronté à un problème qui peut être très gênant si on y fait pas attention.

je m'explique, j'ai un script qui doit se lancer à chaque fois qu'une feuille est modifiée (Sub Worksheet_Change(ByVal Target As Range)), cependant, je me suis rendu compte que si le fichier est ouvert pendant trop longtemps, le fonction arrête de s’exécuter, je ne sais pas si cela viens d'une inactivité prolongé ou si cela se produit même si on utilise et modifie réellement le ficher.

je ne sais pas trop comment régir face à ce problème, quand cela se produit, il me suffit de relancer le fichier pour que le script se lance à nouveau, c'est très dangereux cependant, si je ne me rends pas compte que le script ne s’exécute plus, parce que les actions qu'il fait ne sautent pas toujours aux yeux mais sont importante.

Merci pour votre aide,

Maxime

Bonjour Max, bonjour le forum,

N'aurais-tu pas quelque part dans le code un EnableEvents = False qui traîne ?

Bonjour,

non, je n'ai pas cette fonction, mais voici mon code, ce sera plus simple:

Sub Worksheet_Change(ByVal Target As Range)
    'fonction qui change la couleur de fond des cellules en fonction de l'état du devis

    If Target.Column = 11 Or Target.Column = 12 Then
        x = Target.Column
        y = Target.Row
        reset_x = Target.Column
        reset_y = Target.Row
        Application.ScreenUpdating = False
        If Cells(y, x) = "Facturé" And Cells(y, 32) = "10" Or Cells(y, x - 1) = "Facturé" And Cells(y, 32) = "10" Then
            For cell = 14 To 26
                ActiveSheet.Cells(y, cell).Select
                With Selection.Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
                If Cells(y, cell) <> "" Then
                    With Selection.Interior
                        .Color = 65535
                    End With
                End If
            Next
        Else
        If Cells(y, x) = "Avec Cde" And Cells(y, 32) = "10" Or Cells(y, x - 1) = "Avec Cde" And Cells(y, 32) = "10" Then
            For cell = 14 To 26
                ActiveSheet.Cells(y, cell).Select
                With Selection.Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
                If Cells(y, cell) <> "" Then
                    With Selection.Interior
                        .Color = 32242
                    End With
                End If
            Next
        Else
        If Cells(y, x) = "Sans Cde" And Cells(y, 32) = "10" Or Cells(y, x - 1) = "Sans Cde" And Cells(y, 32) = "10" Then
            For cell = 14 To 26
                ActiveSheet.Cells(y, cell).Select
                With Selection.Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
                If Cells(y, cell) <> "" Then
                    With Selection.Interior
                        .Color = 5287936
                    End With
                End If
            Next
        Else
        If Cells(y, x) = "Facturé" And Cells(y, 32) = "5" Or Cells(y, x - 1) = "Facturé" And Cells(y, 32) = "5" Then
            For cell = 14 To 26
                ActiveSheet.Cells(y, cell).Select
                With Selection.Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
                If Cells(y, cell) <> "" Then
                    With Selection.Interior
                        .Color = 12611584
                    End With
                End If
            Next
        Else
            For cell = 14 To 26
                ActiveSheet.Cells(y, cell).Select
                With Selection.Interior
                    .Pattern = xlNone
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
                If Cells(y, cell) <> "" Then
                    With Selection.Interior
                        .Pattern = xlNone
                        .TintAndShade = 0
                        .PatternTintAndShade = 0
                    End With
                End If
            Next
        End If
        End If
        End If
        End If
        ActiveSheet.Cells(reset_y, reset_x).Select
        Application.ScreenUpdating = True
    End If
End Sub

Re,

Oooops !... je ne mettrai pas les mains dans pareil code...

parce que c'est sale ?

désolé je n'ai pas trouvé moyen de faire plus propre au vues des cas particuliers présents dans ma feuille, cependant, il y a, au final, beaucoup de copier/coller...

Re,

Sale ! non... Bordélique oui...

Pourquoi deux couples de variables identiques : x / reset_x et y / reset_y ?

Pourquoi aucune restriction le code agit TOUT LE TEMPS même si on se place sur une cellule qui n'a rien à voir ?

Des Else qui à mon sens devraient être des ElseIf...

Les Select sont a proscrire de tout code VBA sauf cas de force majeure car il ne font que ralentir l exécution de la macro et sont sources de plantages...

J'en passe....

[b]

[Édition][/b]

Même dans le nom c'est le bordel Max devient Inobody ?!...

très bien, je vais essayer de rendre ça plus clean, juste une chose, par quoi peut on remplacer le select pour changer la couleur de fond d'une cellule ?

merci pour tes conseils.

Maxime

Re,

Range("A1").Select
Selection.Interior.ColorIndex = 4

devient :

Range("A1").Interior.ColorIndex = 4

Re !

j'ai rendu le code bien plus léger et lisible grâce à tes conseils, penses tu que tu pourrais éventuellement te pencher sur mon problème initial ?

En tout cas merci beaucoup pour l'aide que tu m'as déjà apporté, c'est vrai que c'est bien mieux.

Sub Worksheet_Change(ByVal Target As Range)
    'fonction qui change la couleur de fond des cellules en fonction de l'état du devis

    If Target.Column = 11 Or Target.Column = 12 Then
        x = Target.Column
        y = Target.Row
        Application.ScreenUpdating = False
        If Cells(y, x) = "Facturé" And Cells(y, 32) = "10" Or Cells(y, x - 1) = "Facturé" And Cells(y, 32) = "10" Then
            For cell = 14 To 26
                If ActiveSheet.Cells(y, cell) <> "" Then
                    ActiveSheet.Cells(y, cell).Interior.Color = 65535
                End If
            Next
        ElseIf Cells(y, x) = "Avec Cde" And Cells(y, 32) = "10" Or Cells(y, x - 1) = "Avec Cde" And Cells(y, 32) = "10" Then
            For cell = 14 To 26
                If ActiveSheet.Cells(y, cell) <> "" Then
                    ActiveSheet.Cells(y, cell).Interior.Color = 32242
                End If
            Next
        ElseIf Cells(y, x) = "Sans Cde" And Cells(y, 32) = "10" Or Cells(y, x - 1) = "Sans Cde" And Cells(y, 32) = "10" Then
            For cell = 14 To 26
                If ActiveSheet.Cells(y, cell) <> "" Then
                    ActiveSheet.Cells(y, cell).Interior.Color = 5287936
                End If
            Next
        ElseIf Cells(y, x) = "Facturé" And Cells(y, 32) = "5" Or Cells(y, x - 1) = "Facturé" And Cells(y, 32) = "5" Then
            For cell = 14 To 26
                If ActiveSheet.Cells(y, cell) <> "" Then
                    ActiveSheet.Cells(y, cell).Interior.Color = 12611584
                End If
            Next
        Else
            For cell = 14 To 26
                ActiveSheet.Cells(y, cell).Interior.Pattern = xlNone
            Next
        End If
        ActiveSheet.Cells(y, x).Select
        Application.ScreenUpdating = True
    End If
End Sub

encore merci

Maxime

Re,

Maxime ton problème initial est carrément inexplicable !... Je ne l'ai jamais rencontré ni n'ai lu quoi que ce soit à ce sujet. Pour moi la seule explication serait un EnableEvents = False quelque part. Par forcément dans cet onglet. Il faut que tu regardes partout. Dans tous les composants onglet et aussi dans Thisworkbook.

Je n'ai pas compris les couleurs 32242 et 5287936 qui chez équivalent à xlNone !?...

Le Ucase permet d'accepté Facturé comme FACTURÉ comme fActUrÉ, etc. Toutes types de casse...

Ton code simplifié :

Sub Worksheet_Change(ByVal Target As Range) 'fonction qui change la couleur de fond des cellules en fonction de l'état du devis
Dim LI As Integer
Dim COL As Integer

Application.ScreenUpdating = False
If Target.Column < 11 Or Target.Column > 12 Then Exit Sub
LI = Target.Row
COL = Target.Column
Select Case UCase(Target.Value)
    Case "FACTURÉ"
        If Cells(LI, 32) = "10" Then Range(Cells(LI, 14), Cells(LI, 26)).SpecialCells(xlCellTypeConstants).Interior.Color = 65535
        If Cells(LI, 32) = "5" Then Range(Cells(LI, 14), Cells(LI, 26)).SpecialCells(xlCellTypeConstants).Interior.Color = 12611584
    Case "AVEC CDE"""
        If Cells(LI, 32) = "10" Then Range(Cells(LI, 14), Cells(LI, 26)).SpecialCells(xlCellTypeConstants).Interior.Color = 32242
    Case "SANS CDE"
        If Cells(LI, 32) = "10" Then Range(Cells(LI, 14), Cells(LI, 26)).SpecialCells(xlCellTypeConstants).Interior.Color = 5287936
    Case Else
        Range(Cells(LI, 14), Cells(LI, 26)).SpecialCells(xlCellTypeConstants).Interior.Color = xlNone
End Select
Cells(LI, COL).Select
Application.ScreenUpdating = True
End Sub
Rechercher des sujets similaires à "script qui lance"