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 :

Création d'une commandbar multilingue


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    Dans du multilingue, je vois mal comment tu peux rechercher un bouton sur son caption, puisqu'il change...

    Je ne suis pas convaincu qu'un menu contextuel à plus de deux niveaux ait du sens, mais pour le fun, en voici un à trois niveaux. Celui qui m'oblige à travailler avec ce genre d'ergonomie se prend mon clavier dans la gu... et mon laptop dans le c... Je viens de réaliser quelques clics droits dans Excel et Word et je n'ai vu aucun menu contextuel à plus de deux niveaux.

    Si vraiment il te faut plus de niveaux, alors, d'abord réfléchir beaucoup et longtemps pour être sûr et certain qu'il faut d'autres niveaux, puis se reposer la question jusqu'à changer d'opinion. Un menu contextuel à plus de deux niveaux, je ne me souviens pas avoir vu cela depuis très très très longtemps. Et quand bien même on l'imaginerait (trois niveaux, car plus, ça n'a vraiment aucun sens), on pourrait s'y retrouver grâce aux index, même si une récursive aurait alors plus de sens (et au moins sur les index plutôt que sur les caption). Mettre en place du récursif sur des captions qui peuvent en plus changer, à nouveau ça peut être fun, mais sur les plans de l'utilité et de l'ergonomie...



    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
    Option Explicit
     
    Sub ShowUsf()
      CreateCommandbar
      UserForm1.Show
    End Sub
     
    Sub CreateCommandbar()
      Dim cb As CommandBar
      Dim Ctrl As CommandBarControl
      Dim PopUp As CommandBarPopup
      Dim Parent As Object
      Dim Cell As Range
      Dim Caption As String
     
      If CommandBarExists("test") Then CommandBars("Test").Delete
      Set cb = CommandBars.Add("Test", msoBarPopup)
      For Each Cell In Range("t_Controls[id]")
        Caption = Cell(1, 2).Value
        If Cell(1, 5).Value = "" Then Set Parent = cb
        If Cell(1, 4).Value = msoControlPopup Then
          Set PopUp = CreateControl(Cell, Parent)
          Set Parent = PopUp
        Else
          Set Ctrl = CreateControl(Cell, Parent)
        End If
      Next
    End Sub
     
    Function CreateControl(Cell As Range, Parent As Object) As Object
      Set CreateControl = Parent.Controls.Add(Cell(1, 4).Value)
      With CreateControl
        .Caption = Cell(1, 2).Value
        .OnAction = Cell(1, 3).Value
      End With
     
    End Function
     
    Function CommandBarExists(Name As String) As Boolean
      Dim Counter As Long
     
      Counter = 1
      Do While Counter <= CommandBars.Count And Not CommandBarExists
        If StrComp(Name, CommandBars(Counter).Name, vbTextCompare) = 0 Then CommandBarExists = True
        Counter = Counter + 1
      Loop
    End Function

    Nom : 2019-05-24_183952.png
Affichages : 222
Taille : 11,2 Ko

    Nom : 2019-05-24_184048.png
Affichages : 247
Taille : 7,0 Ko


    Honnêtement, qui a envie de travailler avec des menus contextuels pareils?
    "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...
    ---------------

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je suis allé un peu plus loin Pierre
    j'ai ajouté
    possibilité d'ajouter des boutons non presents dans le tableau 1
    enabled
    begingroup
    utilisation de control natif build et rebuild
    les étages on a pas de limite
    Nom : demo2.gif
Affichages : 242
Taille : 178,6 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    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
    Salut.

    Peut-être te compliques-tu la vie? A quoi sert réellement le fait de récupérer des headers entre deux headers? A quoi sert de récupérer des headers non contigus? A quoi sert de vouloir travailler sur des colonnes complètes? Sauf à s'amuser, ça ne sert pas à grand chose dans l'utilisation de tables de données, d'où la relative complexité de mettre cela en oeuvre. Si ça servait vraiment à quelque chose, il y a fort à parier qu'Excel aurait simplifié la manip.

    D'une façon générale, les tables de données, utilisées à bon escient ( => pour stocker des "fiches" de données), simplifient énormément la vie, tant en Excel qu'en VBA, et la manipulation des références structurées est simple et là aussi, le VBA y gagne en lisibilité et en simplicité. Il faut bien sûr pour cela que les tableaux soient bien construits
    "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...
    ---------------

  4. #4
    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
    Si tu as "un truc de fou" à formuler, c'est probablement que ton tableau n'est pas construit correctement (critique technique, pas d'attaque personnelle dans mon propos)...

    A nouveau, montre ton tableau et explique ce que tu souhaites réaliser...

    Normalement, avec une table de données, on a besoin d'une cellule particulière (RECHERCHEV, INDEX-EQUIV, ...), une colonne particulière et, en Excel en tout cas, beaucoup plus rarement d'une ligne entière de la table. Ca n'a pas d'intérêt de devoir travailler sur un bloc de lignes ou de colonnes. La table de données n'est pas faite pour cela.

    En VBA, on peut travailler sur une ligne entière en la considérant comme un "recordset" de la table de données. Mais là aussi, les outils existants, éventuellement améliorés par une couche d'abstraction, sont suffisants. Mon prochain tuto illustrera la mise en place de cette couche d'abstraction.
    "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...
    ---------------

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    je veux pouvoir les récupérer header inclus ou pas pour les transférer

    bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test158()
    'déterminer un plage non contigüe dans le tableau header ou pas avec la fonction
        Set maplage = NoContigRange("Tableau2", Array("fr", "it", "de"), False)    'true ou false pour le headers inclus)
        MsgBox maplage.Address
    End Sub
    '
    Function NoContigRange(Tname, arr, Optional head As Boolean = False)
       'construction de l'adresse  non contigüe
         For I = LBound(arr) To UBound(arr)
            If head Then arr(I) = "[#ALL],[" & arr(I) & "]]" Else arr(I) = "[" & arr(I) & "]]"
            arr(I) = Tname & "[" & arr(I)
        Next
        Set NoContigRange = Range(Join(arr, ","))
    End Function
    j'aurais pu les unir directement avec union au lieu de travailler en string jusqu'au bout
    oui je sais que ca vous plait pas
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    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
    A nouveau, je ne comprends pas bien le besoin de copier certaines colonnes entières du tableau structuré. Ca ne donnera pas un tableau structuré à l'arrivée, et ça relève d'un problème de conception.

    Si je dois extraire certaines colonnes d'un tableau structuré, c'est pour les remettre dans les colonnes d'un autre tableau lui aussi structuré. Donc normalement, tes deux tableaux préexistent, et c'est juste un copier/coller des données de certaines colonnes du tableau source vers les colonnes du tableau cible. Ca ne nécessite pas de connaître les headers, de choisir des colonnes non contiguës et autres manipulations bizarres, si l'on s'en tient à la finalité d'une table de données.
    "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...
    ---------------

  7. #7
    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
    Je n'ai pas tout suivi, mais si tu les mets dans l'ordre de création parent1, enfant1_P1, enfant2_P1, parent2, enfant1_P2, enfant2_P2, enfant3_P2, ... tu n'as pas besoin de devoir jouer à retrouver qui est qui, surtout dans la mesure où un menu déroulant à plus de deux niveaux, ça craint côté ergonomie...

    En tout cas, perso, je n'ai jamais eu besoin d'une fonction comme celle-là dans mes applis
    "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...
    ---------------

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    ben essaie de te faire une popup avec arborescence a plusieurs étage en une seule boucle avec ton tableau tu verra
    si tu y arrive je mange mon clavier

    dans ton fichier en exemple de départ il n'y a pas d'étage (tous sont fils de la barre rm1,rm2,rm3,etc...)

    pour une fois je suis sur a 100% de ce que je dis
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    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
    Ca ne change rien au fond du problème. Que le commandbar soit un popup ou non n'altère pas la façon dont la structure doit être créée:
    • Ca n'a pas de sens de requérir Google Translate à chaque création;
    • Ca n'a pas de sens d'insérer des colonnes alors qu'une bonne architecture permet de mettre en place un système qui ne demande pas d'insertion de colonnes;
    • Un xml ne palliera pas une mauvaise conception de fichier;
    • Un xml contenant des noeuds avec uniquement des attributs est un non-sens, même s'il est reconnu bien formé, les attributs ne servant pas à stocker des valeurs mais à différencier les noeuds. Donc là aussi, il y a un problème d'architecture;
    • Un xml n'est pas nécessaire avec Excel puisque tu peux stocker les données dans une table Excel ( a priori du xlam applicatif) pour gagner en portabilité;
    • Dans le cadre de la création d'un commanbar, ça n'a aucun sens de gérer l'évènement Change d'une feuille;
    • ...



    Ces considérations sont évoquées dans le cadre d'un développement qualifié de professionnel. Libre à chacun de s'amuser à inventer des solutions ésotériques pour faire joujou avec google/Translate et inventer de nouvelles façons de faire, mais sur un plan professionnel, les modèles de conception d'une appli multilingue ont fait leurs preuves, ont été argumentés et documentés quant à leur pertinence. Vouloir réinventer la roue peut éventuellement être louable, mais il serait alors intéressant d'argumenter sur le pourquoi du comment et de dire en quoi le modèle que tu proposes est meilleur que ceux communément admis et mis en place. Sans cela, on reste dans le bricolage sans finalité professionnelle.

    A nouveau, pour que l'on me comprenne bien, je ne démolis pas la personne ici en critiquant les techniques mises en place, je défends une façon professionnelle d'aborder le problème de l'application multilingue et le caractère professionnel des solutions proposées en remplacement de la tienne qui, quoique tu puisses en penser, reste du domaine du bricolage.
    "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...
    ---------------

  10. #10
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ca n'a pas de sens de requérir Google Translate à chaque création;
    Je trouve aussi.
    Imaginons que l'on n'ait pas d'accès internet au moment où l'on a besoin de l'application. Super
    Ce n'est effectivement pas professionnel
    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

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    OK
    pour que les choses soient claires entre nous

    le projet:
    creéer un tableau

    les entêtes parlent d'elle même :
    parent|type|fr|en|it|de|id ou faceID|OnAction|beginGroup|enabled
    alors les langues au départ n'étaient pas prévues mais bon ca mange pas de pain
    pour la traduction translate ou autre on s'en fou (pour le moment c'est translate)
    alors pour le moment il y a 4 langues et je pense que le tableau doit être modifiable car demain je veux ajouter une langue le russe par exemple il faut bien l'ajouter quelque part
    dans le principe que j'ai mis en place en corrélation avec le code de l'évènement change fait que je peux ajouter autant de langue avant "de" sans changer un seul caractere du code de traduction


    pour la création du popup la lecture se fera par ligne et la caption en fonction de la langue choisie comme je le fait déjà avec mes array codé en dur qui de déplaisent tant

    si pour l'organisation du tableau tu pense que c'est pas bon, il faut être plus précis, je suis dur de la comprenette

    il faut bien comprendre que ce sont des menu perso qui seront créés et donc des captions qui seront tout sauf des mots classiques ou génériques, même si il y en aura quelques uns

    parti de la tu comprends bien qu' il me faut un traducteur quasi instantané qui me donne les captions dans toutes les colonnes langue

    on en ai donc pour le moment a l'organisation ou structure du tableau qui selon toi n'est pas bon

    après encore une fois d'après l'évènement que j'ai codé, je peux avoir un tableau avec seulement FR et EN et avoir un bouton pour ajouter une langue temporairement si tu veux
    la encore mon code événement et translate ne changera pas a part "de"/"en" pour la fin
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    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
    Je reviendrai sur l'utilité de créer un tableau en VBA en fin de post. Je reviendrai aussi sur l'inutilité totale de vouloir créer une nouvelle langue "à chaud" avec Google Translate.


    Tu me parles de tes entêtes FR|IT|... Mais elles ne servent à rien puisque ce n'est pas là que tu dois mettre tes textes. Tu me parles de devoir ajouter une colonne pour ajouter une langue alors que j'ai illustré comment l'ajout d'une langue doit se passer... Le fait que ce soit des menus perso ne change rien au fait qu'ils ne doivent pas être traduits à la volée, et la "complexité" du texte n'a rien à voir avec cela.

    Je joins un fichier qui illustre comment on met cela en place.

    Ce fichier contient trois tableaux (Langues, Textes, Boutons du menu contextuel). Au départ, il contient 2 langues et les traductions pour ces deux langues. Dans le tableau des textes, on voit qu'il y a les textes pour les boutons, mais aussi pour les contrôles du userform ainsi que pour le caption du userform lui-même. Est présent aussi le texte du message qui sera affiché après le déchargement du userform. Ceci illustre le fait que l'on a un seul tableau pour les traductions, et que sa structure n'est pas modifiée par l'ajout des textes d'une nouvelle langue. Il suffira d'ajouter les textes à la suite du tableau, avec les bons ID et le code de langue choisi. Il faudra aussi, bien sûr, ajouter le code de la langue dans le tableau des langues*.

    Nom : 2019-05-24_135232.png
Affichages : 226
Taille : 22,7 Ko

    Le code est en deux parties, un module standard et le module du userform. On voit bien qu'à aucun moment dans le code il n'est question de modifier un tableau. La structure est en place une fois pour toutes.

    Module standard appelé Languages
    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
    Option Explicit
     
    Sub ShowUsf()
      Dim Language As String
     
      With usfMultilanguages
        .cboLanguage.List = Range("t_languages[Language]").Value
        .Show
        Language = .cboLanguage.Value
      End With
      Unload usfMultilanguages
      MsgBox getText("AlertMsg", Language)
    End Sub
     
    Sub CreateCommandbar(Language As String)
      Dim cb As CommandBar
      Dim Ctrl As CommandBarControl
      Dim Cell As Range
      Dim Caption As String
     
      CommandBars("Test").Delete
      Set cb = CommandBars.Add("Test", msoBarPopup)
      For Each Cell In Range("t_Controls[id]")
        Set Ctrl = cb.Controls.Add(msoControlButton)
        With Ctrl
          .Caption = getText(Cell.Value, Language)
          .OnAction = Cell(1, 3).Value
        End With
      Next
    End Sub
     
     
    Function getText(ByVal ID As String, Language As String) As String
      Dim Formula As String
     
      Formula = "index(t_texts[Text],match(1,(t_texts[id]=""{id}"")*(t_texts[language]=""{language}""),0))"
      Formula = Replace(Formula, "{id}", ID, , , vbTextCompare)
      Formula = Replace(Formula, "{language}", Language, , , vbTextCompare)
      getText = Evaluate(Formula)
    End Function

    Module du userform
    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
    Option Explicit
     
    Private Sub btnValidate_Click()
      Me.Hide
    End Sub
     
    Private Sub cboLanguage_Change()
      AdaptUsf
    End Sub
     
    Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
      If Button = 2 Then Application.CommandBars("Test").ShowPopup
    End Sub
     
    Sub AdaptUsf()
      Dim Captions
      Dim Counter As Long
     
      Languages.CreateCommandbar cboLanguage.Value
      Captions = VBA.Array("lblLanguage", "btnValidate", "usfMultiLanguages")
      For Counter = 0 To UBound(Captions)
        If Captions(Counter) Like "usf*" Then
          usfMultilanguages.Caption = Languages.getText(Captions(Counter), cboLanguage.Value)
        Else
          Me.Controls(Captions(Counter)).Caption = Languages.getText(Captions(Counter), cboLanguage.Value)
        End If
      Next
    End Sub
    Je précise ici que l'on pourrait boucler sur les contrôles du userform plutôt que de créer l'array. Dans une vraie appli, j'aurais procédé ainsi, avec un test sur le retour de Validate en cas de texte non trouvé pour un contrôle. Cette procédure devrait normalement être déplacée dans une procédure générique de la couche de présentation. J'en profite pour dire aussi qu'il faut normalement tester que l'on a choisi une langue, etc etc. J'illustre juste ici la mécanique à mettre en place pour du multilingue.

    Au départ, le useform est affiché par défaut en langue française. En choisissant une langue dans le combobox, on peut faire varier la langue affichée ainsi que le menu contextuel (clic droit dans le userform). Dans le fichier joint, il suffit de lancer la procédure Languages.ShowUsf et de tester le userform avec les deux langues présentes. Dès la langue choisie, le userform est adapté pour afficher les textes dans cette langue. Après le choix d'une langue, un clic droit dans le userform affichera le menu contextuel dans la langue choisie. Après avoir cliqué sur le bouton, le userform est détruit et le message de bonne fin apparaît dans la langue choisie.

    Langue: français
    Nom : 2019-05-24_133643.png
Affichages : 206
Taille : 4,2 Ko

    Langue: anglais, les textes et le menu contextuel ont été modifiés
    Nom : 2019-05-24_133653.png
Affichages : 205
Taille : 4,3 Ko



    Après, pour tester une autre langue (j'ai choisi l'italien), il faut réaliser les manips suivantes:
    • Ajouter IT dans le tableau des langues;
    • Ajouter les textes en italien (pour faciliter le travail ici, il suffit de couper le bloc des textes qui se trouve un peu à droite des tableaux et venir le coller juste en dessous du dernier texte ligne A18).


    Nom : 2019-05-24_135949.png
Affichages : 223
Taille : 31,6 Ko

    On peut relancer Languages.ShowUsf pour voir que la troisième langue est ajoutée et opérationnelle. On voit bien que la "complexité" des textes ne pose aucun problème et qu'il ne s'agit pas ici de traduire uniquement des "ouvrir" et "fermer", mais que l'on peut étendre la mécanique à tout texte devant être affiché à l'utilisateur (à part les entêtes des colonnes de tableau, sous peine de devoir alourdir le code VBA qui manipulerait des références structurées, mais je pense qu'il faut raison garder).


    * J'ai préféré ajouter un tableau pour les langues de manière à faciliter l'alimentation du combobox du userform. Je sais que l'on peut travailler avec un dictionary ou autre brol, mais dans une appli multilingue, on a besoin de la liste des langues disponibles à plusieurs endroits du code, donc autant créer la langue dans le tableau. Attention aussi que l'appli n'est pas sécurisée, ce n'est pas le but de la démo (il faut obligatoirement choisir une langue dans le combo, par exemple. Mettre une alerte n'est pas coûteux mais je ne l'ai pas mis en place ici, ce n'est pas le sujet du débat).


    Pour ce qui est de créer un tableau en VBA ou d'en modifier la structure, ce n'est normalement utile qu'en cas de maintenance de l'application , par exemple parce que les fichiers manipulés par le XLAM doivent être modifiés (par macro lors du déploiement de la mise à jour sur plusieurs postes utilisant l'appli). On pourrait aussi en avoir besoin pour créer une table temporaire volatile pour manipuler des données. Je suis toutefois très dubitatif sur le fait que l'on ne puisse pas prévoir le coup, et donc la structure des tables temporaires et les intégrer dans des feuilles du xlam, voire du fichier qui y est lié. Quoi qu'il en soit, il ne sera que rarement utile de devoir sélectionner des colonnes non contiguës. A nouveau, je ne vois pas de cas réel où ce genre de manip a une utilité. Quant à joindre les valeurs de plusieurs colonnes non contiguës avec Join, j'attends de voir l'utilité de la chose dans un environnement réel et professionnel alors qu'Excel possède tous les outils pour réaliser cela facilement. Et encore une fois, cela se réalise en général dans un environnement prévisible.


    Pour ce qui est de vouloir ajouter du russe ou n'importe quelle autre langue "à chaud" avec Google Translate, ça n'a aucune pertinence. Si l'on souhaite mettre l'appli à disposition dans une nouvelle langue, on procède comme je l'ai expliqué plus haut pour l'italien: on ajoute en dur le code de la langue dans le tableau des langues, et on ajoute les textes dans le tableau des textes en reprenant les ID par copier-coller et en spécifiant le nouveau code de langue. Puis on teste pour vérifier que l'on n'a pas fait d'erreur. Après cela, on déploie le nouveau xlam. Compter sur Google Translate pour réaliser cela "à chaud" et sans vérifications, désolé, mais cela relève pour moi de l'amateurisme.
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    je viens de télécharger ton fichier
    j'ai testé
    au passage a la première création même pour les autre d'ailleurs

    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
    Sub CreateCommandbar(Language As String)
      Dim cb As CommandBar
      Dim Ctrl As CommandBarControl
      Dim Cell As Range
      Dim Caption As String
      
      On Error Resume Next
      CommandBars("Test").Delete
      On Error GoTo 0
      Set cb = CommandBars.Add("Test", msoBarPopup)
      For Each Cell In Range("t_Controls[id]")
        Set Ctrl = cb.Controls.Add(msoControlButton)
        With Ctrl
          .Caption = getText(Cell.Value, Language)
          .OnAction = Cell(1, 3).Value
        End With
      Next
    End Sub
    ensuite

    on a ici deux langues et en plus tu n'a pas prévu de hiérarchie a plusieurs étages barre,bouton,submenu,bouton,bouton2, etc.......

    et cela avec ton system de 2 tableaux, ca va être une torture a mettre en place ,je crois que c'est cela que tu n'a pas compris aussi dans mon tableau
    je continu d'étudier ton fichier je reviens plus tard
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    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
    Citation Envoyé par patricktoulon Voir le message
    re
    je viens de télécharger ton fichier
    j'ai testé
    au passage a la première création même pour les autre d'ailleurs [...]
    Au passage, j'ai clairement dit dans mon message que je ne m'étais pas attardé sur la gestion d'erreurs, car ce n'est pas le sujet de la discussion. Donc ce sera sympa de ne pas s'arrêter là-dessus, surtout qu'il y aurait à redire sur ta gestion d'erreurs, car la gestion d'erreurs n'est pas prévue pour les erreurs prévisibles, or il est prévisible que la barre n'existe pas. On devrait donc tester son existence autrement. De plus, normalement, la barre devrait être créée de façon temporaire et donc mourir à la fermeture du xlam. Je ne fais pas un cours ici sur la création d'une commandbar, mais sur la façon de gérer le multilinguisme lors de la conception d'une application Excel. De la même façon, je n'ai pas géré le fait de ne pas choisir une langue dans le combo, ce n'est à nouveau pas le sujet.

    La même mécanique serait mise en place pour modifier à chaud la langue du ruban de l'application. Il suffira, sur le callback des contrôles du ruban, d'aller chercher le texte dans la bonne version linguistique grâce à la fonction générique Languages.GetText...

    Pour ce qui est du multi-niveaux, il faut adapter le tableau des boutons du userform, tenir compte du fait que si tu as plusieurs menus déroulants à créer, il faut les intégrer dans le même tableau. Ici, je ne livre pas du clé sur porte, à nouveau, j'illustre une architecture générique à mettre en place, et à adapter notamment pour les cas d'un menu contextuel à plusieurs niveaux. Mais la mécanique reste rigoureusement la même. On sépare les données dans des tableaux qui ne gèrent qu'une chose, or dans ton tableau des contrôles, tu gères deux choses, les contrôles et les langues. Ce n'est pas comme cela qu'on fait et j'illustre justement qu'en séparant les textes dans un tableau à part, on peut généraliser le multilinguisme à autre chose (textes des messages, textes des captions, des infobulles, de la barre d'état, des entêtes et pieds de page pour l'impression, etc, etc).

    Pour ce qui est de la torture à mettre cela en place, je ne vois même pas où est le problème. A nouveau, j'illustre ici la mécanique du multilinguisme (la seule valable selon moi. En tout cas, c'est la seule que j'ai rencontré dans les nombreuses applis multilingues que j'ai eu l'occasion de voir, que ce soit en php/html, en Access, pour des applis Androïd ou C#). Bien évidemment, ces applis (Access, C#, Androïd et php/html) n'utilisent pas Excel, mais l'architecture est la même: une table ou fichier pour les contrôles, une table ou fichier pour les textes, et quelques fonctions génériques pour récupérer facilement le texte d'un "truc" dont on passe l'ID et la langue choisie.

    Ici en Excel, l'ajout de listes déroulantes pour les ID et la langue dans le tableau t_Texts rend les opérations d'ajout très simples à réaliser, surtout si tu donnes un fichier bien formé à la traductrice ou au traducteur. Une simple macro de quelques lignes intègre alors la nouvelle langue dans le jeu des deux tableaux (langue et textes). Il n'y a aucune torture là-dedans et c'est d'une simplicité enfantine. Toute la mécanique est générique et peut être copiée-collée, code compris, dans une nouvelle appli nécessitant le multilingue.
    "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...
    ---------------

  15. #15
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick, Pierre,
    On devrait donc tester son existence autrement. De plus, normalement, la barre devrait être créée de façon temporaire et donc mourir à la fermeture du xlam
    J'ajouterais qu'il faut en général prévoir également le non accès au menu si la fenêtre change car il est fort probable que les commandes ne peuvent être accessible en cas de changement de classeur à l'affichage.
    En tout les cas moi je le prévois.
    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

  16. #16
    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
    Salut Philippe


    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour Patrick, Pierre,

    J'ajouterais qu'il faut en général prévoir également le non accès au menu si la fenêtre change car il est fort probable que les commandes ne peuvent être accessible en cas de changement de classeur à l'affichage.
    En tout les cas moi je le prévois.
    D'accord avec toi sur le principe. Dans ce cas, la barre est explicitement appelée dans un userform précis, elle ne saurait donc normalement pas être utilisée sans code. Mais dans le cas où des boutons auraient été ajoutés à une barre existante, il faudrait tester la pertinence d'afficher les boutons "hors appli", soit au deactivate du classeur qui utiliser le xlam, soit dans la macro appelée par le bouton, qui testera que le classeur actif peut utiliser la commande. En général, on modifie le codename de ThisworkBook pour pouvoir tester le classeur actif.
    "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...
    ---------------

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    youpi!!!! j'ai trafiquer le tien
    jai ajouté rm0 fr et en d'office sans texte dans ton tableau1
    ajouté 2 colonne dans ton tableau constructeur
    modifier ta sub de creation
    et surtout ajouté ma fonction findcontrolbycaption (récursive)

    resultat

    Nom : demo2.gif
Affichages : 295
Taille : 699,6 Ko

    comme tu peux le voir je me suis pas arrêté la
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    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 173
    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 173
    Billets dans le blog
    53
    Par défaut
    Bonjour Pierre,
    En général, on modifie le ocdname de ThisworkBook pour pouvoir tester le classeur actif.
    C'est ce que je fais toujours.
    J'ai d'ailleurs écrit une contribution sur ce sujet titrée Propriété CodeName de l'objet Workbook
    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

  19. #19
    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
    Citation Envoyé par patricktoulon Voir le message
    youpi!!!! j'ai trafiquer le tien[...]
    Tu m'en vois sincèrement heureux. Je pense vraiment que si tu veux programmer du multilingue, c'est ce genre d'architecture que tu dois mettre en place... Cela dit, je ne comprends pas bien l'utilité de ta fonction FindControlByCaption

    Bon, ça ne règle pas tes manips sur les tables de données... Je suis en train de finaliser mon second tuto sur les tables de données pour les utiliser en vba... Ca te donnera peut-être des idées...
    "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...
    ---------------

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    pour ne pas avoir a chaque fois ajouter dans le tableau1 les deux version FR et EN d'une expression
    il faudrait que ta fonction renvoie un signal autre que plantage erreur si gettext ne reporte rien
    et cela de façon a que a la place de rm(x) dans le tableau constructeur on puisse y taper directement la caption voulue
    et peut être la possibilité de l'ajouter dans le tableau 1 avec un bouton ou autre par la suite (facultatif)
    comme ca on pourrait simplement taper les données captions sans passer par le tableau 1 comme au final je le fait dans mon model

    dans ton model

    j'ai modifier ton code comme suit
    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
    Option Explicit
    'Sub ShowUsf()
      'Dim Language As String
     
      'With usfMultilanguages
        '.cboLanguage.List = Range("t_languages[Language]").Value
        '.Show
       ' Language = .cboLanguage.Value
      'End With
      'Unload usfMultilanguages
      'MsgBox getText("AlertMsg", Language)
    'End Sub
    Sub testsansusf()
    Dim barre As CommandBar
    Set barre = CreateCommandbar("EN") 'si l 'argument"BarName" est omis son nom est "Bartest"
    barre.ShowPopup
    End Sub
    Function CreateCommandbar(Language As String, Optional BarName As String = "Bartest")
      Dim cb As CommandBar
      Dim Ctrl As CommandBarControl
      Dim Cell As Range
      Dim Caption As String
      Dim Typ As Integer
      Dim capt As String
      Dim p As String
      Dim par  As Object ' (as object) car ca peut etre la barre ou un msocontrolpopup
      On Error Resume Next
      CommandBars(BarName).Delete
      On Error GoTo 0
      Set cb = CommandBars.Add(BarName, msoBarPopup)
      For Each Cell In Range("t_Controls[id]")
        Typ = Cell.Offset(, 1).Value
        If Typ = 10 Then capt = Cell.Offset(, 5).Value Else capt = getText(Cell.Value, Language) 'caption sub
       p = Cell.Offset(, 4).Value
        If p = "barre" Then Set par = cb Else Set par = FindControlByCaption(cb, p, True)
     
        Set Ctrl = par.Controls.Add(Cell.Offset(, 1))
        With Ctrl
          .Caption = capt 'getText(Cell.Value, Language)
          .OnAction = Cell(1, 3).Value
        End With
      Next
    Set CreateCommandbar = cb
    End Function
     
    Function getText(ByVal ID As String, Language As String) As String
      Dim Formula As String
      Formula = "index(t_texts[Text],match(1,(t_texts[id]=""{id}"")*(t_texts[language]=""{language}""),0))"
      Formula = Replace(Formula, "{id}", ID, , , vbTextCompare)
      Formula = Replace(Formula, "{language}", Language, , , vbTextCompare)
      getText = Evaluate(Formula)
    End Function
     
    'fonction de recherche de control par le texte de la caption (récursive)
    'raze est optional et utile au depart quand est la  commandbar
    ' la variable mycontrol est en static pour ne pas la perdre dans le looping de la récursivité
    Private Function FindControlByCaption(Lparent As Variant, Lcaption As String, Optional Raze As Boolean = False) As CommandBarControl
        Static mycontrol As Object, Ctrl As CommandBarControl
        If Raze = True Then Set mycontrol = Nothing
        If mycontrol Is Nothing Then
            For Each Ctrl In Lparent.Controls
                If Ctrl.Caption = Lcaption Then Set mycontrol = Ctrl:
                If Ctrl.Type = 10 And mycontrol Is Nothing Then FindControlByCaption Ctrl, Lcaption '(récursivité pour  le  looping sur les descendants )
            Next
        End If
        Set FindControlByCaption = mycontrol
    End Function
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Ajouter une ligne dans un tableau
    Par kenru dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/10/2009, 16h10
  2. [DOM] ajouter une ligne a un tableau
    Par realkilla dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/02/2009, 16h51
  3. Réponses: 1
    Dernier message: 12/12/2008, 17h06
  4. Réponses: 9
    Dernier message: 15/06/2008, 11h13
  5. [vb6] Ajouter une ligne dans un tableau excel
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 13/06/2006, 16h41

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