Probléme pour utilisation internationale d'un TCD

loulou14

XLDnaute Nouveau
Bonjour à tous

J'ai créé un fichier qui est utilisé dans différent pays (Espagne, France, Brésil + langage Anglais). Le fichier n'est pas un fichier partagé.
Dans ce fichier, je dispose d'un TCD construit à partir de plusieurs plages de feuilles de calcul avec étiquettes.

Le problème est le suivant : lors de l'actualisation du TCD, le nom des champs est automatiquement traduit dans le langage configuré sur le PC sur lequel le fichier est ouvert.

Exemple :
  • j'ouvre le fichier en langage France , les champs sont nommés Colonne, Ligne, Valeur
  • j'ouvre le fichier en langage Espagne , les champs sont nommés Columna, Fila, Valor

J'ai essayé de renommer les champs, mais les noms redeviennent les noms génériques comme dans l'exemple précédent dès lors que le fichier est ouvert dans un autre pays.

Conséquence 1 : j'utilise le champ "Colonne" dans une macro. A chaque changement d'utilisateur "étranger", la macro génère une erreur normale (le champ "Colonne" n'existe plus lors d'une utilisation par un collègue espagnol, puisqu'il est devenu Columna)

Conséquence 2 : les étiquettes ligne et colonne, ainsi que la somme valeur deviennent vides. Obligation de réaffecter les champs et re-synthétiser les valeurs (somme)

Pour illustrer le problème :
  • en PJ, 1 fichier exemple d'un TCD équivalent avec sa représentation en langage France et sa représentation en langage espagnol
  • le bout de code que j'utilise sur ce TCD
    Code:
    Sheets("TCD NATALITE").PivotTables("TCD NATALITE").PivotCache.Refresh
       
        Set feuille = Worksheets("TCD NATALITE") 'TCD = nom de la feuille où se trouve le TCD
            pt = "TCD NATALITE" 'Nom du TCD
            champ = "Colonne" 'Nom du champ où l'on ne veut pas voir les Vides
    
            With feuille.PivotTables(pt)
                .ClearAllFilters
                .PivotFields(champ).EnableMultiplePageItems = True
                .PivotFields(champ).AutoSort xlAscending, "Colonne"
            End With
    
                For Each pi In feuille.PivotTables(pt).PivotFields(champ).PivotItems
                If pi = "(blank)" Then pi.Visible = False
                If pi = "Total général" Then pi.Visible = False
    Next pi


En solution, j'imagine de renommer avec condition les champs avant actualisation , par exemple :

Si un pivotfield est nommé "Columna", alors le renommer "Colonne"
Si un pivotfield est nommé "Fila", alors le renommer "Ligne"
Si un pivotfield est nommé "Valor", alors le renommer "Valeur"

J'aurais besoin d'un coup de main pour écrire le code correspondant (si la solution est réaliste)
Peut être que je cherche à compliquer les choses et qu'il y a une astuce plus simple ?

Merci d'avance pour votre expertise et votre aide.

Cordialement
 

Pièces jointes

  • exemple.xlsm
    60.5 KB · Affichages: 28

mutzik

XLDnaute Barbatruc
bonjour,

1. je pense qu'il vaudrait mieux regrouper tes données dans un seul tableau et de là, faire ton tableau CD
2. peut-être qu'excel se mélange les pédales car ligne, colonne valeur sont des champs mots-clés réservés
essayer d'autres noms comme lig, col et val
 

loulou14

XLDnaute Nouveau
  • Je constate qu'il manque des explications sur le fichier exemple.
Ce fichier illustre les phénomènes constatés.
Dans le fichier utilisé, il y a 1 seul TCD nommé TCD. Les onglets France ou Espagne sont juste là pour illustrer le changement d'état de TCD selon que le fichier soit ouvert sur PC Français ou PC espagnol.

  • J'ai bien essayé de modifier le nom des champs. Malheureusement, dès qu'on ouvre le fichier sur PC avec langage différent et après actualisation du TCD, le nom des champs sont renommés automatiquement dans le langage du PC
 

chris

XLDnaute Barbatruc
Bonjour
Coucou mutzik :)

C'est toi qui comprends mal la réponse de Mutzik : ton TCD est fait à partir de 3 sources : MFI, JA, DF d'où ligne, colonne, valeur.
  • Soit comme suggéré par Mutzik rassembler ces 3 sources en une,
    • soit physiquement,
    • soit virtuellement par requête.
      On demande ici de préfixer les posts de la version utilisée et de mettre aussi celle-ci dans le profil.
      Ce n'est pas pour faire joli ou pour des stats c'est parce que les solutions ne sont pas les mêmes selon la version utilisée en particulier pour les TCD.
      Donc sans connaître ta version je ne peux conseiller la meilleure solution de requête
      voir les possibilités ici Ce lien n'existe plus
  • soit modifier ton code pour raisonner sur le type de champ et non sur son nom : tu n'en as qu'un par type...
  • soit (pas testé) renommer tes champs dans le TCD avec des noms non réservés : en principe sur une source interne, les noms résistent à l'actualisation et devraient ne plus être traduits.
