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 :

Filtre via macro sur un TCD


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Filtre via macro sur un TCD
    Bonjour,

    Je viens chercher de l'aide car j'ai un petit souci avec une macro sur un TCD.

    Je cherche via une macro à créer automatiquement un TCD dont un filtre doit se faire uniquement sur les dates concernant l'année 2015. Je n'arrive pas à faire cela ..

    Voici mon code :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Sub TCD_CPT_GPI()
    '
    '   Macro "CD_CPT_GPI" qui permet de créer le TCD au niveau de la compta et du GPI :
    '
    '-----------------------------------------------------------------------------------
        '
        Sheets("OS11").Select
        Range("A1").Select
        Range(Selection, Selection.End(xlToRight)).Select
        Range(Selection, Selection.End(xlDown)).Select
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(3).Name = "TCD1"
        '
        '   Etiquettes de lignes
        '
        Dim DerniereLigne As Long
        Dim DerniereColonne As Long
        DerniereLigne = 14
        DerniereColonne = 7
        '
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
            "OS11!R1C1:R" & DerniereLigne & "C" & DerniereColonne & "", Version:=xlPivotTableVersion14).CreatePivotTable _
            TableDestination:="TCD1!R3C1", TableName:="Tableau croisé dynamique1", _
            DefaultVersion:=xlPivotTableVersion14
        Sheets("TCD1").Select
        '
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Code de l'opération")
            .Orientation = xlRowField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Libellé de l'opération")
            .Orientation = xlRowField
            .Position = 2
        End With
        '
        '   Filtre du rapport
        '
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Immo")
            .Orientation = xlPageField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Immo")
            .PivotItems("NI").Visible = False
        End With
        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Immo").EnableMultiplePageItems = True
        '
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Date transaction")
            .Orientation = xlPageField
            .Position = 1
            '
            '   Ne fonctionne pas
            '
            For i = 1 To .PivotItems.Count
                If .PivotItems(i) = "2015" Then
                    .PivotItems(i).Visible = True
                    Else
                    .PivotItems(i).Visible = False
                End If
            Next i
            '
        End With
        '
        '   Etiquettes de colonnes
        '
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Type indicateur")
            .Orientation = xlColumnField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Type indicateur")
            '.PivotItems("BDT").Visible = False
            '.PivotItems("ENG").Visible = False
            '.PivotItems("MDP").Visible = False
        End With
        '
        '   Valeurs
        '
        ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
            PivotTables("Tableau croisé dynamique1").PivotFields("Montant"), "Somme de Montant", xlSum
        ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Immo").CurrentPage = "(All)"
        '
        '   Permet de ne pas afficher les sous-totaux
        '
        Range("A2").Select
        ssTotaux.SuppressionSousTotauxTCD
        '
        '   Permet d'afficher le TCD sous forme tabulaire
        '
        ActiveSheet.PivotTables("Tableau croisé dynamique1").RowAxisLayout xlTabularRow
        '
        '   Permet de redimensionner la largeur des colonnes
        '
        Columns("A:E").EntireColumn.AutoFit
        Range("A1").Select
    End Sub
    Je vous joint un fichier Test, je n'ai pu y intégrer le code (impossible de télécharger le fichier "xlsm" ...).

    Si jamais quelqu'un avait la solution, ça me serait très utile.

    Merci d'avance !!
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Dernière modification par Invité ; 27/08/2015 à 01h03.

  3. #3
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 405
    Points : 16 245
    Points
    16 245
    Par défaut
    Bonjour

    Place ton champ date en ligne puis regroupe sur année (et jour si tu veux garder aussi la date).

    Replace année (et jour) en zone de filtre : tu pourras facilement filtrer une année.
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Bonsoir, merci pour les propositions.

    J'ai adapté ton code à mon TCD :

    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
    Sub TableauCroise(Feuille As String, AvantFeuille As String)
    Dim TDC As New Classe1
     
    TDC.CreerTableau ActiveWorkbook, Feuille & "!A1:G14", "TDC_", AvantFeuille
    TDC.NewDataField "Montant", Somme
    TDC.NewPivotTables "Immo", TypeFiltre
    TDC.NewPivotTables "Date transaction", TypeFiltre
    TDC.NewPivotTables "Code de l'opération", Typeligne
    TDC.NewPivotTables "Libellé de l'opération", Typeligne
    TDC.NewPivotTables "Type indicateur", TypeColonne
     
    TDC.FiltreTypeFiltre "Immo", "I"
    TDC.FiltreTypeFiltre "Date transaction", "##/##/2015"
     
    TDC.AfficheTotal False, False
    TDC.Style "PivotStyleLight16"
     
    Sheets("TDC_").Activate
    ActiveWindow.DisplayGridlines = False
    End Sub
    Cependant, maintenant ce que j'aimerais pouvoir faire c'est filtrer sur les dates pour ne prendre en compte que celles qui finissent par 2015, peut importe le mois et le jour.

    Est ce possible ?? Comme tu peux le voir dans mon code, j'ai essayé avec cette ligne : "TDC.FiltreTypeFiltre "Date transaction", "##/##/2015" " mais cela ne fonctionne pas...


    Pour répondre au 2ème message, à savoir :

    Place ton champ date en ligne puis regroupe sur année (et jour si tu veux garder aussi la date).

    Replace année (et jour) en zone de filtre : tu pourras facilement filtrer une année.
    Je n'ai pas bien compris, il faut que la manip' soit faisable automatiquement par la macro.

  5. #5
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 405
    Points : 16 245
    Points
    16 245
    Par défaut
    Fais le une fois manuellement avec l'enregistreur macro : tu auras le code pour l'incorporer à ta macro et tu comprendras la notion de regroupement, point clé des TCD...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Je viens de faire cette manip'. Malheureusement le code issu de l'enregistrement de la macro ne m'aide pas plus étant donnée qu'il retranscrit uniquement le fait de changer le champ "Date transaction" de "Filtres" à "Ligne" puis l'inverse ...

    VOila le code mais qui ne marche pas du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        ActiveSheet.PivotTables("TCD").PivotSelect "'Libellé de l''opération'[All]", xlLabelOnly, True
        With ActiveSheet.PivotTables("TCD").PivotFields("Date transaction")
            .Orientation = xlRowField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("TCD").PivotFields("Date transaction")
            .Orientation = xlPageField
            .Position = 1
        End With
        Range("C1").Select

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    dans le module de classe clsTdcRD remplace FiltreTypeFiltre par:
    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
    Public Function FiltreTypeFiltre(Champ As String, V As String) As Boolean
    On Error Resume Next
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    FiltrePivotTables = True
    tb.PivotFields(Champ).ClearAllFilters
    For i = 1 To tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & tb.PivotFields(Champ).PivotItems(i).Name)) & ";") <> 0 Then trouve = True
        If trouve = False Then tb.PivotFields(Champ).PivotItems(i).Visible = False
        If Err Then FiltrePivotTables = False
     
    Next
     On Error GoTo 0
    End Function
    toujours dans le module de classe clsTdcRD rajoute ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Function TrouveType(V)
    TrouveType = V
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 And InStr(TrouveType, ":") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd hh:mm"): Exit Function
    If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd"): Exit Function
    If IsNumeric(Replace(TrouveType, ".", ",")) = True Then TrouveType = Replace(TrouveType, ",", "."): Exit Function
    End Function
    dans ton module standard rajoute ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Function Jour365(Annee As String) As String
    Dim D As Date, Y As Integer
    D = CDate(Format("01/01/" & Annee, "yyyy-mm-dd")): Y = Year(D)
    While Year(D) = Y
    Jour365 = Jour365 & Format(D, "yyyy-mm-dd") & ";"
    D = D + 1
    Wend
    End Function
    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
     
    Sub TableauCroise(Feuille As String, AvantFeuille As String)
    Dim TDC As New Classe1
     
    TDC.CreerTableau ActiveWorkbook, Feuille & "!A1:G14", "TDC_", AvantFeuille
    TDC.NewDataField "Montant", Somme
    TDC.NewPivotTables "Immo", TypeFiltre
    TDC.NewPivotTables "Date transaction", TypeFiltre
    TDC.NewPivotTables "Code de l'opération", Typeligne
    TDC.NewPivotTables "Libellé de l'opération", Typeligne
    TDC.NewPivotTables "Type indicateur", TypeColonne
     
    TDC.FiltreTypeFiltre "Immo", "I"
    TDC.FiltreTypeFiltre "Date transaction",Jour365("2015")
     
    TDC.AfficheTotal False, False
    TDC.Style "PivotStyleLight16"
     
    Sheets("TDC_").Activate
    ActiveWindow.DisplayGridlines = False
    End Sub
     
    Public Function Jour365(Annee As String) As String
    Dim D As Date, Y As Integer
    D = CDate(Format("01/01/" & Annee, "yyyy-mm-dd")): Y = Year(D)
    While Year(D) = Y
    Jour365 = Jour365 & Format(D, "yyyy-mm-dd") & ";"
    D = D + 1
    Wend
    End Function
    Dernière modification par Invité ; 28/08/2015 à 00h23.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Je viens d'ajouter ton code. Il semble y avoir un petit problème dans le module de classe puisque la macro échoue et m'affiche le message d'erreur : "Erreur de compilation, Argument non facultatif".

    Le débogeur me surligne la première ligne du code ci dessous, et cette ligne la aussi : "FiltrePivotTables" :

    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
    Public Function FiltreTypeFiltre(Champ As String, V As String) As Boolean
    On Error Resume Next
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    FiltrePivotTables = True
    Tb.PivotFields(Champ).ClearAllFilters
    For i = 1 To Tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & Tb.PivotFields(Champ).PivotItems(i).Name))) <> 0 Then trouve = True
        If trouve = False Then Tb.PivotFields(Champ).PivotItems(i).Visible = False
        If Err Then FiltrePivotTables = False
     
    Next
     On Error GoTo 0
    End Function
    Merci beaucoup de te pencher sur mon problème en tout cas !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Je viens de faire marcher le code, mais pour cela je pense que j'ai un peu détruit la gestion des erreurs dans ton code.

    Voici le code qui marche dans le module de classe :

    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
    Public Function FiltreTypeFiltre(Champ As String, V As String) As Boolean
    On Error Resume Next
    Dim I As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    'FiltrePivotTables = True
    Tb.PivotFields(Champ).ClearAllFilters
    For I = 1 To Tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & Tb.PivotFields(Champ).PivotItems(I).Name))) <> 0 Then trouve = True
        If trouve = False Then Tb.PivotFields(Champ).PivotItems(I).Visible = False
        'If Err Then FiltrePivotTables = False
     
    Next
     On Error GoTo 0
    End Function
    Du coup, j'ai juste mis les 2 lignes en commentaire.

  10. #10
    Invité
    Invité(e)
    Par défaut
    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
    Public Function FiltreTypeFiltre(Champ As String, V As String) As Boolean
    On Error Resume Next
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    FiltreTypeFiltre = True
    Tb.PivotFields(Champ).ClearAllFilters
    For i = 1 To Tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & Tb.PivotFields(Champ).PivotItems(i).Name))) <> 0 Then trouve = True
        If trouve = False Then Tb.PivotFields(Champ).PivotItems(i).Visible = False
        If Err Then FiltreTypeFiltre = False
     
    Next
     On Error GoTo 0
    End Function
    pour être franc avec toi je l'ai fait vite fait sur le gaze pas vraiment vérifier!

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ah oui ok, c'était comme ça ! En tout cas encore merci de ton aide, je n'aurais jamais trouvé tout seul !

    Par hasard, si je peux encore abuser de tes connaissances, ne serais-tu pas comment mettre le tcd sous forme tabulaire ?

    J'ai essayé cela dans le module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDC.AfficheFormeTabulaire "TCD_"
    Avec cela dans le module de classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub AfficheFormeTabulaire(NomTCD As String)
    Tb.PivotTables(NomTCD).RowAxisLayout xlTabularRow
    End Sub
    Mais j'ai un message d'erreur : " Erreur d'éxécution : '438' : Propriété ou méthode non gérée par cet objet"

  12. #12
    Invité
    Invité(e)
    Par défaut
    De mémoire non, car là je pianote dan mon lit sur mon téléphone portable, mais l'enregistreur de macros te le dira!

    Mais je verrai plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub AfficheFormeTabulaire()
    Tb.RowAxisLayout  xlTabularRow
    End Sub
    Dernière modification par Invité ; 28/08/2015 à 01h59.

  13. #13
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 405
    Points : 16 245
    Points
    16 245
    Par défaut
    Bonjour
    Citation Envoyé par Messager.J Voir le message
    Je viens de faire cette manip'. Malheureusement le code issu de l'enregistrement de la macro ne m'aide pas plus étant donnée qu'il retranscrit uniquement le fait de changer le champ "Date transaction" de "Filtres" à "Ligne" puis l'inverse ...
    VOila le code mais qui ne marche pas du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        ActiveSheet.PivotTables("TCD").PivotSelect "'Libellé de l''opération'[All]", xlLabelOnly, True
        With ActiveSheet.PivotTables("TCD").PivotFields("Date transaction")
            .Orientation = xlRowField
            .Position = 1
        End With
        With ActiveSheet.PivotTables("TCD").PivotFields("Date transaction")
            .Orientation = xlPageField
            .Position = 1
        End With
        Range("C1").Select
    C'est sûr que si tu oublies l'essentiel, à savoir le regroupement, ce chassé croisé n'a aucun intérêt.

    En remplaçant dans le module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDC.NewPivotTables "Date transaction", Typefiltre
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDC.NewPivotTables "Date transaction", Typeligne
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDC.FiltreTypeFiltre "Immo", "I"
    TDC.FiltreTypeFiltre "Date transaction", Jour365("2015")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDC.FiltreTypeFiltre "Immo", "I", 1
    TDC.FiltreTypeFiltre "Date transaction", "2015", 2
    et en modifiant ainsi dans le module de classe
    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
    Public Function FiltreTypeFiltre(Champ As String, V As String, P As Integer) As Boolean
    On Error Resume Next
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    FiltreTypeFiltre = True
    tb.PivotFields(Champ).ClearAllFilters
    For i = 1 To tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & tb.PivotFields(Champ).PivotItems(i).Name))) <> 0 Then trouve = True
        If trouve = False Then
            tb.RowRange.Cells(2, 1).Group Start:=True, End:=True, Periods:=Array(False, False, False, False, False, False, True)
            tb.PivotFields(Champ).Orientation = xlPageField
            tb.PivotFields(Champ).Position = P
            tb.PivotFields(Champ).CurrentPage = V
            Exit Function
        End If
        If Err Then FiltreTypeFiltre = False
    Next
     
    On Error GoTo 0
    End Function
    on dispose d'un regroupement Année dans le cache du TCD et on évite des boucles inutiles.

    Je n'ai pas la maestria de rdurupt en modules de classe, loin s'en faut, et on doit pouvoir améliorer mes corrections mais je connais bien les TCD et trouve dommage de ne pas utiliser toutes leurs possibilités.

    Edit : il y a de toute évidence à améliorer afin de ne pas tenter d'appliquer le regroupement à un autre champ. Il faudrait sans doute deux fonctions différentes : une pour structurer l'autre pour filtrer...
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour Chris,
    J’avoue ne pas être un expert en TDC! devant l'afflue de demande concernant les DTC sur le forum! j'ai créé un TDC avec le générateur de macro et j'ai analysé le code afin de le découper en propriété et méthode.

    le module de classe c'est mieux pour l’empaquetage et la saisie intuitive!

    je n’utilise que très rarement le TDC et je les fait manuellement en générale.

    si d'aventure tu trouves des amélioration et/ou des fonctionnalités manquante, je suis preneur.

    par exemple un champ expression Champ3=champ1 * champ2 !!!
    Liste(Madame /Monsieur = left(numSecu,2))

    Edite: je voyais déjà cette éventualité quand j'ais proposé Jour365!
    Edit : il y a de toute évidence à améliorer afin de ne pas tenter d'appliquer le regroupement à un autre champ. Il faudrait sans doute deux fonctions différentes : une pour structurer l'autre pour filtrer...
    je pense que P en optional pourrait faire le distinguo mais là Chris je m'en remets à toi!
    Dernière modification par Invité ; 28/08/2015 à 12h35.

  15. #15
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 405
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 405
    Points : 16 245
    Points
    16 245
    Par défaut
    Bonjour

    J'ai un peu avancé ainsi
    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
    Public Function FiltreTypeFiltre(Champ As String, V As String, P As Integer, Grp As Boolean) As Boolean
    On Error Resume Next
    FiltreTypeFiltre = True
    tb.PivotFields(Champ).ClearAllFilters
            If Grp = True Then
                tb.RowRange.Cells(2, 1).Group Start:=True, End:=True, Periods:=Array(False, False, False, False, False, False, True)
                tb.PivotFields(Champ).Orientation = xlPageField
            End If
            tb.PivotFields(Champ).CurrentPage = V
            tb.PivotFields(Champ).Position = P
            Exit Function
        If Err Then FiltreTypeFiltre = False
     
    On Error GoTo 0
    End Function
    et du coup les appels sont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDC.FiltreTypeFiltre "Date transaction", "2015", 2, True
    TDC.FiltreTypeFiltre "Immo", "I", 1, False
    Par contre la position du champ n'est pas modifiée (j'ai triché sans succès en intervertissant les appels !) : je ne sais pas pourquoi. C'est comme si il enregistrait la valeur mais sans agir...

    Pour répondre à la question des calculs : il faut savoir que les champs calculés n'agissent que sur le principe de la somme : par exemple donnera somme des prix * somme des quantités.
    Cela réduit de fait les possibilités d'utiliser les champs calculés : ils sont utiles pour des calcul de taux ou de contrevaleur : TVA, commission liées au total et non à un type ou à un sous-ensemble, affichage dans une autre monnaie... En fait quand on peut être sûr que le calcul est valable quel que soit le niveau dans le TCD.

    Je pars en déplacement pour 15 jours mais à mon retour, je participerai volontiers à un projet d'extension de ton module de classe TCD que je trouve très intéressant.
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  16. #16
    Invité
    Invité(e)
    Par défaut
    Je t'en remercie d'avance!

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par 78chris Voir le message
    Bonjour


    C'est sûr que si tu oublies l'essentiel, à savoir le regroupement, ce chassé croisé n'a aucun intérêt.

    En remplaçant dans le module standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDC.NewPivotTables "Date transaction", Typefiltre
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDC.NewPivotTables "Date transaction", Typeligne
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDC.FiltreTypeFiltre "Immo", "I"
    TDC.FiltreTypeFiltre "Date transaction", Jour365("2015")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDC.FiltreTypeFiltre "Immo", "I", 1
    TDC.FiltreTypeFiltre "Date transaction", "2015", 2
    et en modifiant ainsi dans le module de classe
    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
    Public Function FiltreTypeFiltre(Champ As String, V As String, P As Integer) As Boolean
    On Error Resume Next
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    FiltreTypeFiltre = True
    tb.PivotFields(Champ).ClearAllFilters
    For i = 1 To tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & tb.PivotFields(Champ).PivotItems(i).Name))) <> 0 Then trouve = True
        If trouve = False Then
            tb.RowRange.Cells(2, 1).Group Start:=True, End:=True, Periods:=Array(False, False, False, False, False, False, True)
            tb.PivotFields(Champ).Orientation = xlPageField
            tb.PivotFields(Champ).Position = P
            tb.PivotFields(Champ).CurrentPage = V
            Exit Function
        End If
        If Err Then FiltreTypeFiltre = False
    Next
     
    On Error GoTo 0
    End Function
    on dispose d'un regroupement Année dans le cache du TCD et on évite des boucles inutiles.

    Je n'ai pas la maestria de rdurupt en modules de classe, loin s'en faut, et on doit pouvoir améliorer mes corrections mais je connais bien les TCD et trouve dommage de ne pas utiliser toutes leurs possibilités.

    Edit : il y a de toute évidence à améliorer afin de ne pas tenter d'appliquer le regroupement à un autre champ. Il faudrait sans doute deux fonctions différentes : une pour structurer l'autre pour filtrer...
    Je n'avais pas bien compris quand tu parlais de regroupement visiblement !

    Ton code est vraiment pas mal et surtout ultra rapide !

    Je pars en déplacement pour 15 jours mais à mon retour, je participerai volontiers à un projet d'extension de ton module de classe TCD que je trouve très intéressant.
    Très bonne idée, je suis très curieux de voir ça

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    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
    Public Function FiltreTypeFiltre(Champ As String, V As String, P As Integer) As Boolean
    On Error Resume Next
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    FiltreTypeFiltre = True
    tb.PivotFields(Champ).ClearAllFilters
    For i = 1 To tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & tb.PivotFields(Champ).PivotItems(i).Name))) <> 0 Then trouve = True
        If trouve = False Then
            tb.RowRange.Cells(2, 1).Group Start:=True, End:=True, Periods:=Array(False, False, False, False, False, False, True)
            tb.PivotFields(Champ).Orientation = xlPageField
            tb.PivotFields(Champ).Position = P
            tb.PivotFields(Champ).CurrentPage = V
            Exit Function
        End If
        If Err Then FiltreTypeFiltre = False
    Next
     
    On Error GoTo 0
    End Function
    Je ne comprends pas dans ce code quand on fait référence au "Filtre" :

    En effet, j'aimerais effectuer un filtre à deux choix sur le champ en colonne mais je ne vois pas comment modifier le code ci dessus afin de réussir cette manipulation !

  19. #19
    Invité
    Invité(e)
    Par défaut
    "Toto;Titi;Tutu;"là tu as trois choix!

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je viens d'essayer ce code sur une autre machine et il plante ... C'est la version 2010 d'Excel alors que j'ai créé le fichier sous le 2013 !

    Le code plante lors de l’exécution de ce module et me surligne "Trim" :

    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
    Public Function FiltreTypeFiltre(Champ As String, V As String, P As Integer) As Boolean
    '
    '   Fonction qui permet d'appliquer un filtre sur un champ donné
    '
    On Error Resume Next
    '
    Dim i As Integer
    Dim I2 As Long
    Dim trouve As Boolean
    '
    FiltreTypeFiltre = True
    Tb.PivotFields(Champ).ClearAllFilters
    '
    For i = 1 To Tb.PivotFields(Champ).PivotItems.Count
        trouve = False
        If InStr(V, TrouveType(Trim("" & Tb.PivotFields(Champ).PivotItems(i).Name))) <> 0 Then trouve = True
        If trouve = False Then
            Tb.RowRange.Cells(2, 1).Group Start:=True, End:=True, Periods:=Array(False, False, False, False, False, False, True)
            Tb.PivotFields(Champ).Orientation = xlPageField
            Tb.PivotFields(Champ).Position = P
            Tb.PivotFields(Champ).CurrentPage = V
            Exit Function
        End If
        If Err Then FiltreTypeFiltre = False
    Next
    '
    On Error GoTo 0
    '
    End Function
    Quelqu'un aurait une idée d'où peut provenir l'erreur sachant que le message si je me souviens bien ressemble a : " erreur, vérifier la bibliothèque ... " ?

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

Discussions similaires

  1. [Toutes versions] filtre TCD via macro vba sur texte contenu
    Par fomy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/08/2012, 10h35
  2. [XL-2007] Macro sur Filtre élaboré
    Par jose_67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/02/2010, 20h45
  3. recuperer un tableau sur page html securisee via macro
    Par TOTOTAR dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/06/2009, 05h53
  4. Afficher une photo .Jpg sur Excel via macro Excel
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/04/2008, 12h51
  5. [VBA-E]Filtre via une macro sur Excel
    Par jamal.b dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/04/2006, 16h35

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