Erreur d'éxecution '28

Bonjour,

Débutant sur VBA J'ai créé un petit code rapide afin de mettre en forme une cellule en fonction du contenu d'une autre cellule :

Private Sub Worksheet_Change(ByVal Target As Range)

If Range("FindeVie") = Range("Incineration") Or Range("FindeVie") = Range("Enfouissement") Or Range("FindeVie") = Range("ScenarioMoyen") Then

Range("TauxdeRecyclage").ClearContents

Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)

ElseIf Range("FindeVie") = Range("ValorisationMatiere") Then

Range("TauxdeRecyclage").Interior.Color = RGB(255, 255, 255)

Range("TauxdeRecyclage").Font.Color = RGB(64, 64, 64)

Else:

Range("TauxdeRecyclage").ClearContents

Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)

End If

End Sub

Ensuite, la feuille de calcul que j'utilise comprend plusieurs cellule à saisir. Afin de gagner du temps, j'ai créé une commande permettant de d'effacer le contenu des cellules souhaités :

Sub Clear_New()

Range("TypeStore").ClearContents

Range("Longueur").ClearContents

Range("Hauteur").ClearContents

Range("I25").ClearContents

Range("FindeVie").ClearContents

Range("TypeStore").Select

End Sub

Mon problème est maintenant le suivant : lorsque j'ouvre pour la première fois mon classeur est que je renseigne mes cellules, tout se passe bien. En revanche, une fois que j'utilise la commande pour effacer et saisir de nouvelles valeurs, VBA plante et me signal "Erreur d'éxecution '28' / Espace pile insuffisant", et le débeugage me renvoi vers la première ligne "If Range("FindeVie") = Range("Incineration") Or Range("FindeVie") = Range("Enfouissement") Or Range("FindeVie") = Range("ScenarioMoyen") Then"

La où cela devient encore plus mystérieux, c'est lorsque je fait "Débeugué", Excel plante complètement et ferme au bout de 10-15 secondes. Mais si je fais "Fin", le problème passe et je peux saisir sans problème mes nouvelles données et ma mise en forme de cellule fonctionne parfaitement.

Quelqu'un a t-il une solution !!!!! merci beaucoup par avance !

Bonjour,

Pourrais-tu joindre un fichier partiel anonymisé pour voir un peu comment se déroule ton fichier ?

Ta macro worksheet_change(), est-elle sensé se déclencher tout le temps ou dépend-t-elle de certaines cellules seulement ? Car à première vue, je pense que ca vient de là, vu qu'elle ne teste pas certaines cellules cibles, dès que tu fais une remise à zéro de ta feuille, pour chaque cellule qui change ta macro worksheet_change() se déclenche, et donc recolorie certaines cellules, ce qui entraine donc un changement de cellule => re déclenchement de ta macro Worksheet_change(), etc etc ce qui bouffe une mémoire monstrueuse et fait planter excel.

Cordialement,

Merci pour cette réponse rapide.

Malheureusement, je ne peux absolument pas joindre de fichier ... Mais j'ai bien compris le sens de ce que tu voulais dire.

En faite, il n'y a que 2 cellules qui travail réellement :

  • "FindeVie" qui est en faite une liste déroulante avec 4 propositions (scénario moyen, enfouissement, incineration et valorisation matiere)
  • "Taux de recyclage" qui à deux valeurs : colorié lorsque scénario moyen, enfouissement ou incineration sont sélectionnées et blanche lorsque valorisation matière est sélectionnée.

J'ai choisit la macro Worksheet_change() car je souhaite que le coloriage ou le blanchissement de la cellule "TauxdeRecyclage" s'effectue au moindre changement effectué dans la cellule "FindeVie", ce que ne permet pas la macro Worksheet_SelectionChange()

Tes couleurs te servent dans d'autres macros ou pour je ne sais quel test ou formule ?

Sinon pourquoi ne pas simplement passer par une mise en forme conditionnelle qui change ta couleur de cellule "taux de Recyclage"en fonction du contenu de ta cellule "FindeVie" ?

Cordialement,

Parce qu'en complément, je souhaite vérouiller la cellule lorsque scénario moyen, enfouissement ou incineration sont sélectionnées et la dévérouiller lorsque valorisation matière est selectionnée, et je viens de me rendre compte que ma solution ne fonctionne pas, donc si tu en as une aussi pour ça, je suis preneur ...

Et je préfère utiliser la VBA pour l'ensemble plutôt que d'avoir un peut de mise en forme conditionnelle pour la forme et de VBA pour le vérouillage.

De plus, la mise en forme conditionnelle, perso, je trouve ça un peu galère à utiliser.

