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