Ajouter des arguments à une procédure

Bonsoir,

Je voudrais ajouter des arguments à cette procédure, mais j'ai toujours un message d'erreur qui apparaît :

"Erreur de compilation:

La déclaration de la procédure ne correspond pas à la description de l’événement ou de la procédure de même nom"

Pouvez me dire comment faire pour ajouter des arguments. Merci d'avance

Private Sub Worksheet_Change (ByVal APERCU As Range) ' Proc. intervenant à changement valeur dans feuille, Target étant la plage modifiée
   Dim COULEUR, n, RAL As Range  ' déclarations des variables
   If APERCU.Row < 3 Then Exit Sub  ' Interruption si APERCU est au-dessus de la ligne 3
   For Each RAL In Intersect(APERCU, Me.Columns(3))  ' balayage plage impactée (si comporte plusieurs cellules en col. C
       If RAL.Value <> "" Then ' si cellule comporte une valeur
           On Error GoTo errcodral '  gestion erreur renvoyant en fin proc si valeur n'est pas un code RAL
           n = WorksheetFunction.Match(RAL.Value, [TABLEAU_COULEUR].Columns(1), 0) ' Recherche ligne code dans tableau (fonction EQUIV)
           COULEUR = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color ' Récup. couleur dans col. 4 du tableau
           RAL.Offset(, 3).Interior.Color = COULEUR ' affectation couleur en F en regard saisie du code
       Else ' si la cellule est vide ou a été effacée
           RAL.Offset(, 3).Interior.ColorIndex = xlColorIndexNone ' on enlève couleur éventuelle
       End If
    Next RAL
errcodral: ' étiquette renvoi erreur pour sortir procédure
End Sub

Sinon je me demandais si il était possible de mettre 2 procédures WorkSheet_Change par feuille, si oui comment faire ?

Merci

Ou alors de me dire comment faire pour rajouter du texte d'une cellule adjacente à celle utiliser pour obtenir la couleur à cette argument

COULEUR = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color

BONJOUR

essayer ca :

