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

Contribuez Discussion :

Etiquettes de colonnes mutltilingues pour tableaux structurés


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 149
    Billets dans le blog
    53
    Par défaut Etiquettes de colonnes mutltilingues pour tableaux structurés
    La petite histoire
    En début de ce mois alors que je dispensais une formation VBA à quelques personnes d’une organisation internationale, j’ai été confronté à une question intéressante de l’une des participantes.
    La semaine précédente, je leur avais montré tout l’intérêt de quitter l’usage des listes de données classiques pour se tourner vers les tableaux structurés.
    Cette participante ayant suivi à la lettre mes conseils m’a donc interpellé ce jour-là pour me dire qu’il y avait un souci car les étiquettes de colonnes des tableaux qu’ils utilisaient précédemment s’adaptaient automatiquement à la langue de l’utilisateur grâce à une formule qui affichait les titres suivant le choix de la langue alors qu'avec les tableaux structurés il y avait un problème.
    En effet, il est impossible d’avoir des formules dans la ligne des titres d’un tableau structuré.
    J’ai promis une solution pour le lendemain et le soir qui a suivi cette formation j’ai programmé une petite procédure qui permet de visualiser les titres dans la langue sélectionnée par l’utilisateur et c'est cette procédure que je vous propose.

    Quelle astuce ai-je utilisé ?
    L’astuce consiste à utiliser le format personnalisé d’excel ce qui permet de conserver l’intégrité totale de la valeur présente dans la cellule
    Exemple :
    En A1, tapons lblName et ensuite allons dans le format de cellule personnalisé et tapons ;;; "Nom" après confirmation, nous pouvons visualiser Nom mais dans la cellule, nous avons bien lblName
    L’astuce ayant été trouvée, il suffisait de l’adapter en VBA

    Que faut-il faire pour traduire cela en VBA ?
    • construire une table de Mapping
    • une liste déroulante avec la liste des langues utilisées
    • une procédure qui modifiera la propriété NumberFormat de l’objet Range
    • une procédure événementielle qui invoquera la procédure

    Les outils
    Pour obtenir cela.

    Nom : NumberFormat.png
Affichages : 326
Taille : 24,0 Ko

    La ligne de titre du tableau structuré
    Nom : ListObject_HeaderRange.png
Affichages : 319
Taille : 12,2 Ko

    La table de Mapping
    Cette table nommée T_mapLanguages est présente dans la feuille dont le CodeName est shtParameter.
    Pour ajouter une nouvelle langue, il suffit d'ajouter une colonne en entrant en première ligne le code de la langue et ensuite d'y insérer la traduction correspondante.
    Attention : Pour que cette nouvelle langue soit prise en compte par la liste déroulante il y a lieu d'insérer cette colonne avant la dernière (EN)

    Nom : T_mapLanguages.png
Affichages : 452
Taille : 30,1 Ko

    La procédure TranslationLabel
    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
    Function TranslationLabel(TableToTranslate As ListObject, _
                              LanguageUsed As String, _
                              LookupTable As ListObject) As Boolean
      ' Author  : Philippe Tulliez http://magicoffice.be
     
      ' Arguments
      '   TableToTranslate  Table où se trouve les titres à traduire
      '   LanguageUsed      Langue utilisée
      '   LookupTable       Table de mappage (Clé + mots traduits par colonne de langue)
      '
      ' Déclaration
      Const Mask As String = ";;;""[NewLabel]"""
      Dim Cell As Range
      Dim CelLanguage As Range
      ' Translation
      With LookupTable
        For Each Cell In TableToTranslate.HeaderRowRange 'LookupTable.ListColumns(1)
          Set CelLanguage = .ListColumns(1).Range.Find(What:=Cell.Value, LookAt:=xlWhole)
          If Not CelLanguage Is Nothing Then
             Cell.NumberFormat = Replace(Mask, "[NewLabel]", CelLanguage.Cells(1, .ListColumns(LanguageUsed).Index))
          End If
        Next
      End With
      Set Cell = Nothing: Set CelLanguage = Nothing
    End Function
    La procédure événementielle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      If Target.Address(external:=True) = Range("pLanguage").Address(external:=True) Then
         mMultilingualManager.TranslationAll
      End If
    End Sub
    La procédure TranslationAll
    Cette procédure est appelée par la procédure événementielle Workbook_SheetChange.
    Elle parcoure toutes les feuilles du classeur (ThisWorkbook) et invoque la fonction TranslationLabel pour chaque tableaux structurés présents dans une feuille de ce classeur à l'exception de ceux qui seraient présents dans la feuille dont la propriété CodeName est shtParameter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TranslationAll()
      ' Procédure parcourant l'ensemble des ListObject du classeur pour y effectuer la traduction
      Dim oSht As Worksheet
      Dim oLst As ListObject
      For Each oSht In ThisWorkbook.Worksheets
        If oSht.ListObjects.Count And StrComp(oSht.CodeName, "shtParameter") Then
           For Each oLst In oSht.ListObjects
             TranslationLabel oLst, Range("pLanguage"), shtParameter.ListObjects("T_mapLanguages")
           Next
        End If
      Next
    End Sub
    Tutoriels à lire pour en savoir plus


    Le fichier exemple à télécharger
    Fichiers attachés Fichiers attachés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Yeah!! Bravo Philippe.

    C'est Noël sur DVP! Quatre contributions en quelques jours qui, en plus, tournent autour des tableaux structurés qui sont incontournables pour une utilisation professionnelle d'Excel et une programmation plus souple, plus sécurisée, pérenne et évolutive en VBA...

    Continue!! On en redemande
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 100
    Par défaut
    Salut

    Uff, génial ce truc. En plus le nom de la colonne ne change pas... du coup inutile de bricoler dans les macros pour faire la correspondance.

    Merci !!
    J'aime les forums de partage

    (Bon, il va falloir mettre les bouchées doubles!)
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [Tableaux] Structure PHP pour variable complexe
    Par winnie82 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2006, 13h53
  2. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 08h02
  3. Réponses: 1
    Dernier message: 09/02/2006, 11h03
  4. [Tableaux] structure C/C++
    Par pittacos dans le forum Langage
    Réponses: 4
    Dernier message: 21/12/2005, 17h55
  5. Réponses: 1
    Dernier message: 18/05/2005, 18h18

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