Macro variable selon saisi cellule

Résolu
Bonjour,

cela fait plusieurs jours que je bloque, merci de m'aider svp :
vola mon pb :
J'ai une macro qui récupère des valeurs à partir d'un Tableau croisé dynamique, ma macro selectionne plusieurs champs et les copie/colle dans des cellules. Elle selectionne notamment le champ « année » qui est toujours égal à 2010.

Je souhaiterais saisir l'année sur une cellule excel, par exemple 2011, et qu'a partir de ma saisie dans la cellule « A1 » par exemple, ma macro s'execute en récupérant la valeur de l'année que j'ai saisi

Merci pour votre aide

16 réponses

  1. :-)

    Pour la gestion des évènements, il est souvent plus prudent
    de désactiver les évènements.

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Application.EnableEvents = False
        
        ' Ton code
        ' ...
        
        Application.EnableEvents = True
        
    End Sub
    '
    


    et pour la performance :

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        
        ' Ton code
        ' ...
        
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        
    End Sub
    
    


    Cdt

    Bonne continuité.

    Info
    0
    1. Merci encore Info !!
      tu as parfaitement répondu à mon besoin
      Bonne continuation
      Soniatouns777
      0
      1. re :

        En effet il est impossible de dupliquer les évènements. Par contre
        dans ce même évènement tu peux valider plusieurs cellules.

        Bon j'ai simplifié l'exemple précédent pour ne pas se perdre dans le code!

        Private Sub Worksheet_Change(ByVal Target As Range)
        
            ' Test sur la cellule visé [D6]
            If (Target.Address = "$D$6") Then
                Call Module1.MaMacro(Target.Value)
            Else
                If (Target.Address = "$G$8") Then
                    Call Module1.MaMacro2(Target.Value)
                End If
            End If
        
        End Sub
        '
        


        Il est aussi possible de tester sur une colonne entière, ou une ligne
        entière.

        Private Sub Worksheet_Change(ByVal Target As Range)
        
            ' Test sur la colonne 3 [ C ]
            If (Target.Column = 3) Then
                Call Module1.MaMacro(Target.Value)
            Else
                ' Test sur la ligne 8
                If (Target.Row = 8) Then
                    Call Module1.MaMacro2(Target.Value)
                End If
            End If
        
        End Sub
        '
        


        Et une combinaison de diverses test !

        Private Sub Worksheet_Change(ByVal Target As Range)
        
            ' Test sur la colonne 3 [ C ]
            If (Target.Column = 3) Then
                If ((Target.Row = 6) Or (Target.Row = 8)) Then
                Call Module1.MaMacro(Target.Value)
            Else
                ' Test sur la ligne 8
                If (Target.Row = 8) Then
                    If ((Target.Column > 3) And (Target.Column < 9)) Then
                    Call Module1.MaMacro2(Target.Value)
                End If
            End If
        
        End Sub
        '
        


        Je cite :
        < ... puis je encore abuser une dernière fois de ta gentilesse? ... ]

        Je ne me sens pas abusé le moins du monde, si tu as la patience
        d'attendre la réponse, YAKA demandé et je me ferai un plaisirs
        de t'aider si cela est dans mes cordes.

        L'important est que le tout réponde à ton besoin.

        Cdt

        Info
        0
        1. Merci encore Info,
          J'ai l'impression de rever !! tout fonctionne (ce n'est pas normal)
          puis je encore abuser une dernière fois de ta gentilesse?
          (promis c'est la dernière question ensuite je met le sujet en résolu)

          Je souhaite qu'il y'ai non pas 1 mais 2 cellules dans ma feuille entête dans lesquelles je pourrais saisir dans chacune une date et qui feraient le lien avec le même TCD (mais pas la même extraction)

          quand j'ai voulu ecrire un second :
          Private Sub Worksheet_Change(ByVal Target As Range)
          Excel m'a dit que le nom etait ambigue, comment doit-on l'ecrire STP

          merci encore pour ton intervention
          Soniatouns777
          0
          1. re:

            Suggestion :

            Option Explicit
            
            Private Sub Worksheet_Change(ByVal Target As Range)
            
                ' Constantes de limites inférieur et supérieur
                Const DateMin = #1/15/1950#
                Const DateMax = #1/15/2015#
            
                ' Variable temporaire de comparaison
                Dim LaDate As Date
            
                ' Test sur la cellule visé [D6]
                If (Target.Address = "$D$6") Then
                    ' Formattage de la date choisie
                    LaDate = Format("01-01-" & Target.Value, "DD/MM/YYYY")
                    ' Test sur le date maximun
                    If (LaDate > DateMax) Then
                        MsgBox "Erreur sur la date !!!"
                    Else
                        ' Test sur la date minimum
                        If LaDate < DateMin Then
                            MsgBox "Erreur sur la date !!!"
                        Else
                            ' Si LaDate est dans le range permis
                            Call Module1.MaMacro(Target.Value)
                        End If
                    End If
                End If
            
            End Sub
            '
            


            Cdt

            Info
            0
            1. Bonjour Info,
              CA MARCHE !!! C'est génial
              j'ai choisi de mettre dans la même macro la boite de dialogue et l'extraction du TCD

              ce qui donne
               
              Sub MaMacro(ByVal Annee As String)
               MsgBox ("Vous avez saisi l'excercice " & Annee)
              
               Windows("classeur2.xls").Activate
                  Sheets("TCD").Select
                  ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Exercice"). _
                      CurrentPage = Annee .....
              


              Je te remercie vraiment pour tes explications Info, c'est tellement bien expliqué que je me suis approprié la macro!!.
              J'ai une derniere question : est ce que c'est possible d'introduire une petite limitation : je m'explique : dans mon TCD, pour l'instant, les années vont jusque 2011 mais si je saisi 2020, la macro me remplace une année par l'année 2020 alors que je souhaiterais un message d'erreur.
              Est ce que c'est possible ? (mais c'est déjà génial !)

              Merci encore
              Bonne journée!!
              Soniatouns777
              0
              1. re:

                C'est toujours un plaisirs quand le travail est apprécié.

                Petite remarque :

                Soit prudente lors du déplacement de la macro,
                ce n'est pas la macro avec la signature
                [ Private Sub Worksheet_Change(ByVal Target As Range) ]
                que tu dois déplacer, celle-ci doit demeurer derrière la
                feuille [ Entête ], mais bien la macro qui porte la signature :
                [ Sub MaMacro(ByVal Annee As String) ].

                Les macros "procédures" derrière une feuille sont limités
                quand à leur portée. Et tu pourrais avoir de la difficulté
                à atteindre ton TCD.

                Ça te paraîteras un peu complexe, mais il s'agit de ce que
                j'appelle les "espaces de noms", ce terme est un peu inexacte
                mais il représente bien la signification de la portée des macros
                derrière une feuille.

                Cdt

                Info

                P.S. Désolé de n'avoir puis suivre de plus près ce fil, aujourd'hui
                je suis en vacance, mais tu connais la routine boulot/dodo et
                je n'ai plus 25 ans et j'ai d'autres obligations.
                0
                1. bonsoir Info,
                  merci pour ta réponse, j'ai hate de tester le code au boulot , en tout cas je te remercie pour tes explications LIMPIDES !!Si ça marche, je t'en serais eternellement redevable !!

                  merci encore
                  soniatouns777
                  0
                  1. re :

                    C'est un bon pas de fait, si tu as vu l'affichage de l'année
                    inscrite dans la boite de message, c'est que le programme a atteint
                    la procédure que j'ai écrite :
                    Sub MaMacro(ByVal Annee As String)
                    
                        MsgBox Annee
                    
                    End Sub
                    '
                    


                    Maintenant, si tu souhaite atteindre ton TCD, tu dois déplacer cette procédure dans un module et pour éviter le mélange des
                    "espaces de noms", tu l'appelle en identifiant le module en question:

                    Private Sub Worksheet_Change(ByVal Target As Range)
                    
                        If (Target.Address = "$D$6") Then
                            Call Module1.MaMacro(Target.Value)
                        End If
                    
                    End Sub
                    '
                    


                    La procédure MaMacro deviendra quelque chose comme :

                    Sub MaMacro(ByVal Annee As String)
                    
                        Windows("classeur2.xls").Activate 
                        Sheets("TCD").Select
                        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields  ("Exercice"). _
                            CurrentPage = Annee
                        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Sens"). _
                            CurrentPage = "D"
                        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Section"). _
                            CurrentPage = "F"
                    End Sub
                    '
                    


                    Cdt

                    Info
                    0
                    1. Merci pour ton aide !!! :
                      en mettant ton code ,j'ai une boite de dislogue qui s'affiche avec l'année,
                      maintenant je souhaiterais faire le lien entre la valeur qui figure sur la boite de dialogue et ma macro où je souhaiterais
                      que le champs exercice prenne la valeur que j'ai saisi (et non pas 2010)
                      Windows("classeur2.xls").Activate 
                      Sheets("TCD").Select
                          ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Exercice"). _
                              CurrentPage = "2010"
                          ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Sens"). _
                              CurrentPage = "D"
                          ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Section"). _
                              CurrentPage = "F"
                      0
                      1. bonjour,
                        merci de me reponse,
                        je suis desolé pour mon incohérence : il s'agit de la saisie d'une valeur dans la cellule D6 dans l'onglet entete, la valeur que je saisirait , par exemple 2010, forcerait dans l'onglet "TCD" à selectionner cette même valeur dans la cellule B1

                        j'ai fait une macro par enregistrement que selectionne toujours les mêmes champs, seulement pour le champ ou figure l'année, je souhaite avoir la main et choisir l'année
                        ton code doit il s'inscrire dans un module?
                        comment faire le lien entre ta macro et la mienne?
                        désolé par avance pour mes questions qui doivent te sembler bêtes
                        (Rq :fichier joint)
                        http://www.cijoint.fr/cjlink.php?file=cj201102/cijjZzyTfK.xls
                        0
                        1. Bonjour,

                          Je cite :
                          [ Je souhaiterais saisir l'année sur une cellule excel, par exemple 2011, et qu'a partir de ma saisie dans la cellule « A1 » par exemple ... ]

                          Cellule A1 sur quel Feuille ? Dans le TCD ?

                          En attendant, placer ce code derrière la feuille Entête:

                          Private Sub Worksheet_Change(ByVal Target As Range)
                          
                              If (Target.Address = "$D$6") Then
                                  Call MaMacro(Target.Value)
                              End If
                          
                          End Sub
                          '
                          
                          Sub MaMacro(ByVal Annee As String)
                          
                              MsgBox Annee
                          
                          End Sub
                          '
                          


                          Cdt

                          Info
                          0
                          1. pour ceux qui veulent bien m'aider , ci joint lon fichier
                            http://www.cijoint.fr/cjlink.php?file=cj201102/cijjZzyTfK.xls
                            0
                            1. Je n'ai pas compris,
                              j'ai mis comme code :
                              Sub TCD_investissement()
                              '
                              
                                  Windows("suivi budget version 1.2.xls").Activate
                                  ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Exercice"). _
                                      CurrentPage = "2010"
                                  ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Section"). _
                                      CurrentPage = "I"
                                  ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Sens"). _
                                      CurrentPage = "D"
                                  Range("B7:B17").Select
                                  Selection.Copy
                                  Windows("tableaux de bord - objectif-1.2.xls").Activate
                                  Sheets("Tableau_Investissement").Select
                                  Range("C5").Select
                                  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                      :=False, Transpose:=False
                              End Sub
                              Private Sub Worksheet_Change(ByVal Target As Range)
                              
                                  If (Target.Address = "$E$5") Then
                                      Call Execute_Commande(Target.Value)
                                  End If
                                   
                              End Sub
                              '
                              
                              Function Execute_Commande(ByVal Valeur As Variant)
                              
                                  MsgBox Valeur
                                   
                              End Function
                              0
                              1. Bonjour,

                                À placer derrière la feuille concernée :

                                Option Explicit 
                                
                                Private Sub Worksheet_Change(ByVal Target As Range) 
                                
                                    If (Target.Address = "$A$1") Then 
                                        Call Execute_Commande(Target.Value) 
                                    End If 
                                     
                                End Sub 
                                ' 
                                
                                Function Execute_Commande(ByVal Valeur As Variant) 
                                
                                    MsgBox Valeur 
                                     
                                End Function 
                                ' 
                                


                                Cdt

                                Info
                                0