IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Retour impossible dans Excel [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut Retour impossible dans Excel
    Bonjour,
    J'ai créer un code dans l'événement selection change.
    Ce code fonctionne très bien par contre je n'ai plus la possibilité de revenir en arrière avec la flèche. Celle-ci reste grisonné.
    Je me suis renseigné sur ce forum mais je trouve pas la solution .
    A vrai dire , je ne sais pas m'y prendre pour modifier mon code et ainsi pouvoir de nouveau revenir en arrière avec la flèche.
    Vous trouverez ci dessous mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Worksheets("semaine").Range("A2:AE66")) Is Nothing Then
    Worksheets("TMJ").PivotTables("TCD_Nbr_PPDC").PivotCache.Refresh
    End If
    End Sub

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    A ma connaissance (ce n'est pas une certitude mais une constatation), on ne peut pas annuler par commande le résultat d'une macro.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je confirme l'impression de Menhir. Excel ne mémorise que ce qui est réalisé dans Excel, et il est logique que la liste des actions à annuler soit remise à zéro lors de l'exécution d'une macro puisque l'environnement d'Excel peut avoir été modifié par la macro. Excel ne pourra donc pas annuler les effets de la macro mais ne pourra plus non plus annuler ce qui avait été fait avant la macro.

    Cette mise en grisé des actions à annuler est donc tout à fait logique lors de l'exécution d'une macro, et il est important de bien préciser cela aux utilisateurs de tes macros.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    zut ..
    Donc si je comprend bien, pour retrouver la flèche "retour en arrière", il faut que je modifie une cellule qui ne se trouve pas dans la plage comprise dans le target ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Bien qu'il soit impossible de revenir en arrière, tu peux toujours garder en mémoire la valeur précédente (ici j'utilise une autre feuille que je nomme retour) et y revenir par macro si besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Worksheets("semaine").Range("A2:AE66")) Is Nothing Then
    Worksheets("semaine").Range("A2:AE66").copy Worksheets("retour").Range("A2:AE66")
    Worksheets("TMJ").PivotTables("TCD_Nbr_PPDC").PivotCache.Refresh
    End If
    End Sub
     
    sub retour
    Worksheets("retour").Range("A2:AE66").copy Worksheets("semaine").Range("A2:AE66")
    end sub

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    D'une façon générale, l'altération de la structure du classeur remet la liste des annulations possibles à zéro.

    Pour ce qui est des modifications de valeurs, c'est un peu plus complexe et cela dépend de ce qu'il y a dans la pile des annulations. Par précaution, il me semble judicieux de considérer que l'exécution d'une macro videra la pile et, de toutes façons, Excel ne pourra pas détricoter les effets de ta macro.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    halaster08, Il est vrai que cela peut etre une solution mais pour ma part, elle ne me convient pas..
    Ce n'est pas grave, je ferais avec .
    Merci de m'avoir éclairer ..

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    encore une question,
    Si je voulais contourner le problème .
    Je m'explique, y a t il un autre moyen pour que mon tableau croisé dynamique Worksheets("TMJ").PivotTables("TCD_Nbr_PPDC") se réactualise dés que je change une cellule de la plage Worksheets("semaine").Range("A2:AE66").

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Dans le module de la feuille "semaine", tu mets le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Intersect(Target, Range("a2:ae66")) Is Nothing Then _
        Worksheets("TMJ").PivotTables("TCD_Nbr_PPDC").RefreshTable
    End Sub
    Si ton tcd n'est pas utilisé par des fonctions, tu gagnerais à ne l'actualiser que lorsque tu actives sa feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Activate()
      ActiveSheet.PivotTables(1).RefreshTable
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Pierre,
    je me suis mal exprimé et en plus je me rend que je me complique la tache.
    Voilà ce que j'essaie de faire.

    J'ai un grand tableau que l'on nommera A qui va de la cellule A2:AE66 . ce tableau A se trouve dans la feuille " semaine".
    Sur une autre feuille ("TMJ"), j'ai un deuxième tableau que l'on nommera B qui récupère les données du tableau A.
    Et c'est à partir de ce tableau B que j'ai fais mon TCD ("TCD_Nbr_PPDC").

    La grande question est comment réactualiser mon tableau TCD lorsque les données du tableau B change en fonction du changnement des données du tableau A

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Sans usine à gaz instable et pénalisante en termes de performances, il n'est pas possible de connaître les dépendants lointains d'une cellule (ceux qui se trouvent sur une autre feuille que la cellule concernée). Une solution un peu barbare serait de déterminer quelle plage de Semaine est susceptible de mofidier une cellule de TMJ et d'appliquer mon premier code sur cette plage de Semaine.

    Je t'ai donné un second code qui actualise le tcd à l'activation de la feuille qui le contient. Si le TCD n'est pas utilisé par des formules, cette solution est tout à fait satisfaisante.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Pierre, le soucis de ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Activate()
      ActiveSheet.PivotTables(1).RefreshTable
    End Sub
    c'est que le tableau où est issu le TCD est un tableau en perpétuel changement.
    Au cours d'une journée, le tableau peut être modifiè x fois.
    S'il n y pas de solution , je vais avertir mes collègues comme quoi il y n ' aura pas de retour en arrière possible.

    Au fait, j'ai remarque que cette impossiblite de retour en arrière reste valable mais pour les autres fichiers Excel.
    Il N 'a pas de moyen pour remettre la flèche de retour en arrière pour mes autres fichiers Excel

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Sauf sur un classeur partagé, je ne vois pas soucis avec mon code, pour autant, je le rappelle, que ton tcd n'alimente pas des formules. Est-ce le cas? Si ce n'est pas le cas et que ton classeur n'est pas partagé, le tcd sera mis à jour chaque fois qu'on sélectionnera la feuille qui le contient.

    Sinon, tu utilises le premier code que je t'ai donné sur l'évènement Change, que tu places sur ta feuille semaine et le tour est joué. Je ne vois vraiment pas où est le problème, en fait.

    Pour le reste, la liste des actions à annuler est commune aux classeurs ouverts dans l'instance d'Excel.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Pierre, je suis un peu perdu
    je viens de faire un test
    j'ai inséré dans la feuille "semaine" , le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Activate()
    Worksheets("TMJ").PivotTables("TCD_Nbr_PPDC").PivotCache.Refresh
    End Sub
    mon TCD ne se réactualise pas ...est ce normale en sachant que le tableau ou est issu ce tcd lui est réactualisé .

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    C'est worksheet_activate et pas workbook_activate

    Ce code doit être mis dans le module de la feuille qui contient le TCD.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Ok pierre , je commence à comprendre.
    Effectivement cela fonctionne .
    Mais si je voudrais que que mon TCD se réactualise sans que je change de feuille.
    Je m'explique , je reste sur la feuille "semaine" et mon TCD qui se trouve dans la feuille ("TMJ") se réactualise.
    Est ce faisable ?

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Alors, tu dois soit définir la plage de Semaine qui influence le TCD par ricochet, soit décider que toute cellule modifiée de Semaine modifie potentiellement le TCD (mais ce choix n'est pas "économique").

    Dans le premier cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    worksheet_change(Target as range)
      if not intersect(target, range("...")) is nothing then worksheets("TMJ").pivottables("...").pivotcache.refresh
    end sub
    Dans le second, tu laisses tomber le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    worksheet_change(Target as range)
      worksheets("TMJ").pivottables("...").pivotcache.refresh
    end sub
    Ce code est cette fois à placer dans le module de la feuille Semaine

    Ce que je ne comprends pas, c'est pourquoi ce n'est pas suffisant que ce soit à l'activation de TMJ
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Pierre
    ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    worksheet_change(Target as range)
      worksheets("TMJ").pivottables("...").pivotcache.refresh
    end sub
    est le même que le mien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Worksheets("semaine").Range("A2:AE66")) Is Nothing Then
    Worksheets("TMJ").PivotTables("TCD_Nbr_PPDC").PivotCache.Refresh
    End If
    End Sub

    et on retombe dans la problématique de l'absence de retour en arrière qui était ma question ...
    En résumé, aprés avoir lancé la macro, quel action dois je faire pour mettre la flèche de retour en arrière

    Pierre .
    Sur cette absence de retour en arrière, tu as ecrit
    Pour le reste, la liste des actions à annuler est commune aux classeurs ouverts dans l'instance d'Excel.
    qu'est ce que je dois comprendre ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 21
    Dernier message: 16/09/2013, 22h00
  2. Code 'retour chariot' pour mettre dans excel
    Par cec38ch dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/07/2012, 11h29
  3. Réponses: 1
    Dernier message: 19/11/2008, 18h22
  4. [CSV] Retour à la ligne dans Excel en PHP
    Par zulot dans le forum Langage
    Réponses: 3
    Dernier message: 19/02/2007, 17h43
  5. [VBS] - Importer un retour chariot dans Excel
    Par RegiO dans le forum VBScript
    Réponses: 5
    Dernier message: 18/09/2006, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo