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 :

Fixation de la position des valeurs d'un PivotItems() dans un TCD, dont l'existence est aléatoire [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Fixation de la position des valeurs d'un PivotItems() dans un TCD, dont l'existence est aléatoire
    Bonjour,

    Voici mon problème :

    Je gère par une macro VBA la création d'un tableau croisé dynamique (TCD).

    Dans la plage de données liée au TCD, une des étiquettes donnée se nommant « Type » est sélectionnée comme champ colonne pour mon TCD.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
    "Plage de Données!R4C1:RxCy).CreatePivotTable TableDestination:="", TableName:= _
    "TCD", DefaultVersion:=xlPivotTableVersion10
    ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
    ActiveSheet.Cells(3, 1).Select
     
    With ActiveSheet.PivotTables("TCD").PivotFields("Type")
    .Orientation = xlColumnField
    .Position = 1
    End With
    Cette colonne de données comprend les valeurs suivantes (Vi) avec la position (Pi) que je veux leur attribuer dans le champ colonne de mon TCD :

    V1 # P2 #
    V2 # P4 #
    V3 # P3 #
    V4 # P6 #
    V5 # P5 #
    V6 # P1 #

    --------------------------------------------------------------------------
    ______________Colonnes du TCD (Champ « Type »)
    --------------------------------------------------------------------------

    _____________-#--V6--#--V1--#--V3--#--V2--#--V5--#--V4--#
    ---------------#-------#------#------#-------#------#------#
    Lignes 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
    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
    `-------------------------------------------------------------------------
    `Affectation du champ « Type » comme colonne de mon TCD
    `-------------------------------------------------------------------------
     
    With ActiveSheet.PivotTables("TCD").PivotFields("Type")
    .Orientation = xlColumnField
    .Position = 1
    End With
     
    `-------------------------------------------------------------------------
    ' Fixation de la position des valeurs du Champs « Type » dans la colonne du TCD
    `-------------------------------------------------------------------------
     
    Dim k As String
    Dim pvtItem As PivotItem
     
    For Each pvtItem In ActiveSheet.PivotTables("TCD").PivotFields("Type").VisibleItems
     
    k = pvtItem.Name
     
    Select Case k
     
    Case "V1"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V1")_ .Position = 2
     
    Case "V2"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V2")_
    .Position = 4
     
    Case "V3"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V3")_
    .Position = 3
     
    Case "V4"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V4")_
    .Position = 6
     
    Case "V5"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V5")_ .Position = 5
     
    Case "V6"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V6")_
    .Position = 1
     
    Case Else
     
    End Select
     
    Next
     
    `-------------------------------------------------------------------------
    1er problème :
    `-------------------------------------------------------------------------
    Ce code de fonctionne pas, et les Vi ne se positionnent pas comme je voudrais

    `-------------------------------------------------------------------------
    2e problème :
    `-------------------------------------------------------------------------

    la plage de donnée peut varier (car tirée d'une extraction de données variables) et il se peut que des Vi soient absentes dans la colonne « Type ».

    On a donc toutes les combinaisons possibles V1,V3,V4,V6 ou V3,V5,V6 V2,V4 ou V6 etc..

    Comment gérer cette probabilité sachant que je veux toujours que les Vi respectent l'ordre « relatif » qui leur a initialement été attribué :

    Ex :

    Si V6 n'existe pas et que V2 existe, alors V2 prend la position 1 (P1) et devra être devant tous les autres Vi (hors V6).

    V1 # P2 relatif #
    V2 # P4 relatif #
    V3 # P3 relatif #
    V4 # P6 relatif #
    V5 # P5 relatif #
    V6 # P1 relatif #

    J'ai retourné la question dans toutes ses formes, mais n'étant pas un Expert VBA je sèche.

    Merci d'avance pour votre aide ; vous m'enlèveriez ne grosse épine du pied

    Bon WE à tous !
    Cordialement

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Tu pourrais avant de trier préciser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With ActiveSheet.PivotTables("TCD").PivotFields("Type")
       .Orientation = xlColumnField
       .Position = 1
       .AutoSortOrder = xlmanual
    End With
    Par ailleurs, dans ton code, tu peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V1")_ .Position = 2
    par Pour la 2 ème question, si tu as des éléments absents, tu peux les ajouter. Par exemple, s'il manque V2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V2"
    ce qui permet d'attribuer une place à chaque élément, qu'il y ait des absents ou pas.

    Aillant fait cela, tu auras encore le choix d'afficher ou pas ces éléments sans valeur, avec la propriété ShowAllItems du champ. Cette propriété est False par défaut. Si tu veux les voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.PivotTables("TCD").PivotFields("Type").ShowAllItems = True
    Il ne faut pas confondre avec la propriété Visible de l'item. D'ailleurs, si tu ne veux pas rencontrer de sérieux pb de tris, évite de masquer des éléments.

    COrdialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonsoir pgz !

    Merci pour votre aide précieuse et instructive.

    Tri manuel :
    En ce qui concerne la propriété .AutoSortOrder = xlmanual, elle ne fonctionne pas dans la macro et le message du Bug qu'elle entraîne affiche :

    Erreur d'exécution '450' : Nombre d'arguments incorrects ou affectation de propriété incorrecte

    Je pense que cela peut venir du fait qu'il n'y a qu'un seul Pivotfield qui est l'étiquette de colonne "Type".
    Cependant ce n'est pas bloquant car le Tri automatique est paramétré par défaut sur "Manuel" lorsque le TCD se créer.

    Problème principal:
    Je suis d'accord avec votre stratégie d'ajouter toutes les valeurs manquantes (pourvu qu'il n'y en ai pas trop!) et de fixer leur position ensuite.

    Là je suis limité par le code.
    Voici ce que je voudrais faire, mais que je ne sais pas l'écrire :

    Je vais tester chaque valeur du champ "Type" :

    Dim k As String
    Dim pvtItem As PivotItem

    For Each pvtItem In ActiveSheet.PivotTables("TCD").PivotFields("Type")
    k = pvtItem.Name

    Select Case

    Case "V1"

    Oui : je passe à une autre valeur ('k') [Next] et je teste "V2"

    Non [Case Else] : j'ajoute la valeur "V1"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V1"
    puis je passe à une autre valeur ('k') [Next] et je teste "V2"

    End Select

    Case "V2"

    Oui : je passe à une autre valeur ('k') [Next] et je teste "V3"

    Non [Case Else] : j'ajoute la valeur "V2"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V2"
    puis je passe à une autre valeur ('k') [Next] et je teste "V3"

    End Select

    Etc....

    Le problème est que je ne sais pas comment gérer plusieurs "Next" pour passer proprement à une autre valeur 'k' avec le seul 'For Each pvtItem In [...]' du début.

    Comment feriez-vous ?
    Je pense qu'on y est presque

    Merci d'avance et bonne soirée

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Pour le tri manuel, au temps pur moi : la propriété autosortorder est en lecture simple. Il faut utiliser la méthode AutoSort.

    Pour le pb principal, tu peux déjà essayer d'ajouter tous les éléments, sans te préoccuper de savoir s'ils existent ou non. Si cela pose pb, je te proposerai une façon de faire.

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pgz

    Pouvez-vous m'expliquer comment rajouter tous les éléments sans se préoccuper de leur existence ?

    Pour le moment j’essaie de faire directement ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V1"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V2"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V3"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V4"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V5"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V6"
    Cela ne fonctionne que si les valeurs n'existent pas.
    Si une valeur existe, la macro bugge avec le message suivant :

    Erreur d'exécution '1004'
    Erreur définie par l'application ou par l'objet
    Merci d'avance

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Dans ce cas, tu ne prends pas grand risque à ignorer les erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    on error Resume next
    for i = 1 to 6
        ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V" & i
    Next i
    on Error Goto 0
    Sinon, il faut tester la présence de chaque Item
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i = 1 to 6
        On error resume Next
            set pvtIt = ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems("V" & i)
            if Err.Number <> 0 then 
                Err.clear
                On Error GOTO 0
                ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "V" & i
            ENd if
        On Error goto 0
    Next i
    Pour les idées, à mettre au point.

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Aïe, j'aurai dû préciser que les Vi sont en fait des chaines de caractère.
    Donc difficile d'incrémenter à l'aide d'un "i".

    J'aurai plutôt cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "a"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "b"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "c"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "d"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "e"
    ActiveSheet.PivotTables("TCD").PivotFields("Type").PivotItems.Add "f"
    Souhaitez-vous que je vous envoie le fichier et la macro, ça serait plus simple peut-être ?

    Encore merci

    Etat pour TCD.xls

    Voici mon code complet :

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    Option Explicit
     
    Sub TCD()
     
    'Developped by koobcam - march 2011
     
    Dim a As Integer
    Dim b As Integer
    Dim c As Integer
    Dim d As Integer
    Dim e As Integer
    Dim f As Integer
    Dim n As Integer
    Dim p As Integer
    Dim nbcar As Integer
     
    Dim Show As String
    Dim Year As String
     
    Dim k As String
    Dim col() As String
     
    Dim pvtItem As PivotItem
     
    'Identification de l'ensemble des colonnes pour les plages du TCD
     
    a = ActiveSheet.Range("A65536").End(xlUp).Row
    b = ActiveSheet.Range("IV4").End(xlToLeft).Column
     
    ReDim col(b)
     
        For n = 1 To b
     
    col(n) = Cells(4, n).Value
     
        Next
     
    'Création d'un TCD
     
     ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
            "PASCOM!R4C1:R" & a & "C" & b).CreatePivotTable TableDestination:="", TableName:= _
            "RAPPRO_PSOFT", DefaultVersion:=xlPivotTableVersion10
        ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
        ActiveSheet.Cells(3, 1).Select
     
    ' Nommer la nouvelle feuille et insérer un titre
     
    ActiveSheet.Name = "RAPPRO_PSOFT"
     
    Rows("1:1").Select
     
    Selection.Insert Shift:=xlDown
    Selection.Insert Shift:=xlDown
    Selection.Insert Shift:=xlDown
    ActiveCell.FormulaR1C1 = "Rapprochement du CA PASCOM_PSOFT"
     
    Range("A1").Select
     
        With Selection
            .Font.Bold = True
            .Font.Underline = xlUnderlineStyleSingle
            .WrapText = False
        End With
     
    Range("A1:B1").Select
        With Selection
            .Merge
            .HorizontalAlignment = xlLeft
        End With
     
    'Sélection des champs colonnes du TCD
     
    With ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(17))
            .Orientation = xlDataField
            .Position = 1
    End With
     
    With ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2))
            .Orientation = xlColumnField
            .Position = 1
    End With
     
    ' Ordonnancement de la ventilation PASCOM
     
    For Each pvtItem In ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).VisibleItems
     
        k = pvtItem.Name
     
        Select Case k
     
    Case "Vente"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Vente").Position = 1
     
    Case "A risque"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("A risque").Position = 2
     
    Case "Contentieux"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Contentieux").Position = 3
     
    Case "Autres Ventes"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Autres Ventes").Position = 4
     
    Case "Evènements"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Evènements").Position = 5
     
    Case "Echanges"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Echanges").Position = 6
     
    Case Else
     
        End Select
     
    Next
     
     
     'Sélection des champs lignes du TCD
     
        'Typo 1
        With ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(5))
            .Orientation = xlRowField
            .Position = 1
        End With
     
        'Typo 2
        With ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(6))
            .Orientation = xlRowField
            .Position = 2
        End With
     
        'Code Product
        With ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(11))
            .Orientation = xlRowField
            .Position = 3
        End With
     
        'Lib Product
        With ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(12))
            .Orientation = xlRowField
            .Position = 4
        End With
     
    ' Sélection et mise au format des Sous-totaux en ligne
     
        '>> TOTAL
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotSelect _
            "'Column Grand Total'", xlDataAndLabel, True
        Selection.Font.Bold = True
        With Selection.Interior
            .ColorIndex = 40
            .Pattern = xlSolid
        End With
     
        '>> Lib Product
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(12)). _
            Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
            False, False)
     
        '>> Code Product
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(11)). _
            Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
            False, False)
     
        '>> Typo 2
     
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotSelect _
        "'Typo2'[All;Total]", xlDataAndLabel, True
        Selection.Font.Bold = True
            With Selection.Interior
                .ColorIndex = 37
                .Pattern = xlSolid
            End With
     
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(6)).LayoutBlankLine = True
     
        '>> Typo 1
     
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotSelect _
            "'Typo1'[All;Total]", xlDataAndLabel, True
        Selection.Font.Bold = True
            With Selection.Interior
                .ColorIndex = 35
                .Pattern = xlSolid
            End With
     
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(5)).LayoutBlankLine = True
     
    'Identification du Salon et de la Session
     
    Year = Sheets("PASCOM").Range("F2").Value
    Show = Sheets("PASCOM").Range("E2").Value
     
    Rows(3).Select
    Selection.Insert Shift:=xlDown
    Selection.Insert Shift:=xlDown
     
    Range("A3").Value = Show
    Range("A4").Value = Year
     
    Range("A3:A4").Select
     
        With Selection
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
        End With
     
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
     
    ' Mise en forme des nombres
    Columns("E:K").Select
    Call MEF_Nombre.MEF_Nombre
     
    ' Ajustement de l'alignement
     
    Range("C:C").Select
     
        With Selection
            .HorizontalAlignment = xlCenter
        End With
     
    '--------------------------------------
    'Fixation de la largeur des colonnes
     
    Columns("A:A").ColumnWidth = 21.43
    Columns("B:B").ColumnWidth = 26.86
    Columns("C:C").ColumnWidth = 7.14
    Columns("D:'D").ColumnWidth = 25#
    Columns("E:K").ColumnWidth = 11#
    '--------------------------------------
     
    'Mise en page des Entiquettes de colonne du TCD
     
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields("Somme de Net" & Chr(10) & "YTD N"). _
            Caption = "Net Année N (€)"
     
    Rows("8:8").RowHeight = 12.75
     
    Rows("9:9").Select
     
        With Selection
            .WrapText = True
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
            .EntireRow.AutoFit
            .Font.Bold = True
         End With
     
    Rows("10:10").Select
    ActiveWindow.FreezePanes = True
     
    ' Mise en page finale pour Impression
     
    Rows("1:1").RowHeight = 21.75
     
    e = ActiveSheet.Range("A65536").End(xlUp).Row
    f = ActiveSheet.Range("A9").End(xlToRight).Column
     
        With ActiveSheet.PageSetup
            .PrintTitleRows = "$1:$9"
            .Orientation = xlLandscape
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = 20
        End With
     
    ' Plage dynamique de la zone d'impression
     
    Range(Cells(1, 1), Cells(e, f)).Select
    ActiveSheet.PageSetup.PrintArea = Selection.Address
     
    'Mise en page finale et Cache des champs du TCD
     
    Call MiseEnPage_Final.MiseEnPage_Final
    ActiveWorkbook.ShowPivotTableFieldList = False
     
    Range("A1").Select
     
    End Sub
    Le fichier joint comporte tous les items nécessaires (Ventes, A Risque, Contentieux, Echanges, Evènements,Autres Ventes) nous sommes donc dans un "monde parfait".

    Mais ça coince lorsque des items sont manquants.

  8. #8
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonsoir.

    Je regarderai plus tard ton classeur. Ne serait-ce que pour comprendre pourquoi tu crées le TCD en VBA. Généralement, on crée le TCD à la main et on assure les mises à jour ou les sélections de champs de page en VBA. Cela permet d'ailleurs de garder en mémoire des éléments sans représentant en mémoire cache.

    Ceci dit, je te propose de remplacer cette portion
    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
     Ordonnancement de la ventilation PASCOM
     
    For Each pvtItem In ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).VisibleItems
     
    k = pvtItem.Name
     
    Select Case k
     
    Case "Vente"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Vente").Position = 1
     
    Case "A risque"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("A risque").Position = 2
     
    Case "Contentieux"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Contentieux").Position = 3
     
    Case "Autres Ventes"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Autres Ventes").Position = 4
     
    Case "Evènements"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Evènements").Position = 5
     
    Case "Echanges"
    ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems("Echanges").Position = 6
     
    Case Else
     
    End Select
     
    Next
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim v As Variant, i As Integer
     
    'Ordonnancement de la ventilation PASCOM
    v = Array("Vente", "A risque", "Contentieux", "Autres Ventes", "Evènements", "Echanges")
     
    For i = 0 To UBound(v)
        On Error Resume Next
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems.Add v(i)
        On Error GoTo 0
        ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems(v(i)).Position = i + 1
    Next i
    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Waow ! Merci PGZ, l’ordonnancement marche nickel lorsque les 6 valeurs existent ("Vente", "A risque", "Contentieux", "Autres Ventes", "Evènements", "Echanges")

    Cependant, lorsque je teste avec un plage de données où certaines des 6 valeurs manquent, rien à faire : ce nouveau code bugge quand même

    Erreur d'exécution '1004'
    Impossible de définir la propriété Position de la classe PivotItem
    Néanmoins je note que l'ensemble des Items sont bien créés dans le TCD et les Items initialement existant sont bien positionnés et les Items initialement absents ne sont pas visibles : ce qui m'irait parfaitement si la macro ne buggait pas

    Je pense qu'on y est presque....

    Qu'elle a été votre plan d'attaque avec l'Objet "Array" et la fonction "Ubound"? Il faut que je potasse un peu pour comprendre ces fonctionnalités

  10. #10
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Tu peux essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim v As Variant, i As Integer
     
    'Ordonnancement de la ventilation PASCOM
    v = Array("Vente", "A risque", "Contentieux", "Autres Ventes", "Evènements", "Echanges")
     
    For i = 0 To UBound(v)
        On Error Resume Next
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems.Add v(i)
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems(v(i)).Position = i + 1
        On Error GoTo 0
        Next i
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim v As Variant, i As Integer
     
    'Ordonnancement de la ventilation PASCOM
    v = Array("Vente", "A risque", "Contentieux", "Autres Ventes", "Evènements", "Echanges")
     
    For i = 0 To UBound(v)
        On Error Resume Next
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems.Add v(i)
        On Error GoTo 0
    Next i
     
    For i = 0 To UBound(v)
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems(v(i)).Position = i + 1
    Next i
    A tester.

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  11. #11
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    C'est le 1er code qui marche à la perfection !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim v As Variant, i As Integer
     
    'Ordonnancement de la ventilation PASCOM
    v = Array("Vente", "A risque", "Contentieux", "Autres Ventes", "Evènements", "Echanges")
     
    For i = 0 To UBound(v)
        On Error Resume Next
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems.Add v(i)
            ActiveSheet.PivotTables("RAPPRO_PSOFT").PivotFields(col(2)).PivotItems(v(i)).Position = i + 1
        On Error GoTo 0
        Next i
    Merci infiniment PGZ !

    Pour bien comprendre :
    L'astuce est de créer un "tableau" (variable v de Type 'Array' ?) contenant toutes les valeurs souhaitées ("Vente", "A risque", "Contentieux", "Autres Ventes", "Evènements", "Echanges")?

    Ces valeurs sont indexées dans ce tableau et peuvent être incrémentées avec la variable v(i), puis ensuite ajoutées et positionnées les unes après les autres ?

    Les 'On Error Resume Next' & 'On Error GoTo 0' empêchant le bug en cas de valeur à ajouter déjà existante ?

    Ai-je bien saisi ?

    Encore merci pour votre aide précieuse
    Cordialement

  12. #12
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Hello.

    Oui, tu as parfaitement saisi.
    Reste à savoir pourquoi tu recrées le TCD en VBA, plutôt que d'en créer 1 et le modifier...

    Un dernier tuyau : pour aller plus vite dans les modifs d'un TCD, pense à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTCD.ManualUpdate = True
    en début de code. Rétablir à False à la fin.

    Pense à taguer

    Bon dimanche

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

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

Discussions similaires

  1. [JpGraph] position des valeurs sur barplot
    Par kineton dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 01/06/2011, 13h38
  2. Réponses: 3
    Dernier message: 21/05/2007, 15h37
  3. Trouver la position des valeurs d'un vecteur
    Par hidies dans le forum MATLAB
    Réponses: 3
    Dernier message: 12/04/2007, 12h33
  4. Donner des valeurs à Argc et Argv dans le code
    Par olivier857 dans le forum C
    Réponses: 44
    Dernier message: 20/06/2006, 13h57
  5. Réponses: 1
    Dernier message: 19/03/2006, 20h52

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