Bon déjà pour le problème de mémoire, modifie comme ceci dans ta macro worksheet_change :

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("FindeVie").Address AND Range("FindeVie").value <> "" Then
If Range("FindeVie") = Range("Incineration") Or Range("FindeVie") = Range("Enfouissement") Or Range("FindeVie") = Range("ScenarioMoyen") Then
Range("TauxdeRecyclage").ClearContents
Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)
ActiveSheet.Protect DrawingObjects:=True, contents:=True, Scenarios:=True, password:="tonmotdepasse"
ElseIf Range("FindeVie") = Range("ValorisationMatiere") Then
ActiveSheet.Unprotect password:="tonmotdepasse"
Range("TauxdeRecyclage").Interior.Color = RGB(255, 255, 255)
Range("TauxdeRecyclage").Font.Color = RGB(64, 64, 64)
Else:
ActiveSheet.Unprotect password:="tonmotdepasse"
Range("TauxdeRecyclage").ClearContents
Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)
End If
end if
End Sub

Cela devrait permettre que la macro ne se déclenche que sur changement sur cette cellule et que si elle n'est pas vide (donc pas sur ta remise à zéro non plus) gràce à :

If Target.Address = Range("FindeVie").Address AND Range("FindeVie").value <> "" Then

Concernant le vérrouillage, tu veux que la personne ne puisse plus sélectionner la cellule ni la modifier ? Il faut passer par un verrouillage de la feuille en fait.

click droit sur ta cellule => format => onglet "protection" et tu coches "vérrouillée"

J'ai déjà ajouté dans le code ci-dessus les lignes à ajouter, par contre je suis parti sur le fait que quand tu remets à zéro, tu dévérrouilles aussi.

Bien sur, sans fichier je n'ai pas testé le code, donc sous réserve que ca marche ^^

Sinon Demain, je me ferais un fichier test vite fait si j'ai le temps.

Cordialement,

Ok, je vais essayé tout ça merci beaucoup en tout cas !

Je vous aussi si je peux avoir l'autorisation de ne passer que la feuille concernée en PJ.

Petit précision sur le verrouillage des cellules.

En faite, je souhaite que la cellule "TauxdeRecyclage" soit verrouillée lorsque "FindeVie" = scénario moyen, enfouissement ou incineration et déverrouillée lorsque "FindeVie" = ValorisationMatière

La cellule "FindeVie" est toujours déverrouillée et le reste de la feuille est verrouillé.

Je viens de retravailler dessus. en m'inspirant en grande partie de tes explications, voici les codes qui fonctionne (miracle !).

Pour ma feuille de calcul

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = Range("FindeVie").Address And Range("FindeVie").Value <> "" Then

If Range("FindeVie") = Range("Incineration") Or Range("FindeVie") = Range("Enfouissement") Or Range("FindeVie") = Range("ScenarioMoyen") Then

ActiveSheet.Unprotect Password:="moi"

Range("TauxdeRecyclage").ClearContents

Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)

Range("TauxdeRecyclage").Locked = True

ActiveSheet.Protect DrawingObjects:=True, contents:=True, Scenarios:=True, Password:="moi"

ElseIf Range("FindeVie") = Range("ValorisationMatiere") Then

ActiveSheet.Unprotect Password:="moi"

Range("TauxdeRecyclage").Interior.Color = RGB(255, 255, 255)

Range("TauxdeRecyclage").Font.Color = RGB(64, 64, 64)

Range("TauxdeRecyclage").Locked = False

ActiveSheet.Protect DrawingObjects:=True, contents:=True, Scenarios:=True, Password:="moi"

Else:

ActiveSheet.Unprotect Password:="moi"

Range("TauxdeRecyclage").ClearContents

Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)

ActiveSheet.Protect DrawingObjects:=True, contents:=True, Scenarios:=True, Password:="moi"

End If

End If

End Sub

Et pour mon bouton de remise à 0 :

Sub Clear_New()

Range("TypeStore").ClearContents

Range("Longueur").ClearContents

Range("Hauteur").ClearContents

Range("I25").ClearContents

Range("FindeVie").ClearContents

If Range("TauxdeRecyclage").Locked = False Then

ActiveSheet.Unprotect Password:="moi"

Range("TauxdeRecyclage").ClearContents

Range("TauxdeRecyclage").Interior.Color = RGB(97, 181, 68)

Range("TauxdeRecyclage").Locked = True

ActiveSheet.Protect DrawingObjects:=True, contents:=True, Scenarios:=True, Password:="moi"

End If

Range("TypeStore").Select

End Sub

Encore merci pour ton aide très précieuse, à bientôt !

Félicien

Rechercher des sujets similaires à "erreur execution"