Problème de code

Mayss -  
f894009 Messages postés 17417 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

14 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  2. 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
  3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  4. Mayss
     
    Oui elles changeront car par la suite, de données seront saisies dedans =)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  7. 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
  8. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  9. 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
  10. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  11. 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
  12. mayss
     
    Autre question, comment réactiver les Evènements dans VBA une fois qu'ils se sont désactivés ?
    0
  13. 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
    1. mayss
       
      Bon j'ai trouvé =) C'était bien car j'utilisais du Byte et non Integer !
      0
  14. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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
  15. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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