Private Sub Worksheet_Change(ByVal APERCU As Range)  ' Proc. intervenant à changement valeur dans feuille, Target étant la plage modifiée
  Dim COULEUR, n, RAL As Range  ' déclarations des variables  

  If APERCU.Rows.Count < 3 Then Exit Sub  ' Interruption si APERCU est au-dessus de la ligne 3

  If Not Intersect(APERCU, Me.Columns(3)) Is Nothing Then

  For Each RAL In APERCU.Cells 'Intersect(APERCU, Me.Columns(3))  ' balayage plage impactée (si comporte plusieurs cellules en col. C
      MsgBox RAL.Row
      If RAL.Value <> "" Then ' si cellule comporte une valeur
          On Error GoTo errcodral '  gestion erreur renvoyant en fin proc si valeur n'est pas un code RAL
          n = WorksheetFunction.Match(RAL.Value, [TABLEAU_COULEUR].Columns(1), 0) ' Recherche ligne code dans tableau (fonction EQUIV)
          COULEUR = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color ' Récup. couleur dans col. 4 du tableau
          RAL.Offset(, 3).Interior.Color = COULEUR ' affectation couleur en F en regard saisie du code
      Else ' si la cellule est vide ou a été effacée
          RAL.Offset(, 3).Interior.ColorIndex = xlColorIndexNone ' on enlève couleur éventuelle
      End If
    Next RAL
    End If
errcodral: ' étiquette renvoi erreur pour sortir procédure

End Sub

Bonjour,

J'avoue que fournir un code propre pour le voir maltraité est peu encourageant... !

Au-delà du style que je considère comme peu favorable à une programmation correcte (ce dont je ne discuterai pas ici car cela suppose de maîtriser les bases), détyper des variables qui l'étaient n'est pas vraiment une attitude rationnelle.

Il n'est pas par ailleurs particulièrement judicieux de tripatouiller les évènementielles sans avoir une idée claire de la nature de ces procédures.

Un évènement ne peut déclencher que la procédure qui lui a été dévolue dans le programme, avec les arguments qui lui ont été définis.

AMIR : ton ajout ne sert à rien, s'il n'y a pas d'intersection il ne se passe rien !

Et ce n'était pas la demande de shirudo qui de toute façon n'a rien dit de ce qu'il voulait faire.

Pour le code j'ai essayé de le modifier, mais mis à part le nom des arguments je n'ai rien réussi à faire d'autre...

En fait ce que je veux faire c'est, en plus de faire apparaître la couleur, faire apparaître le texte dans les colonnes à côté de l'aperçu de la couleur. Le texte (c'est à dire le code HEX et la dénomination) correspond au code HEX et à la Dénomination provenant de la plage TABLEAU_COULEUR, "le choix" doit se faire de la manière que l'aperçu de la couleur

A la base, j'avais utilisé la fonction RECHERCHEV mais le problème c'est que je ne peux récupérer le texte avec un simple Ctrl+C, Ctrl+V

Merci d'avance

Et encore désolé d'avoir "charcuté" une procédure, c'est le cadre de mon projet de fin d'étude et le niveau de mes profs est ridicule...

14recap-pc-v3-2.xlsm (60.91 Ko)

C'est bien sûr possible sans bouleversement !

Mais je ne comprends pas ton histoire de copier-coller, tes formules jouaient bien leur rôle et elles pouvaient continuer à fonctionner.

C'est surtout pour montrer de la programmation à mes profs, je veux faire la même chose que les formules mais en programmation

Voilà la procédure modifiée, pour prendre en compte les données texte, et par ailleurs sécurisée contre quelques effets en retour...

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim coul&, n%, c As Range, hd
    If Target.Row < 3 And Target.Column <> 3 Then Exit Sub
    Application.EnableEvents = False
    On Error GoTo errcodral
    For Each c In Intersect(Target, Me.Columns(3)) '.Cells
        If c.Value <> "" Then
            n = WorksheetFunction.Match(c.Value, [TABLEAU_COULEUR].Columns(1), 0)
            coul = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color
            hd = [TABLEAU_COULEUR].Cells(n, 2).Resize(, 2).Value
            c.Offset(, 3).Interior.Color = coul
            c.Offset(, 1).Resize(, 2).Value = hd
        Else
            c.Offset(, 3).Interior.ColorIndex = xlColorIndexNone
            c.Offset(, 1).Resize(, 2).ClearContents
        End If
    Next c
errcodral:
    Application.EnableEvents = True
End Sub

Prends en compte toutes les modifications.

J'ai modifié la procédure initiale, car l'abondance de majuscules nuit à la lisibilité... C'est un phénomène général étudié depuis fort longtemps qu'un texte en majuscules est moins lisible qu'un texte en minuscules. Et c'est vrai aussi en programmation, d'autant qu'on utilise souvent l'insertion de lettres majuscules comme repère d'erreurs de frappe (en tapant en minuscules, si les lettres qui sont définies en majuscules ne s'y remettent pas, cela décèle une erreur de frappe...)

Cordialement.

Vraiment merci beaucoup, j'ai plus appris avec vous qu'avec mes profs.

Je vais annoter votre procédure et je reviendrai vers vous pour vous demander si celles-ci sont bonnes

bonjour

Je sai qu’il n'a rien dit de ce qu'il voulait faire, j ai voulu seulement le pousser un peut

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim coul&, n%, c As Range, hd

    ' ca sera pas bien au mesure ou il a autre evenement a gerer :
    'If Target.Row < 3 And Target.Column <> 3 Then Exit Sub
    ' Application.EnableEvents = False

    On Error GoTo errcodral

If Not Intersect(Target, Me.Columns(3)) Is Nothing Then ' agir que si une celulle a ete modifie
If Target.Row >= 3 Then ' If Target.Row < 3 Then Exit Sub ' il faut qu il soit un nbre egal ou plus de 3
For Each c In Intersect(Target, Me.Columns(3)) '.Cells
        If c.Value <> "" Then
            n = WorksheetFunction.Match(c.Value, [TABLEAU_COULEUR].Columns(1), 0)
            coul = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color
            hd = [TABLEAU_COULEUR].Cells(n, 2).Resize(, 2).Value
            c.Offset(, 3).Interior.Color = coul
            c.Offset(, 1).Resize(, 2).Value = hd
        Else
            c.Offset(, 3).Interior.ColorIndex = xlColorIndexNone
            c.Offset(, 1).Resize(, 2).ClearContents
        End If
    Next c

End If
End If
errcodral:
  ' Application.EnableEvents = True
End Sub

Avec les annotations, je ne comprend pas à quoi servent les Application.EnableEvents

Private Sub Worksheet_Change(ByVal Target As Range)                                 ' Procédure intervenant à chaque changement de valeur dans la feuille, Target est la plage modifiée
Dim coul&, n%, c As Range, hd                                                       ' déclaration des variables

    If Target.Row < 3 And Target.Column <> 3 Then Exit Sub                          ' Si la cellule où se trouve le code ne se situe pas après la ligne 3 et en colonne C, la procédure s'arrête

    Application.EnableEvents = False                                                ' ?????

    On Error GoTo errcodral                                                         ' S'il y a une erreur, la procédure est directement renvoyée à l'étiquette "errcodral"

    For Each c In Intersect(Target, Me.Columns(3))                                  ' Balayage de la plage impactée (si comporte plusieurs cellules en colonne C)

        If c.Value <> "" Then                                                       ' si la cellule n'est pas vide alors...
            n = WorksheetFunction.Match(c.Value, [TABLEAU_COULEUR].Columns(1), 0)   ' Recherche de la ligne où apparaît la valeur exacte du code RAL dans la plage "TABLEAU_COULEUR"
            coul = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color                     ' Récupération de la couleur dans la 4ème colonne de la plage "TABLEAU_COULEUR" sur la ligne recherchée précédemment
            hd = [TABLEAU_COULEUR].Cells(n, 2).Resize(, 2).Value                    ' Récupération du texte dans la 2nde colonne de la plage "TABLEAU_COULEUR" et de la 2nde colonne (soit la 3ème colonne) par rapport la valeur de la ligne recherchée précédemment
            c.Offset(, 3).Interior.Color = coul                                     ' Affectation de la couleur dans la 3ème colonne après le code RAL
            c.Offset(, 1).Resize(, 2).Value = hd                                    ' Affectattion du texte dans la 1ère et 2nde colonne après le code RAL

        Else                                                                        ' Si la cellule ne comporte plus de valeur alors...
            c.Offset(, 3).Interior.ColorIndex = xlColorIndexNone                    ' Supprime la couleur de la 3ème colonne après le code RAL
            c.Offset(, 1).Resize(, 2).ClearContents                                 ' Supprime le texte dans la 1ère et 2nde colonne après le code RAL

        End If

    Next c

errcodral:                                                                          ' Etiquette permettant de pouvoir sauter des étapes, en l'occurence ici permet de pouvoir quitter la procédure en cas d'erreur

    Application.EnableEvents = True                                                 ' ?????

End Sub

Bonjour,

Enableevents = false va te désactiver les évènements et Enableevents = true va te les réactiver.

Pour les évènements je te renvois à la première réponse de MFerrand :

MFerrand a écrit :

Il n'est pas par ailleurs particulièrement judicieux de tripatouiller les évènementielles sans avoir une idée claire de la nature de ces procédures.

Un évènement ne peut déclencher que la procédure qui lui a été dévolue dans le programme, avec les arguments qui lui ont été définis.

D'où le fait de les désactiver et les réactiver à la fin.

bonjour

Utilisez la propriété EnableEvents pour activer ou désactiver des événements. Par exemple, le fait d'utiliser la méthode Save pour enregistrer un classeur déclenche l'événement BeforeSave. Vous pouvez l'éviter en affectant la valeur False à la propriété EnableEvents avant d'appeler la méthode Save.

Exemple :

sub savetest ()
Application.EnableEvents = False
ActiveWorkbook.Save
Application.EnableEvents = True
End SUB

Mais il ne faut pas s amuser par les ajouter n importe ou :

Application.EnableEvents = False
Application.EnableEvents = True

Re,

Un petit allègement et une petite amélioration.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim coul&, n%, c As Range, hd
    If Target.Row < 3 Then Exit Sub
    If Intersect(Target, Me.Columns(3)) Is Nothing Then Exit Sub
    For Each c In Intersect(Target, Me.Columns(3))
        If c.Value <> "" Then
            On Error GoTo errcodral
            n = WorksheetFunction.Match(c.Value, [TABLEAU_COULEUR].Columns(1), 0)
            coul = [TABLEAU_COULEUR].Cells(n, 4).Interior.Color
            hd = [TABLEAU_COULEUR].Cells(n, 2).Resize(, 2).Value
            c.Offset(, 3).Interior.Color = coul
            c.Offset(, 1).Resize(, 2).Value = hd
        Else
            c.Offset(, 3).Interior.ColorIndex = xlColorIndexNone
            c.Offset(, 1).Resize(, 2).ClearContents
        End If
    Next c
errcodral:
End Sub

J'ai supprimé l'interruption des évènements que j'avais introduit à cause d'effets en retour lors d'effacements divers et ramené la gestion d'erreurs sur la seule erreur préidentifée qui est la saisie d'un code inexistant.

J'ai aussi supprimé la sortie de procédure sur la colonne 3 car cela éliminait l'exécution de la procédure lors d'un effacement de la colonne 1 à la colonne 3 au profit de l'absence d'intersection avec la 3.

Je te demanderai donc de tester cette version, en opérant entre autres toutes sortes de combinaisons d'effacement...

Il resterait un point éventuellement à traiter, mais je te laisse d'abord tester ça, et le soulever éventuellement si tu notes qu'une autre intervention serait à ajouter à cet ensemble...

J'ai revu de plus près tes annotations... Tout va bien, pas de problème dans l'interprétation du code !

Juste Enable.Events, expliqué maintenant, et c'est effectivement une commande importante... Lorsque tu fais une procédure réagissant à un évènement, ce que tu fais dans cette procédure va à son tour déclencher des évènements, d'où l'importance de cibler la zone à laquelle tu réagis pour sortir de la procédure sans rien faire lorsque cette zone n'est pas touchée, et éventuellement les interrompre, sans oublier de les rétablir, pour sécuriser ton action qui peut éventuellement déclencher des évènements en boucle.

On peut également jouer sélectivement avec des variables booléennes de niveau module pour donner ou non cours à tel ou tel évènement selon la valeur d'une variable. Cela peut être une bonne solution quand tu as plusieurs procédures évènementielles qui doivent s'exécuter si des conditions sont réunies, et EnableEvents ayant un effet global ne serait pas alors assez sélectif...

Bonne soirée.

Bonjour !

Merci à tous pour vos réponses

J'ai regardé le nouveau code et il fonctionne super bien, pas de problème particulier.

Après oui j'avais pensé rajouter, une msgbox qui apparaîtrait lorsque le code RAL qui est tapé n'existe pas et ajouter une suppression du contenu car quand on tape un code qui existe, les éléments apparaissent mais quand on retape par dessus un code qui n'existe pas, les éléments du code précédent restent.

J'ai essayé de le faire mais sans succès, d'où le fait que je réponde aussi tard.

Merci

Bonjour,

Je n'avais pas envisagé ce problème !!! Mais facile à résoudre....

Par contre, j'avais pensé au cas où on efface des données en D et E, le code en C reste... J'ai pensé à 2 solutions possibles : soit annuler cette opération, soit effacer alors la colonne C (voire la A ?)...

Cordialement.

Je pense que le mieux est d'annuler l'opération, car dans le principe je n'ai aucune raison de supprimer l'une de ses deux colonnes.

Merci bien

Est ce qu'il serait possible d'avoir quelques indications car je voudrais essayer de réaliser les modifications, car j'ai essayé de le faire hier mais sans succès

Merci d'avance

Rechercher des sujets similaires à "ajouter arguments procedure"