Macro variable selon saisi cellule

Résolu
soniatouns777 -  
 Info -
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. Info
     
    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
  2. soniatouns777
     
    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
  3. soniatouns777
     
    pour ceux qui veulent bien m'aider , ci joint lon fichier
    http://www.cijoint.fr/cjlink.php?file=cj201102/cijjZzyTfK.xls
    0
  4. Info
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. soniatouns777 Messages postés 18 Statut Membre 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
  7. soniatouns777
     
    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
  8. soniatouns777 Messages postés 18 Statut Membre 1
     
    ohé y a quelqu'un?
    0
  9. Info
     
    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
  10. soniatouns777
     
    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
  11. Info
     
    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
  12. soniatouns777
     
    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
  13. Info
     
    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
  14. soniatouns777
     
    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
  15. Info
     
    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
  16. soniatouns777
     
    Merci encore Info !!
    tu as parfaitement répondu à mon besoin
    Bonne continuation
    Soniatouns777
    0
  17. Info
     
    :-)

    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