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

  1. #41
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    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...
    ---------------

  2. #42
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 761
    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 : 12 761
    Points : 28 619
    Points
    28 619
    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

  3. #43
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    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...
    ---------------

  4. #44
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    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 : 263
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

  5. #45
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Pour tester l'existence de la barre, plutôt que le on error, j'utilise une fonction. Ca évite de bloquer sur une pseudo-erreur, notamment en phase de test. Débuguer un code truffé de On Error inutiles est agaçant au plus haut point.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CommandBarExists("test") Then CommandBars("Test").Delete
    "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...
    ---------------

  6. #46
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 761
    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 : 12 761
    Points : 28 619
    Points
    28 619
    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

  7. #47
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    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...
    ---------------

  8. #48
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    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

  9. #49
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Comme je l'ai dit, ce que j'ai illustré ici, c'est le mécanisme que l'on met en place, et je n'ai pas mis ici le module que j'utilise pour mes développements profesionnels (faut pas pousser bobonne , peut-être le ferai-je dans un tuto sur les applis Excel multilingues). Normalement, le cas que tu cites ne devrait pas exister, et cela procède des tests que l'on effectue avant de livrer l'appli avec la nouvelle langue. Dans Excel, il est facile de vérifier que le texte existe pour chaque langue avant mise en prod.

    Pour le reste, à chacun d'adapter ce qu'il souhaite pour ses besoins propres. Je me répète, mais ce qui m'importe ici, c'est qu'une architecture réfléchie soit mise en place selon les standards de la programmation, de manière à ce l'appli soit stable, facile à maintenir, "versionnalisable" dans une nouvelle langue à moindre coût, avec une architecture qui n'est pas déroutante pour un programmeur qui devrait "mettre son nez dedans".
    "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. #50
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    je ne comprends pas bien l'utilité de ta fonction FindControlByCaption
    ben c'est simple
    d'une part parce que cette fonction n'existe pas en natif
    et de deux quand on construit la bar

    exemple schéma 1

    barre
    bouton1 type msocontrolbutton fil 1 de la barre
    popup1 type msocontrolpopup (type(10) fils 2 de la barre
    bouton2 type msocontrolbutton fil 3 de la barre

    maintenant je voudrais alimenter en bouton le popup 1 comment je fait dans la boucle je suis a "barre"

    et findcontrol natif ne fonctionne pas par la caption et mes bouton ne peuvent pas avoir de ID donc walouh je ne peux plus le récupérer

    et meme si je met dans l'ordre

    exemple schéma 2
    barre
    bouton1 type msocontrolbutton fil 1 de la barre
    popup1 type msocontrolpopup (type(10) fils 2 de la barre
    boutonpop1 type msocontrolbutton fil 1 de la popup1
    boutonpop2 type msocontrolbutton fil 2 de la popup1
    boutonpop3 type msocontrolbutton fil 3 de la popup1

    et maintenant comment je fait pour ajouter mon bouton2 a la barre je suis a popup1 dans la boucle

    bouton2 type msocontrolbutton fil 3 de la barre ---> il faut bien revenir a commandbar dans la boucle



    c'est bien pour ca que dans mon tableau et le tien maintenant il y a une colonne parent
    et ma fonction sert justement a ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    or 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
    tout simplement par ce que l'object msocontrolxxxx n'a pas de membre ".Parent" ca n'existe pas
    et comme je l'ai dis commandbars.findcontrol est limité au Id,tag,visble)
    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

  11. #51
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    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...
    ---------------

  12. #52
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    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

  13. #53
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    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 : 187
Taille : 11,2 Ko

    Nom : 2019-05-24_184048.png
Affichages : 212
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...
    ---------------

  14. #54
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    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 : 208
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

  15. #55
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    ah ! tu vois tu a ajouter une fonction pour l'add control selon parent ou child
    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

  16. #56
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re
    ah ! tu vois tu a ajouter une fonction pour l'add control selon parent ou child
    Ce n'était pas obligatoire, et ça ne crée pas de la récursivité pour la cause. La fonction permet d'éviter soit la redondance de code pour l'ajout des propriétés, soit de passer par la création d'une nouvelle variable pour récupérer le contrôle qui vient d'être créé. Perso, je trouve qu'au niveau du code, la fonction qui fait "ce qu'elle doit faire" est une meilleure idée. J'insiste souvent sur le fait qu'une fonction doit avoir une seule responsabilité.

    Voici un code avec une variable qui stocke le contrôle qui vient d'être créé, ce qui évite la fonction. A part être moins lisible, il n'y a pas de gain. Cela dit, je ne suis pas contre une récursive...

    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
    Sub CreateCommandbar()
      Dim cb As CommandBar
      Dim Ctrl As CommandBarControl
      Dim PopUp As CommandBarPopup
      Dim CreatedControl As Object
      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 = Parent.Controls.Add(Cell(1, 4).Value)
          Set Parent = PopUp
          Set CreatedControl = PopUp
        Else
          Set Ctrl = Parent.Controls.Add(Cell(1, 4).Value)
          Set CreatedControl = Ctrl
        End If
        With CreatedControl
          .Caption = Cell(1, 2).Value
          .OnAction = Cell(1, 3).Value
        End With
      Next
    End Sub
    Mais soyons bien clairs ici, Patrick. Je ne dis pas que tu as tort et que j'ai raison. Les choix ergonomiques, c'est affaire personnelle. Perso, j'essaierais d'abord de voir si je ne peux pas regrouper sur deux niveaux avec des BeginGroup. Mais c'est vraiment chacun ses choix. Autant je suis assez rigide sur les questions d'architecture, autant c'est vraiment affaire de goûts personnels pour ce qui est de l'ergonomie
    "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. #57
    Responsable
    Office & Excel


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 926
    Points
    55 926
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re
    je suis allé un peu plus loin Pierre[...]
    Chouette. Ca valait la peine qu'on insiste un peu
    "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...
    ---------------

  18. #58
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    Chouette. Ca valait la peine qu'on insiste un peu sur le coup
    oui ton exemple de base m'a éclairé sur ce que tu disais
    j'ai gardé quand même ma fonction récursive
    ta dernière version ne peut aller au delà de 3 étage + Child je crois

    bien que je te l'accorde 3 c'est déjà pas mal

    pour info j'ai mal décrit mes fonction récursive
    en fait j'en ai 2

    dans ton fichier que j'ai modifié je me sert de "FindControlByCaption" en injectant la barre et le texte de la caption du parent recherché il est connu puisque que je le prend dans le tableau en colonne parent

    mais j'ai fait aussi une fonction "FindParentControlByChildCaption" et la pareille j'injecte la barre mais le texte d'un control dont je recherche le parent
    mes menus sont dynamiques jusqu'au bout

    je peux avoir a modifier voir ajouter un control en dehors de la construction dans un de mes classeurs
    il me faut donc la fonction qui cherche avec la caption d'un Child pour choper le parent
    tout fonctionnait très bien déjà avec mon model de création par les array codés

    en analysant je suis sur que l'on peut en faire une qui fait les deux vu que l'une est basé sur l'autre a la base

    les deux sont récursives

    peut etre peut-on les améliorer?
    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
     
    '************************************************************************************************************************************************
     
    'Fonction de recherche d'un control par la caption(recursive)
    'scrute toute l'arborescence et s'arrete des que le control est trouvé
    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
            Next
        End If
        Set FindControlByCaption = mycontrol
    End Function
     
    '************************************************************************************************************************************************
     
    'fonction de recherche du parent par la caption d'un control(child)
    'scrute toute l'arborescence et s'arrete des que le control est trouvé
    'exemple recherche le parent du bouton 14 dans la barre "test"
    'set lepere=FindParentControlByChildCaption(commandbars("test"),"bouton14",true)
     
    Private Function FindParentControlByChildCaption(Lparent As Object, Lcaption As String) As Object
        Static par As Object, Ctrl As CommandBarControl
        If par Is Nothing Then
            For Each Ctrl In Lparent.Controls
                If Ctrl.Caption = Lcaption Then Set par = Lparent: Exit For
                If Ctrl.Type = 10 Then FindParentControlByChildCaption Ctrl, Lcaption
            Next
        End If
        Set FindParentControlByChildCaption = par
    End Function
    '************************************************************************************************************************************************
    je suis en train d'en faire une pour les index pour faire des insertbefore hors construction mais la c'est pour le fun
    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

  19. #59
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut du nouveau avec le commandbarcreator
    du nouveau avec le commandbarcreator

    regarde pierre

    et vise et versa

    Nom : demo2.gif
Affichages : 246
Taille : 642,3 Ko
    voila qui sera bien pratique pour la maintenance ou modif
    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