Plusieurs Worksheet_Change dans un classeur ?

Bonjour,

j'aurais voulu savoir s'il était possible d'avoir plusieurs routines Worksheet_Change dans un même classeur ? C'est à dire en écrire une sur une feuille pour qu'elle exécute certaines conditions sur cette feuille, et en écrire une sur une autre feuille pour qu'elle exécute d'autres conditions sur cette même feuille ?

Cordialement.



--
Ce mec la n'était pas une lumière, car il était niais.

7 réponses

Résumé de la discussion

Il est préférable d’utiliser une seule procédure Worksheet_Change et d’y intégrer les différentes conditions de déclenchement, plutôt que de multiplier plusieurs routines pour le même classeur. On peut utiliser une suite de blocs If ou Select Case pour traiter des plages distinctes selon la feuille, par exemple en testant des plages comme A1:A10 et A11:A20. Cela peut toutefois s’avérer piégeux, car la gestion multiple de déclenchements augmente la complexité et nécessite de veiller à ne pas interférer entre les actions. D’autres approches existent mais la solution recommandée reste d’ordonner le code dans une seule procédure et d’ajuster les conditions selon les plages et feuilles ciblées.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour chossette

    Non, 1 seule dans laquelle tu écris les différentes conditions de déclenchement ==> suite de if ou de select case
    par ex
    i
    f not intersect(target, range("A1:A10") is nothing then 
       tonaction1 
    end if 
    if not intersect(target, range("A11:A20")  is nothing then 
       tonaction2 
    end if

    mais ça peut être un truc assez piègeux !!!
    tu dis si ça coince: plus on est de fous... ;-)
    Michel
    0
    1. Contributeur
      En fait ça coince parce que je veux réaliser une action sur une première feuille, et une seconde action sur d'autres feuilles.

      J'ai essayé avec la
      Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      seulement ça fonctionne pas.

      N'ayant pas mon fichier près de moi (je suis au bureau), je vais essayer de créer rapidement un exemple de mon code macro :
      Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      	Dim feuilles As String, Feuilles2 As String
      	feuilles = ("Bundesliga, Calcio, Ligue 1, Ligue 2, Liga BBVA, Premier League")
      	feuilles2 = ("Buts")
      
      	If InStr(feuilles, Sh.Name) > 0 Then
      		macro1
      	ElseIF InStr(feuilles2, Sh.Name) > 0 Then
      		macro2
      	End If
      End Sub


      En fait il s'agit d'un fichier pour suivre les résultats de championnats européens, ainsi que les classements des buteurs.

      Si tu as besoin du fichier entier pour voir ce que je veux faire, je ne pourrais pas le donner avant ce soir :/

      Cordialement.
      0
      1. Contributeur
        si j'ai compris qu'il s'agit d'un déclenchement d'action suivant la feuille que tu actives

        Private Sub Workbook_SheetActivate(ByVal Sh As Object) 
        onglets = Array("feuil1", "feuil2", "feuil3", "feuil4") 
        num = Application.Match(Sh.Name, onglets, 0) 
        If num = 2 Then 
             MsgBox "action2" 
        Else 
             MsgBox "action1" 
        
        End If 
        
        End Sub


        Ca, tu peux l'essayer au bureau! :oD
        Michel
        0
        1. Contributeur
          En fait non je me suis mal exprimé. Je vais essayer d'être clair, mais ça ne va pas être facile car sans le fichier sous les yeux, je crains de ne pouvoir me faire comprendre :

          - j'ai une première macro qui doit se déclencher sur l'onglet "Buts". Cet onglet permet de faire un récapitulatif des buts marqués dans chaque match des différents championnats. Je marque donc le championnat, la date et l'heure, le buteur, pour quelle équipe, contre quelle équipe, s'il s'agit d'un CSC, d'un penalty, et le score avec ce but. En colonne O, dès que je marque "X" et appuie sur Entrée, la macro doit me rajouter le but dans l'onglet "Buteurs" (ou dans l'onglet "CSC" si le but est marqué contre son camp par le joueur)

          - la seconde macro doit me permettre d'insérer une image dans différentes colonnes des feuilles "Bundesliga", "Calcio", "Ligue 1"... Ces feuilles ont le même modèle.
          Lorsque je tape le nom d'un club en colonne E ou en colonne H et que j'appuie sur Entrée, la seconde macro affiche le logo du club a côté.

          J'ai déjà créé les deux macro, seulement je ne sais pas comment faire pour les déclencher.

          Merci de te pencher sur le problème. Si je ne suis toujours pas assez clair, il faudra attendre ce soir que je puisse envoyer mon fichier sur cjoint.com.
          0
        2. Contributeur
          OK pour ce soir
          0
      2. Contributeur
        Bonsoir,

        me revoilà, cette fois-ci avec mon fichier, qui permettra plus facilement de régler le problème auquel je fais face.

        https://www.cjoint.com/?BAstvfrxB4E

        J'ai mis les onglets sur lesquels portent les deux macros à tester (celle qui fonctionnera sur l'onglet Bundesliga devra fonctionner pour les onglets Calcio, Ligue 1, Ligue 2, Liga BBVA et Premier League).

        Cordialement.
        0
        1. Contributeur
          Bonjour,

          Ok, bien reçu.

          juste jeté un oeil donc... : où sont tes logos de club ?

          je regarde dans la journée mais d'autres trucs à faire, sois patient!
          0
          1. Contributeur
            Bonjour Michel,

            merci d'y avoir déjà jeté un coup d'oeil.

            Alors effectivement pour les logo, j'ai mal joué le coup. Si jamais tu peux tester avec une image qui est sur ton ordinateur, et que ça marche, je retenterais chez moi avec le bon chemin.

            Aucun problème si tu as d'autres choses à faire. Mon objectif est que ce fichier soit prêt pour la saison 2012-2013, qui ne commencera que fin Juillet au plus tôt :)

            Cordialement.
            0
          2. Contributeur
            OK, Merci
            De toutes façons le top one c'est le Barça... :o)
            0
          3. Contributeur
            Ca on n'en doute pas, même si je suis un peu plus 'Parisien' dans l'âme :)
            0
          4. Contributeur
            je regarde demain matin ( ton pb, pas le PSG) à la fraiche
            0
          5. Contributeur
            Okay !

            Merci de prévenir. Bonne soirée !
            0
        2. Bonjour,
          Est-vous sur de votre formule, elle devrait correspondre à :
          ActiveSheet.Pictures.Insert("C:\Users\jpp\Pictures\Divers\an2_pt.jpg").Select 

          Peut-être un problème de [.... \.... ] qui manque ?

          Salutations.
          Le Pingou
          0
          1. Contributeur
            Pour le moment le code plante à l'appel de la fonction, il m'ouvre une popup avec
            'Erreur de compilation : erreur de syntaxe'
            0
          2. Bonjour,
            Si vous sortez de la routine principal vous pouvez passer la valeur de (Target.value) à un argument de votre procédue secondaire .
            Sub secondaire ( targetval as string)
            ......
            Club=targetval
            ....
            End sub
            Salutations.
            Le Pingou
            0
          3. Contributeur
            Bonjour
            tiré de mon grenier à adapter: insertion d'images dans un trombinoscope

               design = ThisWorkbook.Path & "\" & Ss_dossier & "\" & ident 
                 'prend en compte le format de la photo 
                 If Dir(design & ".png") <> "" Then design = design & ".png" 
                 If Dir(design & ".jpg") <> "" Then design = design & ".jpg" 
                 If Dir(design & ".jpeg") <> "" Then design = design & ".jpeg" 
                 If Dir(design & ".gif") <> "" Then design = design & ".gif" 
                 
                'mémorise la photo à afficher 
                 Set cellule = Cells(lig, col) 
                 On Error GoTo absence 'photo non disponible 
            
                 Set image = ActiveSheet.Pictures.Insert(design) 
                 'insere la photo dans le trombi 
                 With image.ShapeRange 
                      .Top = cellule.Top + 2 
                      .Left = cellule.Left + 1 
                      .Name = "numphoto" & cptr2 
                     .Height = cellule.Height - 3 
                      .Width = cellule.Width - 2 
                      .LockAspectRatio = msoFalse 'garde les proportions de l'original 
                End With 
                 Exit Sub 
                  
            absence: 
                cellule = "photo non disponible"


            Evite au maximum les Select-selection et utilise les blocs (with -end with)
            0
          4. Contributeur
            Merci !! J'arrive à ajouter mes images dans le classeur en m'inspirant de ta macro ci-dessus.

            Maintenant, comment dois-je faire pour que l'image s'adapte à la taille de la cellule ?
            0
          5. Contributeur
            bin tu as
            .Height = cellule.Height - 3
            .Width = cellule.Width - 2
            .LockAspectRatio = msoFalse 'garde les proportions de l'original

            -3 et -2 sont à adapter avec des essais

            je bosse sur ton classement ; je vais te donner une proposition mais avec pas mal de questions
            a' tadleur
            0
        3. Contributeur
          J'ai une autre question : quand j'utilise la macro pour insérer les images, cela fonctionne. Seulement, pour la lancer j'appuie sur Entrée. J'arrive donc à la cellule d'en dessous. Je suis donc obligé de préciser que mon image doit s'implanter sur la ligne d'au dessus.

          Ce principe ne fonctionne pas si jamais je me mets à taper sur tabulation, ou en utilisant les flèches directionnelles du clavier.

          Ma question est donc : y a-t-il possibilité de tester sur quelle touche j'appuie, et donc de varier certaines valeurs en conséquences ?

          Cordialement.
          0