EDIT : De plus un champ placé en étiquette de ligne est automatiquement multi sélection donc l'option EnableMultiplePageItems = True ne s'applique pas ici
 
Dernière édition:

Amilo

XLDnaute Accro
Bonsoir à tous,
Je ne pense pas que cela fonctionnera mais voici comment je procède habituellement pour mes TCD avec plusieurs sources (avec étiquettes) :
Personnellement, en plus des étiquettes de "ligne", "colonne" et "valeur", je génère également un champ de page que je nomme par le nom de l'onglet correspondant. Ensuite je modifie tous les noms de champs du TCD pour un titre plus parlant.

Sinon, l'autre solution déjà évoquée à savoir regrouper les données dans un même tableau, vous pouvez générer cette source en 1 seul clique comme suite :
- Affichez les totaux pour les lignes et les colonnes dans le TCD
- Double cliquez sur le total général en bas à droite et vous avez la source des 3 onglets en une seule plage
- Renommez les titres et refaites un TCD sur cette source

Cordialement
 
Dernière édition:

chris

XLDnaute Barbatruc
BOnjour
...Personnellement, en plus des étiquettes de "ligne", "colonne" et "valeur", je génère également un champ de page que je nomme par le nom de l'onglet correspondant.
C'est effectivement souvent utile mais tout dépend du contexte.
...Ensuite je modifie tous les noms de champs du TCD pour un titre plus parlant.
Ce que j'ai proposé en dernière option.
...vous pouvez générer cette source en 1 seul clique comme suite :
- Affichez les totaux pour les lignes et les colonnes dans le TCD
- Double cliquez sur le total général en bas à droite et vous avez la source des 3 onglets en une seule plage
- Renommez les titres et refaites un TCD sur cette source
L'ennui de cette méthode est qu'elle n'est ni dynamique ni évolutive puisqu'on part du résultat.
Tandis que la requête permet de gérer l'évolution des sources de façon automatique.
 

Jean-Eric

XLDnaute Occasionnel
Bonjour,
Une proposition à étudier.
Cdlt.
VB:
Public Sub Create_Multipage_PivotTable()
Dim wb As Workbook
Dim wsPT As Worksheet
Dim wsName As String, fullAddress As String
Dim I As Long
Dim rngPT As Range
Dim rngPTAddress As String
Dim tblSheets As Variant
Dim Arr() As String
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim pf As PivotField
    '---------------------------------------------------------------
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set wb = ActiveWorkbook
    On Error Resume Next
    wb.Worksheets("TCD").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True
    '---------------------------------------------------------------
    tblSheets = Array("MFI", "JA", "DF")
    ReDim Preserve Arr(1 To UBound(tblSheets) + 1, 1 To 2)
    For I = LBound(tblSheets) To UBound(tblSheets)
        wsName = tblSheets(I)
        Set rngPT = wb.Worksheets(wsName).Cells(1).CurrentRegion
        rngPTAddress = rngPT.Address _
                       (ReferenceStyle:=xlR1C1, _
                        RowAbsolute:=True, ColumnAbsolute:=True)
        fullAddress = wsName & "!" & rngPTAddress
        Arr(I + 1, 1) = fullAddress
        Arr(I + 1, 2) = tblSheets(I)
    Next I
    '---------------------------------------------------------------
    Set PTCache = wb.PivotCaches.Add _
                  (SourceType:=xlConsolidation, _
                   SourceData:=Arr)
    Set wsPT = wb.Worksheets.Add
    wsPT.Name = "TCD"
    Set PT = PTCache.CreatePivotTable _
             (TableDestination:=wsPT.Cells(1), _
              TableName:="PT_1")
    '---------------------------------------------------------------
    With PT
        .ManualUpdate = True
        For Each pf In .PivotFields
            Select Case pf.Name
                Case "Colonne", "Columna"   'etc...
                    pf.Orientation = xlRowField
                Case "Ligne", "Fila"    'etc...
                    pf.Orientation = xlColumnField
                Case "Valeur", "Valor"  ' etc...
                    '
                Case Else
                    pf.Orientation = xlHidden
            End Select
        Next pf
        .RowAxisLayout xlTabularRow
        .ColumnGrand = False
        .RowGrand = False
        .TableStyle2 = "PivotStyleMedium2"
        .ManualUpdate = False
    End With
    '---------------------------------------------------------------
    Erase Arr
    Set PT = Nothing
    Set PTCache = Nothing
    Set rngPT = Nothing
    Set wsPT = Nothing
    Set wb = Nothing

End Sub
 

Pièces jointes

  • xld - Création TCD multipage.xlsm
    71.2 KB · Affichages: 21

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 008
dernier inscrit
Ichaka