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 :

Macro écrire date dans cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Macro écrire date dans cellule
    Bonjour,

    J'ai un tableau croisé dynamique issu d'une requête vers une source de données externe, j'aimerais récupérer la date de dernière actualisation de cette requête dans une cellule.

    A l'aide de cette doc : https://docs.microsoft.com/fr-fr/off...le.refreshdate j'ai créé cette Sub dans la feuille ou se situe le TCD :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub RecupDateActua(ByVal Target As PivotTable)
     
        Set pvtTable = Worksheets("Données Brutes").PivotTable("Rondes__2")
        dateString = Format(pvtTable.RefreshDate, "Long Date")
        Range("M1") = dateString
     
    End Sub


    Il ne se passe pourtant rien alors que la date devrait se copier dans la cellule M1 de cette même feuille, alors ma question est que manque-t-il à mon code ? Que dois-je corriger ?

    Merci pour votre aide.

  2. #2
    Membre éclairé
    Bonjour Js,
    dans votre procédure, ce n'est plus la peine de nommer votre tableau puisque vous passez le nom en paramètre :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub RecupDateActua(ByVal Target As PivotTable)
        Set pvtTable = Target
        dateString = Format(pvtTable.RefreshDate, "Long Date")
        Range("M1") = dateString
    End Sub
     
    Public Sub test()
        Call RecupDateActua(ActiveSheet.PivotTables("Rondes__2"))
    End Sub


    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  3. #3
    Rédacteur

    Bonjour Filippo,
    Vous avez entièrement raison mais il n'y a pas d'avantage besoin de cette instruction Set pvtTable = Target


    En revanche, soit il y a lieu de modifier pvtTable.RefreshDate par Target.RefreshDate soit modifier le nom de l'argument par PvtTable ce qui me semble plus approprié
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  4. #4
    Membre éclairé
    Bonjour Philippe,
    vous avez raison,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub RecupDateActua(ByVal Target As PivotTable)
        dateString = Format(Target.RefreshDate, "Long Date")
        Range("M1") = dateString
    End Sub
     
    Public Sub test()
        Call RecupDateActua(ActiveSheet.PivotTables("Rondes__2"))
    End Sub



    Fonctionne aussi bien.

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  5. #5
    Membre du Club
    Salut Filippo,

    Merci pour ta réponse,

    J'ai copié ton code dans ma feuille, j'exécute la Sub "test" et ça me renvoie ce message d'erreur :



    J'ai entouré la feuille où j'ai copié le code, peut être que c'est lié à ça.

    Le truc c'est quand je met ce code dans un module on me renvoie aussi une erreur :



    Qu'est ce qu'il me manque pour que ça marche ?

  6. #6
    Membre éclairé
    C'est parce que tu lances la procédure d'une autre feuille.
    Quand tu fais ActiveSheet, vb cherche le tableau dynamique dans cette feuille. S'il n'y est pas, ça coince.

    Si tu veux pouvoir lancer la procédure d'une autre feuille il faut lui indiquer que tu veux la lancer sur un tableau dynamique de cette feuille, par exemple :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub test2()
        Call RecupDateActua(Sheets("Données Brutes").PivotTables("Rondes__2"))
    End Sub


    Indique que tu veux lancer la procédure RecupDateActua sur le tableau dynamique "Rondes__2" qui est situé dans l'onglet "Données Brutes".

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  7. #7
    Membre du Club
    J'ai corrigé et ça me met toujours la même erreur... c'est incompréhensible,

    On est d'accord je dois bien mettre ces procédures dans la feuille "Données Brutes" et pour que la date se copie je dois bien lancer la sub test ?

    est-ce que tu as pu tenter de ton côté sur une source de données quelconque ? Histoire de voir si ce code marche bien chez quelqu'un...

  8. #8
    Membre éclairé
    Tu peux mettre le code où tu veux (feuille, classeur, module).
    Mais il faut bien indiquer le cas échéant où trouver le tableau.

    J'ai fait un petit exemple fictif qui marche.
    J'ai mis le code dans "Données Brutes" (Feuil2).

    Si le focus est dans Données Brutes" (Feuil2), alors dans le vb on peut lancer test qui utilise ActiveSheet.
    Sinon dans vb il faut utiliser test2 qui utilise Sheets("Données Brutes").

    Dans mon exemple, ça recopie bien "mercredi 16 septembre 2020" en M1.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  9. #9
    Membre du Club
    ça marche très bien sur ton fichier, j'avais fait une petite erreur de frappe que j'ai corrigé, j'ai lancé la sub ça a marché sauf que...

    après ça j'ai relancé la sub et toujours la même erreur à la con :



    ça va maintenant faire 2 jours que je suis sur ce putain de problème.

  10. #10
    Membre éclairé
    Tu veux mettre ton fichier (ou un extrait) en pièce-jointe ?
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  11. #11
    Membre du Club
    Voici mon fichier :

  12. #12
    Membre éclairé
    Je ne peux pas voir le code, il est protégé par mot de passe.
    Mais le tableau dans l'onglet "Données Brutes" ne me semble pas être un tableau croisé dynamique.

    Quand je clique sur celui de mon exemple ça fait apparaitre un encart à droite de l'écran avec "Liste des champs de tableau croisé dynamique", ça n'apparait pas sur le tien.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  13. #13
    Membre du Club
    Ah oui désolé j'ai oublié d'enlever le MDP,

    Si le tableau n'est pas un croisé dynamique c'est qu'il est simple ? Comment adapter le code pour un tableau simple ?

  14. #14
    Membre du Club
    Citation Envoyé par js777 Voir le message
    Ah oui désolé j'ai oublié d'enlever le MDP,

    Si le tableau n'est pas un croisé dynamique c'est qu'il est simple ? Comment adapter le code pour un tableau simple ?
    Après ça avec quand même marché la première fois que j'ai lancé la sub comme tu as pu le voir la cellule M1 contenait une date.

  15. #15
    Membre éclairé
    Ta zone "Rondes__2" devait être un TCD la première fois que tu as utilisé la procédure.
    Je ne sais pas ce que tu as fait mais maintenant c'est juste un range (une collection de cellules). On ne peut donc plus appliquer dessus les fonctions de TCD comme RefreshDate.

    Je ne sais pas comment modifier le code, je ne sais pas ce que fait exactement la fonction RefreshDate.

    Le plus simple serait que tu refasses ton TCD comme la 1ère fois pour pouvoir appliquer RefreshDate dessus.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  16. #16
    Membre du Club
    Salut Filippo,

    Je viens de généré un TCD sur une autre feuille en utilisant la même requête, par contre je n'arrive pas à reproduire la même disposition que sur l'ancien tableau, avec des colonnes côte à côte,

    Voilà ce qu'il me donne comme affichage quand je met tous les champs dans lignes :



    Pourrais-tu m'éclairer sur la manière dont je pourrais réaliser cela ?

    Merci à toi.

  17. #17
    Membre éclairé
    Comme tu l'as fait la première fois, je pense qu'il faut mettre les champs en colonne et pas en ligne.
    Je te conseille la lecture de cet article sur les tableaux croisés dynamiques : https://silkyroad.developpez.com/excel/tcd/

    Bonne fin de journée.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  18. #18
    Membre du Club
    J'ai le même probleme en colonne ça me donné quelque chose comme ça :



    Voici mon fichier si tu veux jeter un coup d'oeil



    Merci pour la doc je vais regarder ça attentivement

  19. #19
    Membre éclairé
    J'ai l'impression que tu essaies de repartir de "Données brutes" pour refaire un TCD.
    L'onglet "Données brutes" présente visiblement des données déjà agrégées. Le principe du TCD est de lire des données non agrégées pour les présenter de façon synthétique.
    Il faut que tu repartes des données sources (je ne sais pas où elles se trouvent).
    Ensuite tu mets les entêtes des colonnes qui t'intéressent dans la zone colonnes du TCD.
    Je suis désolé mais je ne peux pas le faire à ta place, documente-toi sur le TCD et repars des données sources.

    Bon courage.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  20. #20
    Membre du Club
    J'ai pu lire la doc sur le TCD, c'est pas du tout ce que je recherche le TCD permet d’effectuer des calculs mathématiques (somme, nombre, moyenne, maximum, minimum, produit, écart-type…) en regroupant des données en fonction de catégories.

    Moi je veux juste afficher les données de chaque colonne comme je le fais déjà avec Power Query, j'ai pas besoin d'utiliser un TCD, c'est pas approprié à mon besoin.

    Je veux juste pouvoir récupérer la date d'actualisation des données externes de la requête, rien de plus.

###raw>template_hook.ano_emploi###