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 :

Sélection d'items dans TCD


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut Sélection d'items dans TCD
    Bonjour,

    Le code suivant me permet d'ouvrir un UserForm qui me permet de sélectionner :
    - le nom d'un salarié,
    - une date de début
    - une date de fin

    La code modifie un TCD qui affiche les données sélectionnées dans le UserForm.

    Tout fonctionne bien sauf que la première date de mes données n'est jamais sélectionnée.
    Exemple : si je veux afficher les saisies journalières pour la période du 12/02/2015 au 15/02/2015 de ma table de données, je code me sélectionne du 12/02/2015 au 15/02/2015. Il exclue Systématiquement la première date.

    Avez-vous une piste de travail à me donner?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sheets("Graphique Salarié").Select
    ActiveWorkbook.RefreshAll
     
    'ActiveSheet.PivotTables("Tableau croisé dynamique3").ManualUpdate = True
    'ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date").ShowAllItems = True
     
    DD = Format(Me.DTPicker1, "dd/mm/yyyy")
    DF = Format(Me.DTPicker2, "dd/mm/yyyy")
     
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date"). _
            ClearAllFilters
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date"). _
            ShowAllItems = False
     
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date"). _
            CurrentPage = "(All)"
     
        With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date")
            ActiveSheet.PivotTables("Tableau croisé dynamique3").NullString = "(Blank)"
            ActiveSheet.PivotTables("Tableau croisé dynamique3").DisplayNullString = False
     
            For Each Pi In .PivotItems
                Pi.Name = Pi.SourceNameStandard
                MsgBox Pi.Name
                If Format(Pi.Name, "dd/mm/yyyy") >= DD And Format(Pi.Name, "dd/mm/yyyy") <= DF Then .PivotItems(Pi.Name).Visible = True Else .PivotItems(Pi.Name).Visible = False
            Next Pi
     
        End With
     
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Salarié"). _
            CurrentPage = nomsal
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Tâches").ClearAllFilters
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Tâches").PivotFilters.Add Type:=xlCaptionDoesNotEqual, Value1:="(vide)"
    ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotCache.Refresh
     
    Range("C10").Activate
     
    MenuGraphique.Hide
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Pourquoi utiliser des chaînes de caractères pour les dates ?
    La comparaison des chaînes de caractères (< >) ne se fait probablement pas comme tu le souhaites.
    Essaie en utilisant des variables Date pour voir si ça fait une différence.
    MPi²

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Heu, je crois ne pas bien comprendre comment faire pour tester. Tu peux m'aider un peux plus clairement ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Tu mets ceci
    DD = Format(Me.DTPicker1, "dd/mm/yyyy")
    Donc, DD est une String avec des guillemets autour

    Si tu déclares tes variables en Date il n'y aura pas ces guillemets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim DD as Date
    DD = Me.DTPicker1.Value
    Il y a une différence entre 21/02/2015 et "21/02/2015"

    Si tu écris des valeurs au format texte dans une colonne de 1 à 10, le tri te retournera ceci
    1
    10
    2
    3
    4
    5
    6
    7
    8
    9

    10 est alors plus petit que 2...
    MPi²

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Ok je comprend mieux. Mais, j'ai essayé comme tu as dis et cela fait exactement la même chose. Toujours pas possible de sélectionner la première date...
    Un truc de fou !

    J'ai aussi une erreur qui s'affiche quand je sélectionne une date qui n'est pas dans ma table de données.
    Erreur d'exécution 1004 : Impossible de définir la propriété Visible de la classe PivoItem
    L'erreur se produit lors de l'exécution de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Pi.Name >= DD And Pi.Name <= DF Then .PivotItems(Pi.Name).Visible = True Else .PivotItems(Pi.Name).Visible = False

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    C'est possible que ce soit parce qu'il n'y a aucune valeur du filtre sélectionnée.
    Les filtres d'un TCD doivent contenir au moins une valeur sélectionnée sans quoi... erreur...
    MPi²

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Oui c'est exact mais cela n'explique pas pourquoi lorsque j'ai dans mes sources données les date 1-fev, 2-fev, 3-fev, 4-fev et que je veux afficher dans le TCD les dates du 1-fev au 3 fev, il me sélectionne 2-fev et 3-fev. Il ne sélectionne pas le 1-fev !

    Pourquoi c'est la première date qu'il y a dans le filtre qu'il ne veut pas afficher ? Y aurait-il un pb d'indexage ?

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Essaie ton CommandButton3 comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Private Sub CommandButton3_Click()
        Dim datetest As Double, Datedeb As Date, Datefin As Date
        Dim nomsal As String
     
        nomsal = CombSalarié.Text
     
        Sheets("Graphique Salarié").Select
        ActiveWorkbook.RefreshAll
     
     
        ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Tâches").ClearAllFilters
        ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Tâches").PivotFilters.Add Type:=xlCaptionDoesNotEqual, Value1:="(vide)"
        ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Salarié").CurrentPage = nomsal
     
        Datedeb = Me.DTPicker1.Value
        Datefin = Me.DTPicker2.Value
     
        ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date"). _
            ClearAllFilters
     
        ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date"). _
            CurrentPage = "(All)"
     
        With ActiveSheet.PivotTables("Tableau croisé dynamique3").PivotFields("Date")
     
            For i = 1 To .PivotItems.Count
                .PivotItems(i).Visible = True
            Next
     
            For i = 1 To .PivotItems.Count
                If IsDate(.PivotItems(i).Value) Then
                    datetest = CDate(.PivotItems(i).Value)
                    If datetest < Datedeb Or datetest > Datefin Then .PivotItems(i).Visible = False
                End If
            Next
        End With
     
        Application.ScreenUpdating = True
     
        MenuGraphique.Hide
     
    End Sub
    MPi²

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    j'ai suivi tes recommandations mais le problème reste intact.

    J'ai lu que le problème que je rencontre provient du format de la date. Pour le TCD, il faut être en format US pour que le trie se passe correctement. J'ai pu remarquer que mes dates changent de format au cours du code et que, je présume, c'est l'origine de mon problème.
    Je cherche comment forcer le format US...

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    J'ai fait le test ici avec le fichier que tu as mis dans l'autre conversation et ça fonctionne.
    Si je change la période, ça me retourne toutes les dates de cette période et pas d'autres.
    Et j'utilise un format date aaaa-mm-jj (Québec)
    Quand je passe le code en pas à pas, les "valeurs" de date sont transférées au format américan mm-jj-aaaa et ça passe bien puisqu'une date demeure une date pour VBA.

    Si tu vois des erreurs pour une personne en particulier et/ou une période, donne-la-moi que je vérifie.
    Par contre, si tu as plus de données dans ton fichier, vérifie que toutes les dates soient bien des dates et non du texte...
    MPi²

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    J'ai une erreur sur la date du 12/02/2015. si ma plage est DD = 12/02/2015 et DF = 13/02/2015, il me sélectionne que le 13-02-2015

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    J'avais oublié le fait que certaines dates sont vides, alors modifie cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            For i = 1 To .PivotItems.Count
                If IsDate(.PivotItems(i).Value) Then
                    datetest = CDate(.PivotItems(i).Value)
                    If datetest < Datedeb Or datetest > Datefin Then .PivotItems(i).Visible = False
                Else
                    .PivotItems(i).Visible = False   'Ajouté pour enlever les vides
                End If
            Next
    Qu'est-ce que tu as comme erreur ? seulement non cochée ?
    J'ai fait le test avec Dominique et les dates du 12 (DD) et du 13 (DF) sont bien cochées...
    MPi²

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Idem. Lorsque je sélectionne DD = 12/02/2015 et DF=13/02/2015, je n'ai que le 13/02/2015 de sélectionné.

    Lorsque je sélectionne DD et DF = 12/02/2015, alors j'ai une erreur à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .PivotItems(i).Visible = False   'Ajouté pour enlever les vides
    Lorsque je sélectionne DD et DF = 13/02/2015, alors le code me donne le bon résultat.
    J'ai vérifié le type de date sur les dates 12/02/2015 de mes données et je n'ai pas remarqué de pb.

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Plutôt bizarre cette histoire
    MPi²

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If Format(Pi.Name, "dd/mm/yyyy") >= DD And Format(Pi.Name, "dd/mm/yyyy") <= DF T
    format converti une date en string tu fais donc un comparaison alphabétique! "01/12/2026" est pus petit que "31/01/1905"!!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Format(Pi.Name, "yyyy-mm-dd") >= format(DD,"yyyy-mm-dd") And Format(Pi.Name, "yyyy-mm-dd") <= format(DF,"yyyy-mm-dd") Then

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Oui, j'étais parti sur cette voie sans comprendre vraiment ce que je faisait. Je pensais qu'il s'agissait de changer le type de format de la date.

    J'ai suivi les conseils de parmi mais je bloque toujours sur la date du 12/02/2015.

    Si j'ai bien compris, tu me préconise donc de tout convertir en string et de faire les comparatif ensuite ?

  17. #17
    Invité
    Invité(e)
    Par défaut
    je te suggère de comparer ce qui est comparable.
    soit de date soit de string du dans un format "yyyy-mm-dd" "1905-12-31" et plus petit que "2026-12-01" alors que "31/01/1905" est plus grand alphabétiquement que "01/12/2026"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Format
    If Format(Pi.Name, "yyyy-mm-dd") >=Format( DD, "yyyy-mm-dd") And Format(Pi.Name, "dd/mm/yyyy") <=Format( DF , "yyyy-mm-dd")
    'ou Date
     
    If cdate(Pi.Name)>= cdate(DD) And cdate(Pi.Name) <= cdate(DF )
    'ou Long
     
    If cnlg(Pi.Name)>= cnlg(DD) And cnlg(Pi.Name) <= cnlg(DF )

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    Je suis reparti pas à pas et j'ai noté les choses suivantes :

    DD = 10/02/2015
    DF = 12/02/2015

    pi.name = 02/10/2015
    CDate (pi.name)=02/10/2015
    CDate (DD) = 10/02/2015
    CDate (DF) = 12/02/2015

    Mon problème de comparaison vient du fait que les format de dates entre l'item et DD ou DF ne sont pas dans le même mode. Il faudrait que je puisse transformer pi.name en 10/02/2015.

    Es-tu OK avec moi ?

  19. #19
    Invité
    Invité(e)
    Par défaut
    c'est pour cela que je t'ais proposé de les passer au format international!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Format(Pi.Name, "yyyy-mm-dd") >=Format( DD, "yyyy-mm-dd") And Format(Pi.Name, , "yyyy-mm-dd") <=Format( DF , "yyyy-mm-dd")
    et en panachant avec la solution de parmi qq chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If IsDate(.PivotItems(i).Value) Then
        Format(Pi.Name, "yyyy-mm-dd") >=Format( DD, "yyyy-mm-dd") And Format(Pi.Name, , "yyyy-mm-dd") <=Format( DF , "yyyy-mm-dd")

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Amateur de programmation
    Inscrit en
    Février 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Amateur de programmation

    Informations forums :
    Inscription : Février 2015
    Messages : 21
    Points : 6
    Points
    6
    Par défaut
    en mettant ta ligne, j'obtient :

    Format(Pi.Name, "yyyy-mm-dd") = 2015-10-02
    Format( DD, "yyyy-mm-dd") = 2015-02-10
    Format( DF , "yyyy-mm-dd") = 2015-02-11

    On rencontre par la suite une erreur (d'exécution '13' - incompatibilité de type) juste après avoir effectuer la comparaison.

    je ne comprends pas pourquoi il ne veut pas mettre pi.name en 2015-02-10 !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Sélection d'items dans QGraphicsScene
    Par chrtophe dans le forum Débuter
    Réponses: 4
    Dernier message: 11/09/2013, 20h58
  2. Réponses: 6
    Dernier message: 26/08/2009, 13h14
  3. Sélection d'un Item dans un ComboBox
    Par stephane.julien dans le forum C#
    Réponses: 5
    Dernier message: 25/10/2007, 15h33
  4. Problème de sélection d'un item dans une CListCtrl
    Par PetitPapaNoël dans le forum MFC
    Réponses: 9
    Dernier message: 01/08/2007, 15h51
  5. sélection d'un item dans syslistview32
    Par devmat dans le forum MFC
    Réponses: 2
    Dernier message: 06/10/2005, 15h19

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