Macro variable selon saisi cellule

Résolu/Fermé
soniatouns777 - 25 févr. 2011 à 09:36
 Info - 4 mars 2011 à 00:49
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


A voir également:

16 réponses

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
soniatouns777
25 févr. 2011 à 15:20
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
soniatouns777
25 févr. 2011 à 21:12
pour ceux qui veulent bien m'aider , ci joint lon fichier
http://www.cijoint.fr/cjlink.php?file=cj201102/cijjZzyTfK.xls
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
soniatouns777 Messages postés 16 Date d'inscription mercredi 26 janvier 2011 Statut Membre Dernière intervention 26 février 2011 1
25 févr. 2011 à 21:56
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
soniatouns777
26 févr. 2011 à 09:17
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
soniatouns777 Messages postés 16 Date d'inscription mercredi 26 janvier 2011 Statut Membre Dernière intervention 26 février 2011 1
26 févr. 2011 à 21:08
ohé y a quelqu'un?
0
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
soniatouns777
27 févr. 2011 à 21:18
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
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
soniatouns777
1 mars 2011 à 09:31
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
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
soniatouns777
2 mars 2011 à 13:33
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
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
soniatouns777
3 mars 2011 à 22:33
Merci encore Info !!
tu as parfaitement répondu à mon besoin
Bonne continuation
Soniatouns777
0
:-)


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