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. 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
    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. pour ceux qui veulent bien m'aider , ci joint lon fichier
        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. 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. 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. 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. 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 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. 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:

                        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. 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 :

                            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 !!
                              tu as parfaitement répondu à mon besoin
                              Bonne continuation
                              Soniatouns777
                              0
                              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