Problème de code

Mayss -  
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

A voir également:

14 réponses

f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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+
0
Mayss
 
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 :)
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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 ??
0
Mayss
 
Oui elles changeront car par la suite, de données seront saisies dedans =)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Re,

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+
0
mayss
 
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 !
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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!!!!
0
mayss
 
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 ^^
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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.
0
mayss
 
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 ?
0
mayss
 
Autre question, comment réactiver les Evènements dans VBA une fois qu'ils se sont désactivés ?
0
mayss
 
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 !
0
mayss
 
Bon j'ai trouvé =) C'était bien car j'utilisais du Byte et non Integer !
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Re,

dans le code que j'ai ecrit:

'invalide les evenement EXCEL
Application.EnableEvents = False
'Valide le evenements EXCEL
Application.EnableEvents = True

et

'valide les evenements EXCEL
'en cas de plantage lancer ce sub
Sub evenements()
Application.EnableEvents = True
End Sub
0