Problème de code
Mayss
-
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
f894009 Messages postés 17277 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un problème avec mon code VBA qui fait buguer toute ma feuille Excel et j'avoue ne pas vraiment trouver la solution...
Voici les 2 modules que j'ai :
Private Sub Worksheet_Change(ByVal Target As Range)
If 2 >= Target.Column Or Target.Column > 4 Then Exit Sub
If Target.Row < 255 Then AleaCel Target.Row, 3
End Sub
Sub AleaCel(Ligne As Byte, Colonne As Byte)
For Ligne = 4 To 200
Colonne = 3
If Cells(Ligne, Colonne) = "oui" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 3).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 4).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 5).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = 40
Cells(Ligne, Colonne).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 1) = ""
ElseIf Cells(Ligne, Colonne) = "non" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 3).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 4).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 5).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 1) = ""
Cells(Ligne, Colonne) = ""
End If
If Cells(Ligne, Colonne + 1) = "oui" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 3).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 4).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 5).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne) = ""
ElseIf Cells(Ligne, Colonne + 1) = "non" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 3).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 4).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 5).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = 40
Cells(Ligne, Colonne).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 1) = ""
Cells(Ligne, Colonne) = ""
End If
Next
End Sub
Le principe est assez simple : je voudrais qu'en changeant "oui" à "non" (ou inversement, mais aussi de rien à "oui" etc) dans une case, d'autres cases autour s'adaptent en changeant de couleur et en effaçant le texte qu'il y avait au préalable.
Merci d'avance de votre aide !
Mayss
J'ai un problème avec mon code VBA qui fait buguer toute ma feuille Excel et j'avoue ne pas vraiment trouver la solution...
Voici les 2 modules que j'ai :
Private Sub Worksheet_Change(ByVal Target As Range)
If 2 >= Target.Column Or Target.Column > 4 Then Exit Sub
If Target.Row < 255 Then AleaCel Target.Row, 3
End Sub
Sub AleaCel(Ligne As Byte, Colonne As Byte)
For Ligne = 4 To 200
Colonne = 3
If Cells(Ligne, Colonne) = "oui" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 3).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 4).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 5).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = 40
Cells(Ligne, Colonne).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 1) = ""
ElseIf Cells(Ligne, Colonne) = "non" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 3).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 4).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 5).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 1) = ""
Cells(Ligne, Colonne) = ""
End If
If Cells(Ligne, Colonne + 1) = "oui" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 3).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 4).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 5).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne) = ""
ElseIf Cells(Ligne, Colonne + 1) = "non" Then
Cells(Ligne, Colonne + 2) = ""
Cells(Ligne, Colonne + 3) = ""
Cells(Ligne, Colonne + 4) = ""
Cells(Ligne, Colonne + 5) = ""
Cells(Ligne, Colonne + 2).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 3).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 4).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 5).Interior.ColorIndex = 40
Cells(Ligne, Colonne + 1).Interior.ColorIndex = 40
Cells(Ligne, Colonne).Interior.ColorIndex = xlColorIndexNone
Cells(Ligne, Colonne + 1) = ""
Cells(Ligne, Colonne) = ""
End If
Next
End Sub
Le principe est assez simple : je voudrais qu'en changeant "oui" à "non" (ou inversement, mais aussi de rien à "oui" etc) dans une case, d'autres cases autour s'adaptent en changeant de couleur et en effaçant le texte qu'il y avait au préalable.
Merci d'avance de votre aide !
Mayss
A voir également:
- Problème de code
- Code ascii - Guide
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
14 réponses
Bonjour,
La saisie se fait bien colonne C et/ou D ????
Changerez vous d'avis sur les colonnes a modifier suivant la saisie oui, non, rien ???
A+
La saisie se fait bien colonne C et/ou D ????
Changerez vous d'avis sur les colonnes a modifier suivant la saisie oui, non, rien ???
A+
Bonjour f894009 et merci de votre réponse !
Oui la saisie se fait bien dans ces colonnes là, et oui il se peut que je change d'avis, et c'est pour ça que je veux que ça puisse être réversible :)
Oui la saisie se fait bien dans ces colonnes là, et oui il se peut que je change d'avis, et c'est pour ça que je veux que ça puisse être réversible :)
Re,
Que vous changiez d'avis pour oui et non, d'accord, mais les colonnes de cellules a modifier a la suite de votre saisie vont-elles changer ??
Que vous changiez d'avis pour oui et non, d'accord, mais les colonnes de cellules a modifier a la suite de votre saisie vont-elles changer ??
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re,
Je me doute bien que vous allez ecrire dans ces cellules!!!!!!
Actuellement, colonnes C a I utilisees, un exemple de code:
A+
Je me doute bien que vous allez ecrire dans ces cellules!!!!!!
Actuellement, colonnes C a I utilisees, un exemple de code:
Private Sub Worksheet_Change(ByVal Target As Range) 'invalide les evenement EXCEL Application.EnableEvents = False 'Ok si colonne C et D et ligne < a 255 If (Target.Column < 3 And Target.Row > 4) And Target.Row > 254 Then Exit Sub 'Appel sub traitement des cellules suivant colonne Call AleaCel(Target.Row, Target.Column) 'Valide le evenements EXCEL Application.EnableEvents = True End Sub Sub AleaCel(Ligne As Byte, Colonne As Byte) If Colonne = 3 Then If Cells(Ligne, Colonne) = "oui" Then 'RAZ cellules Range("C" & Ligne & ":G" & Ligne).ClearContents 'Pas de couleur Range("C" & Ligne & ",E" & Ligne & ",G" & Ligne).Interior.ColorIndex = xlColorIndexNone ' Couleur Range("D" & Ligne & ",F" & Ligne & ",H" & Ligne).Interior.ColorIndex = 40 ElseIf Cells(Ligne, Colonne) = "non" Then Range("C" & Ligne & ":G" & Ligne).ClearContents Range("C" & Ligne & ",E" & Ligne & ",G" & Ligne).Interior.ColorIndex = 40 Range("D" & Ligne & ",F" & Ligne & ",H" & Ligne).Interior.ColorIndex = xlColorIndexNone End If ElseIf Colonne = 4 Then If Cells(Ligne, Colonne) = "oui" Then Range("D" & Ligne & ":H" & Ligne).ClearContents Range("D" & Ligne & ",F" & Ligne & ",H" & Ligne).Interior.ColorIndex = 40 Range("E" & Ligne & ",G" & Ligne & ",I" & Ligne).Interior.ColorIndex = xlColorIndexNone ElseIf Cells(Ligne, Colonne) = "non" Then Range("D" & Ligne & ":H" & Ligne).ClearContents Range("D" & Ligne & ",F" & Ligne & ",H" & Ligne).Interior.ColorIndex = xlColorIndexNone Range("E" & Ligne & ",G" & Ligne & ",I" & Ligne).Interior.ColorIndex = 40 End If End If End Sub 'valide les evenements EXCEL 'en cas de plantage lancer ce sub Sub evenements() Application.EnableEvents = True End Sub
A+
Super c'est top ! Je l'ai modifié un peu pour répondre exactement à mes attentes, mais la structure est géniale =)
Par contre j'ai quelques questions pour parfaire ma compréhension du code (sûrement très basiques mais je n'ai presque jamais programmé en VBA avant...)
- Que fait "EnableEvents" exactement ?
- Qu'est-ce que la fonction Target concrètement ? Est-ce que ça cible (d'où Target...?) la cellule que l'on modifie et "enregistre" sa position ?
- Pourquoi traiter les colonnes une fois par leur nombre (colonne = 3) et plus loin par leur nom ("C" & Ligne...etc) ?
Merci encore !
Par contre j'ai quelques questions pour parfaire ma compréhension du code (sûrement très basiques mais je n'ai presque jamais programmé en VBA avant...)
- Que fait "EnableEvents" exactement ?
- Qu'est-ce que la fonction Target concrètement ? Est-ce que ça cible (d'où Target...?) la cellule que l'on modifie et "enregistre" sa position ?
- Pourquoi traiter les colonnes une fois par leur nombre (colonne = 3) et plus loin par leur nom ("C" & Ligne...etc) ?
Merci encore !
Bonjour,
- Que fait "EnableEvents" exactement ?
stop tous les evenements d'excel que vous trouvez dans les listes de choix du VBA.
Pour votre cas, empeche la recursivite liee a vos changements des cellules.
Attetion: si une erreur plante le VBA, il faut reactiver ces evenements.
- Qu'est-ce que la fonction Target concrètement ? c'est un objet qui prend tous les parametres de la cellules qui a ete selectionnee.
- Pourquoi traiter les colonnes une fois par leur nombre (colonne = 3) et plus loin par leur nom ("C" & Ligne...etc) ? Tout simplement pour une compréhension plus facile du code, ici 3 egale colonne C, si vous aviez choisi la colonne 242, voir 14572 (excel 2007 et +), un peu plus difficile de la retrouvee sur la feuille!!!!
- Que fait "EnableEvents" exactement ?
stop tous les evenements d'excel que vous trouvez dans les listes de choix du VBA.
Pour votre cas, empeche la recursivite liee a vos changements des cellules.
Attetion: si une erreur plante le VBA, il faut reactiver ces evenements.
- Qu'est-ce que la fonction Target concrètement ? c'est un objet qui prend tous les parametres de la cellules qui a ete selectionnee.
- Pourquoi traiter les colonnes une fois par leur nombre (colonne = 3) et plus loin par leur nom ("C" & Ligne...etc) ? Tout simplement pour une compréhension plus facile du code, ici 3 egale colonne C, si vous aviez choisi la colonne 242, voir 14572 (excel 2007 et +), un peu plus difficile de la retrouvee sur la feuille!!!!
Re bonjour !
D'abord, merci pour votre réponse !
La seule chose que j'ai du mal à vraiment comprendre, c'est le EnableEvents.
Qu'est-ce que vous appelez la récursivité liée à mes cellules ?
Le programme stoppe les évènements pour pouvoir lancer la fonction Alea, et les réactive après...pourquoi ?
J'ai l'impression d'être un peu lent aujourd'hui mais j'avoue avoir vraiment du mal là dessus ^^
D'abord, merci pour votre réponse !
La seule chose que j'ai du mal à vraiment comprendre, c'est le EnableEvents.
Qu'est-ce que vous appelez la récursivité liée à mes cellules ?
Le programme stoppe les évènements pour pouvoir lancer la fonction Alea, et les réactive après...pourquoi ?
J'ai l'impression d'être un peu lent aujourd'hui mais j'avoue avoir vraiment du mal là dessus ^^
Re,
si vous voulez en savoir plus:
https://openclassrooms.com/fr/courses
Dans votre programme, vous faites des changements de valeur de cellules, ce qui provoque un appel recusif de votre programme et provoque des anomalies.
Ce type d'appel ou fonction recursive est tres utilisee en programmation, a condition d'en maitriser un minium.
si vous voulez en savoir plus:
https://openclassrooms.com/fr/courses
Dans votre programme, vous faites des changements de valeur de cellules, ce qui provoque un appel recusif de votre programme et provoque des anomalies.
Ce type d'appel ou fonction recursive est tres utilisee en programmation, a condition d'en maitriser un minium.
Haha oui je sais ce qu'est la récursivité car j'ai l'habitude de Matlab =)
Mais la façon de programmer sur VBA est pour moi assez différente de celle dont j'ai l'habitude.
Je vais vous dire ce que je comprends dans le Sub principal :
- Arrêter les Evènements
- Si une modif est faite sur des colonnes différentes de C ou D, ou supérieure à 254, alors sortir du Sub
- Dans le cas où c'est C ou D et inférieur à un numéro de ligne de 254, lancer Alea
- Activer les évènements
Et là, ce que je ne comprends pas, c'est : qu'est-ce que viennent faire les évènements dans tout ça ? ^^
Un évènement, ça ne peut pas être une fonction comme Alea par exemple si ?
Mais la façon de programmer sur VBA est pour moi assez différente de celle dont j'ai l'habitude.
Je vais vous dire ce que je comprends dans le Sub principal :
- Arrêter les Evènements
- Si une modif est faite sur des colonnes différentes de C ou D, ou supérieure à 254, alors sortir du Sub
- Dans le cas où c'est C ou D et inférieur à un numéro de ligne de 254, lancer Alea
- Activer les évènements
Et là, ce que je ne comprends pas, c'est : qu'est-ce que viennent faire les évènements dans tout ça ? ^^
Un évènement, ça ne peut pas être une fonction comme Alea par exemple si ?
Ah oui et dernier problème (j'espère !), j'ai voulu augmenter la limite à 500 (et plus 254) pour les numéros de lignes qui déclenchent l'appel de la fonction.
Malheuresement, le programme stoppe et je n'arrive pas à comprendre d'où vient le problème. Est-ce un problème de taille de variable ?
Par exemple, "Ligne" ne pourrait pas dépasser 254 ?
Merci encore !
Malheuresement, le programme stoppe et je n'arrive pas à comprendre d'où vient le problème. Est-ce un problème de taille de variable ?
Par exemple, "Ligne" ne pourrait pas dépasser 254 ?
Merci encore !
Re,
Quand vous effacez le contenu d'une cellule par programme dans l'evenement Private Sub Worksheet_Change(ByVal Target As Range) , vous provoquez une recursivite de cette evenement qui est gere par excel, pour eviter cela il faut desactiver la gestion des evenements d'excel. Si trop de recursivite, excel se plante, dans votre cas cela provoque des anomalies d'affichage
Quand vous effacez le contenu d'une cellule par programme dans l'evenement Private Sub Worksheet_Change(ByVal Target As Range) , vous provoquez une recursivite de cette evenement qui est gere par excel, pour eviter cela il faut desactiver la gestion des evenements d'excel. Si trop de recursivite, excel se plante, dans votre cas cela provoque des anomalies d'affichage