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 :

besoins d'aide sur un petit exercice [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    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 besoins d'aide sur un petit exercice
    bonjours a tous
    j'ai entièrement revu mon module toolbar on UserForm
    je créé mes menu dynamiquement avec un array (methode plus simple que dans ma contrib )ca fonctionne tres bien

    je souhaiterais faire un peu de sport et rendre ma macro de creation de popup sportive si je puis m'exprimer ainsi

    voici un exemple d'array avec le quel je construit mes popup (j'ai indenté en saut de ligne pour que ca soit plus lisible)
    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
    Private Sub Label1_Click()
        arr = Array("barre,bout,Nouveau,2520,macro2,,1", _
                    "barre,bout,Ouvrir,23,macro2,,2", _
                    "barre,pop,Enregistrement,,,1,3", _
                    "Enregistrement,bout,enregistrer,3,macro3,,1", _
                    "Enregistrement,bout,enregistrer sous,3,macro4,,2", _
                    "barre,pop,Impression,,,1,4", _
                    "Impression,bout,Apercu,109,macro4,,1", _
                    "Impression,bout,Impression couleur,2521,macro4,1,2", _
                    "Impression,bout,imprimer en noir et blanc ,2521,macro4,,3", _
                    "barre,pop,Envoyer,,,1,5", _
                    "Envoyer,bout,Par TELECOPIE,888,sendtel,1,1", _
                    "Envoyer,bout,Par Mail Outlook,3738,sendoutlook,1,2", _
                    "Envoyer,bout,Par Mail CDO,2188,sendCDO,1,3")
        createbarre arr, Label1, Me
    End Sub
    comme vous pouvez le constater il est dans l'ordre tel que la popup sera construit

    Alors chaque ligne représente un control soit un bouton soit un submenu il y a 6 données a chaque fois
    exemple pour un bouton
    ("barre,bout,Nouveau,2520,macro2,,1"
    definition
    parent,type,caption ,icon,onaction,begingroup,index de position
    exemple pour un sub menu
    "barre,pop,Enregistrement,,,1,3"
    parent,type,caption,rien,rien,begingroup,index de position
    et bien je voudrais faire une macro qui me mettrait dans l'ordre au cas ou il serait dans le désordre selon les critères correspondant a index de position (le dernier élément de chaque ) et de son parent


    voila
    des idées ??
    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

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 183
    Points : 5 515
    Points
    5 515
    Par défaut
    Bonjour,
    une demande de précision: à quoi correspond la propriété begingroup, qui dans l'exemple présenté est parfois mentionnée, parfois pas?
    Cdt

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par patricktoulon Voir le message
    bonjours a tous


    et bien je voudrais faire une macro qui me mettrait dans l'ordre au cas ou il serait dans le désordre selon les critères correspondant a index de position (le dernier élément de chaque ) et de son parent


    voila
    des idées ??
    À première vue. Un dictionnaire avec le numéro d'ordre, et la description, ou le nom.

    P.S Les moins ne sont pas de moi. Mais si c'est une guerre de moins entre vous trois, cela me semble malheureusement bien futile.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  4. #4
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Ca n'a pas de sens de créer ta barre avec du code en dur, en plus avec des index qui ne sont pas cohérents. si tu codes en dur, ce qui est une très mauvaise chose, mets de suite tes items dans l'ordre.

    Le mieux à mon sens serait de créer un tableau dans Excel (tu tries alors comme tu le veux) et de boucler sur ce tableau bien trié pour créer ta barre et ses sous-menus au sein de boucles. Ca me semblerait bien plus léger que d'essayer de remettre le tout en ordre par la suite.
    "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 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
    Ca n'a pas de sens de créer ta barre avec du code en dur?????
    je code pas en dur
    la macro de création du popup créée selon l'array
    et il peut m'arriver d'ajouter un controls
    sauf que flémard au lieu de replacer le nouvel item dans l'array selon sa position souhaité je l'ajoute a la fin
    il s'ajoute quand même bien dans le bon parent mais sa position (index) n'est pas bonne car effectivement l'argument before lors du controls.add est faussé
    voir plante forcement quand l'item est un efant d'un parent pas encore créé ou que la donnée before de l'item est supérieur au nombre d'enfant déjà créé du parent
    c'est pour ca que j'aurais souhaité avoir la macro magique qui me le met dans l'ordre

    mais je pense avoir trouvé ma solution je testerais demain
    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
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Mettre le texte de tes boutons directement dans ton code, c'est coder en dur. Le fait que tu passes par un array ne change rien à cela, puisque tu charges ton array en dur.

    Si tu crées une table Excel avec ces données, tu peux la trier facilement (manuellement ou par code), puis ta macro itère sur les lignes de la table plutôt que sur l'array. Tu donnes ainsi plus de dynamique à ton code puisque tu peux faire évoluer ta barre sans toucher à ton code (pour la création, évidemment, puisqu'il faudra quand même que tu crées le code associé aux nouveaux boutons). De plus, comme tu as trié les données dans la table avant de les utiliser, tu n'as plus besoin de te tracasser des index dans ton code, puisque ta macro créera les boutons dans le bon ordre (Parent1, ses enfants dans l'ordre, Parent2, ses enfants dans l'ordre, ...).

    De surcroît, cette technique permettrait de créer une barre dont tu pourrais changer la langue au besoin, et tu pourrais ajouter toutes les langues que tu veux sans du tout toucher au code de la création de la barre, simplement en ne prenant de la table que les lignes de la langue souhaitée (après avoir modifié ta macro pour qu'elle prenne les bons caption en fonction de la langue).

    Nom : 2019-05-15_062110.png
Affichages : 195
Taille : 10,0 Ko
    "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
    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
    oui une feuille réservé a cela ca m'ennuie mais bon c'est vrai que se serait plus facile pour trier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    De surcroît, cette technique permettrait de créer une barre dont tu pourrais changer la langue au besoin, et tu pourrais ajouter toutes les langues que tu veux sans du tout toucher au code de la création de la barre
    attention en l'état mon code création ne change pas d'un yota c'est toujours le même


    code de creation
    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
     
    Option Explicit
    Sub createbarre(arr, Optional label As Object, Optional Usf As Object)
        Dim barre As CommandBar, i&, Ctrl, ct, ctsub, données, par, typectrl, pos, Index
        On Error Resume Next
        CommandBars("MenuUSF").Delete
        On Error GoTo 0
        Set barre = CommandBars.Add("MenuUSF", msoBarPopup, False, True)
        For i = LBound(arr) To UBound(arr)
            données = Split(arr(i), ",")
            If données(0) = "barre" Then
                Set par = barre
            Else
                Set par = FindControlByCaption(CommandBars("MenuUSF"), CStr(données(0)), True)
            End If
            Index = 1' il faudrait ici par.controls.count +1  au cas ou l'index 1 serait déjà utilisé par un autre 
            If UBound(données) >= 6 Then Index = données(6)
            typectrl = IIf(données(1) = "bout", msoControlButton, msoControlPopup)
            With par
                Set Ctrl = par.Controls.Add(typectrl, , , Index, True): Ctrl.Caption = données(2)
                If données(1) = "bout" Then Ctrl.FaceId = données(3): Ctrl.OnAction = données(4)
                If UBound(données) >= 5 Then
                    If données(5) = 1 Then Ctrl.BeginGroup = True
                End If
     
            End With
        Next
        If Not label Is Nothing And Not Usf Is Nothing Then    'si un control activX et userform a été injecté
            pos = position(label, Usf)
            CommandBars("MenuUSF").ShowPopup pos(1), pos(2)
        Else
            CommandBars("MenuUSF").ShowPopup
        End If
        CommandBars("MenuUSF").Delete
    End Sub
     
    'Fonction de recherche de control par la caption (récursive!!)
    Function FindControlByCaption(Lparent As Variant, Lcaption As String, Optional raze As Boolean = False) As CommandBarControl
        Static mycontrol As Object
        Dim Ctrl
        If raze = True Then Set mycontrol = Nothing
        For Each Ctrl In Lparent.Controls
            If Ctrl.Caption = Lcaption Then Set mycontrol = Ctrl:
            If Ctrl.Type = 10 Then FindControlByCaption Ctrl, Lcaption
            Set FindControlByCaption = mycontrol
        Next
    End Function
    '
    Function position(label As Object, Usf)
        Dim PPX#, HcapTion#, LcaDre#, tbl(1 To 2)
        With ActiveWindow.ActivePane: PPX = (.PointsToScreenPixelsX(Cells.Width) - .PointsToScreenPixelsX(0)) / Cells.Width: End With
        HcapTion# = Usf.Height - Usf.InsideHeight
        LcaDre = Usf.Width - Usf.InsideWidth
        tbl(1) = (Usf.Left + LcaDre + label.Left) * PPX
        tbl(2) = (Usf.Top + HcapTion + label.Top + label.Height - LcaDre) * PPX
        position = tbl
    End Function
    exemple pour un menu dont j'aurais besoins n'importe ou dans l'application
    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 test()
        Dim arr
        arr = Array("barre,bout,toto,528,macro1,,1", _
                    "barre,pop,submenu1,,,1,2", _
                    "barre,bout,titi,256,macro2,,3", _
                    "submenu1,bout,riri,536,macro3,,1", _
                    "submenu1,pop,submenu2,,,1,2", _
                    "submenu2,bout,fifi,348,macro4,,1", _
                    "submenu1,bout,loulou,729,macro5,,3", _
                    "submenu2,pop,submenu3,,,1,2", _
                    "submenu3,bout,coco,744,macro6,,1")
        createbarre arr
    End Sub
    exemple pour un control label dans le UserForm(pour mes pseudo toolbars)
    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
     
    Private Sub Label1_Click()
        arr = Array("barre,bout,Nouveau,2520,macro2,,1", _
                    "barre,bout,Ouvrir,23,macro2,,2", _
                    "barre,pop,Enregistrement,,,1,3", _
                    "Enregistrement,bout,enregistrer,3,macro3,,1", _
                    "Enregistrement,bout,enregistrer sous,3,macro4,,2", _
                    "barre,pop,Impression,,,1,4", _
                    "Impression,bout,Apercu,109,macro4,,1", _
                    "Impression,bout,Impression couleur,2521,macro4,1,2", _
                    "Impression,bout,imprimer en noir et blanc ,2521,macro4,,3", _
                    "barre,pop,Envoyer,,,1,5", _
                    "Envoyer,bout,Par TELECOPIE,888,sendtel,1,1", _
                    "Envoyer,bout,Par Mail Outlook 2013,3738,sendoutlook,1,2", _
                    "Envoyer,bout,Par Mail CDO 2007,2188,sendCDO,1,3")
        createbarre arr, Label1, Me
    End Sub
    c'est le même code de construction pour les deux
    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

  8. #8
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Oui, merci. J'avais bien compris que tu utilisais une macro générique

    En cas de menu multilingue, tu pourrais soit:
    1. modifier la macro createbarre pour qu'elle tienne compte de la langue;
    2. soit lui préparer en amont l'array avec les items dans le bon ordre et les textes selon la version linguistique (array qui serait issu d'une table ou créé à la main).


    En choisissant la seconde option, tu ne dois pas toucher à ta macro, même si perso je laisserais tomber les index au profit d'un tri de l'array en amont pour créer les menus dans l'ordre. Et si maintenant tu veux te passer de la table Excel au profit d'un array créé en dur, pourquoi pas. Mais il me semblerait intéressant de laisser la flemme de côté pour insérer les items au bon endroit du tableau. Même s'il y a peu d'items dans ton array, un tri est toujours coûteux. Laisse tomber les index dans ta macro de création de barre, car l'insertion au bon endroit avec les index est coûteuse elle aussi, puisque cela revient à parcourir les éléments d'un tableau pour décaler tous ceux qui sont au delà de l'emplacement de celui que tu souhaites insérer. L'utilisation des index est intéressante (et incontournable) que pour insérer des items dans un menu déjà constitué, mais ne sert à rien à la création du menu.

    Pour résumer: Crée ton array dans l'ordre ou extrais-le d'une table avant de le passer à la macro, et s'il n'est pas trié, trie-le en amont de la macro. Qui plus est, cette solution isole bien les responsabilités de chaque fonction/procédure: une fonction qui prépare l'array trié, une fonction qui reçoit cet array et crée une barre de commande en utilisant ses données. Cette notion de responsabilité unique d'une fonction est primordiale dans le cade d'un code professionnel, maintenable et évolutif.
    "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...
    ---------------

  9. #9
    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 764
    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 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick,
    Je suis entièrement d'accord avec les interventions de Pierre.
    Il est absurde de "hardcoder" des textes qui doivent apparaître dans un menu ou dans un formulaire. L'usage de fichier externe (pour Excel feuille paramètre) permet une maintenance aisée.
    En Belgique où nous avons de nombreux clients utilisant des formulaires multilingues, il y a longtemps que l'usage de fichier Txt contenant les messages, étiquettes, etc... est employé pour développer des applications.
    En 1980, pour des applications développées en QuickBasic (ancêtre de VB), je suffixais déjà les fichiers Textes servant à l'affichage des écrans par ECF pour écran Français, ECN écran Néerlandais et ECE pour l'anglais.
    Ainsi un jour un client m'a demandé si avoir les écrans en Italien coûterait cher à développer. Je lui ai donné les fichiers textes en français et lui ai dit que s'il tapait lui même la traduction des textes un déjeuner ensemble suffirait.
    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

  10. #10
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut Philippe,

    Content de te voir passer. Tu vas bien?

    Je parlais des langues justement parce qu'effectivement, en Belgique, nous sommes souvent amenés à développer du multilingue, et donc le hardcoding, même des msgbox, est à proscrire. Et le coût de l'ajout d'une langue est simplement à hauteur de ce que coûte la traduction des textes, sans que le code doive être manipulé.

    Cela dit, au cas où on recevrait un array non trié contenant des chaines telles que définies par Patrick (avec un index numérique quelque part dans la chaîne), trier au sein d'une fonction qui utilise un dictionnaire, comme le propose Clément, est une idée simple à mettre en place. Mais nous sommes d'accord toi et moi que c'est inutile dans ce cas-ci
    "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...
    ---------------

  11. #11
    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
    Bonjour phillippe
    j'ai abandonné le désordre
    les fichiers (txt,ini et autre voir même (xml(qui serait plus facile because la hierarchie est déjà en place )) ) ne sont pas de mauvaise idées c'est vrai mais pour la transportabilité ca l'est moins

    j'ai donc éliminé le désordre et je me sert des éléments numérique pour les Begin group et état(enabled(false/true))qui sont bien sur en optional implicitement

    et en vise et versa il serait même tres facile de créer et d'editer un xml avec la commandbar en l'examinant en récursif

    je garde cet idée en tête elle me parle pour un autre projet
    en ce qui concerne cet exercice le but était au départ de créer une commandbars toujours avec un array mais plus d'étage en terme de sub menu que dans ma contribution sur la toolbar on form sans que ca devienne une usine a gaz
    c'est chose faite
    bon d'accords l'ordre et le désordre c'est encore un de mes délires , j'aime bien ce genre de casse tête pour le sport

    donc array sans paramètre pour le mode tool bar
    pour une popup n'importe ou dans l'application enlever les trois derniers parametres avant le paramètre destroy", Label2, Me,True" dans la ligne d'appel
    et mettre "destroy_imediately:=true" a la place
    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
    Private Sub Label2_Click()
        arr = Array("barre,bout,bouton1,528,macro1", _
                    "barre,pop,popup1", _
                    "barre,bout,bouton2,256,macro2", _
                    "popup1,bout,bouton3,536,macro3", _
                    "popup1,pop,popup2", _
                    "popup1,pop,popup4", _
                    "popup1,bout,bouton5,729,macro5", _
                    "popup2,bout,bouton4,348,macro4", _
                    "popup2,pop,popup3", _
                    "popup3,bout,bouton6,744,macro6", _
                    "popup4,bout,bouton7,933,macro7", _
                    "popup4,bout,bouton8,628,macro8")
        createbarre arr, Label2, Me,true
    End Sub
    avec paramètres begingroup et enabled
    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
    Private Sub Label1_Click()
        arr = Array("barre,bout,Nouveau,2520,macro2,,1", _
                    "barre,bout,Ouvrir,23,macro2,,1", _
                    "barre,pop,Enregistrement,,,1,1", _
                    "barre,pop,Impression,,,1,1", _
                    "barre,pop,Exporter,,,1,1", _
                    "barre,pop,Envoyer,,,1,1", _
                    "Enregistrement,bout,enregistrer,3,macro3,,1", _
                    "Enregistrement,bout,enregistrer sous,3,macro4,,0", _
                    "Impression,bout,Apercu,109,macro4,,1", _
                    "Impression,bout,Impression couleur,2521,macro4,1,1", _
                    "Impression,bout,imprimer en noir et blanc ,2521,macro4,,1", _
                    "Envoyer,bout,Par TELECOPIE,888,sendtel,1,1", _
                    "Envoyer,bout,Par Mail Outlook 2013,3738,sendoutlook,1,0" & IIf(Val(Application.Version) <> 12, 1, 0), _
                    "Envoyer,bout,Par Mail CDO 2007,2188,sendCDO,1," & IIf(Val(Application.Version) = 12, 1, 0), _
                    "Exporter,bout,Feuille active en PDF,444,macro4,,1", _
                    "Exporter,bout,Le Classeur en PDF,444,macro4,,1" _
                  )
        createbarre arr, Label1, Me,true
    End Sub
    La sub de creation
    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
    Sub createbarre(arr, Optional label As Object, Optional Usf As Object, Optional destroy_imediately As Boolean)
        Dim barre As CommandBar, i&, Ctrl, ct, ctsub, données, par, typectrl, pos, Index
        On Error Resume Next
        CommandBars("MenuUSF").Delete
        On Error GoTo 0
        Set barre = CommandBars.Add("MenuUSF", msoBarPopup, False, True)
        For i = LBound(arr) To UBound(arr)
            données = Split(arr(i), ",")
            If données(0) = "barre" Then
                Set par = barre
            Else
                Set par = FindControlByCaption(CommandBars("MenuUSF"), CStr(données(0)), True)
               End If
            typectrl = IIf(données(1) = "bout", msoControlButton, msoControlPopup)
            With par
                Set Ctrl = par.Controls.Add(typectrl, , , , True): Ctrl.Caption = données(2)
                If données(1) = "bout" Then Ctrl.FaceId = données(3): Ctrl.OnAction = données(4)
                If UBound(données) >= 5 Then If données(5) = 1 Then Ctrl.BeginGroup = True
                If UBound(données) >= 6 Then If données(6) = 1 Then Ctrl.Enabled = True Else Ctrl.Enabled = False
            End With
        Next
        If Not label Is Nothing And Not Usf Is Nothing Then    'si un control activX et userform a été injecté
            pos = position(label, Usf)
            CommandBars("MenuUSF").ShowPopup pos(1), pos(2)
        Else
            CommandBars("MenuUSF").ShowPopup
        End If
        If destroy_imediately Then CommandBars("MenuUSF").Delete    'pour ne pas avoir a le faire a la fermeture du classeur
    End Sub
    la fonction de recherche du control par la caption (car ca n'existe pas a l'origine) qui est nécessaire même si l'array est dans l'ordre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    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
        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
            Set FindControlByCaption = mycontrol
        Next
    End Function
    et la fonction position pour le mode toolbar on form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function position(label As Object, Usf)
        Dim PPX#, HcapTion#, LcaDre#, tbl(1 To 2)
        With ActiveWindow.ActivePane: PPX = (.PointsToScreenPixelsX(Cells.Width) - .PointsToScreenPixelsX(0)) / Cells.Width: End With
        HcapTion# = Usf.Height - Usf.InsideHeight
        LcaDre = Usf.Width - Usf.InsideWidth
        tbl(1) = (Usf.Left + LcaDre + label.Left) * PPX
        tbl(2) = (Usf.Top + HcapTion + label.Top + label.Height - LcaDre) * PPX
        position = tbl
    End Function
    testé sur 2007/2013 en 32 bits

    l'idée du fichier mais en Xml me plait beaucoup
    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
    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
    @philippe
    j'ai fait des tests avec des fichiers xml ca fonctionne assez bien merci pour l'idée
    j'ai opté pour des xml lineaires (non imbriqués) en utilisant les attributs
    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. #13
    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 764
    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 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick,
    @philippe
    j'ai fait des tests avec des fichiers xml ca fonctionne assez bien merci pour l'idée
    j'ai opté pour des xml lineaires (non imbriqués) en utilisant les attributs
    Je n'ai pas encore utilisé cette méthode qui semble intéressante et que j'examinerai lorsque j'aurai un peu de temps libre.

    les fichiers (txt,ini et autre voir même (xml(qui serait plus facile because la hierarchie est déjà en place )) ) ne sont pas de mauvaise idées c'est vrai mais pour la transportabilité ca l'est moins
    Il y a moult façons de permettre de transporter facilement une application avec ses menus.
    • Un fichier XLAM avec une feuille dédiée aux menus (Textes (multilingues), infobulle, procédures à déclencher, etc.)
    • Un sous-répertoire nommé Config qui contient les fichiers INI, TXT, etc., dédié à l'application

    Dans toutes les applications que je livre, il y a toujours un répertoire principal et ses sous-répertoires
    Ainsi la copie du répertoire principal de l'application vers n'importe quel endroit du disque ou du réseau est transparente pour l'application. C'est la manière de rendre perenne l'application et facilite la maintenance.
    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

  14. #14
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Perso, le seul intérêt que je vois dans du fichier xml pour des données de ce genre, c'est, comme l'indiquait Philippe précédemment, dans l'optique de pouvoir personnaliser la configuration d'un fichier "générique" (langue, habillage des tables, ...), c'est-à-dire des données qui imposeraient des versions différentes de l'outil si on les incluait dans le fichier Excel lui-même.

    Dans ce cadre, l'externalisation de la configuration des commandbars me semble inutile par rapport à une table de données interne. Même dans le cadre d'une commandbar multilingue, il me semble plus cohérent que la structure des commandbars soit stockée dans une table de données à l'intérieur du fichier, en externalisant les textes (caption, infobulle, barre d'état, ...) dans un fichier xml en cas de multilinguisme.
    "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
    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
    bonjour Pierre et philippe

    @pierre
    je ne vois pas très bien comment corréler une table de données interne avec un fichier externe pour le multilinguisme par exemple ni l'utilité dans le sens ou je peux faire les deux dans un tableau de correspondance en interne

    @philippe
    Un fichier XLAM avec une feuille dédiée aux menus (Textes (multilingues), infobulle, procédures à déclencher, etc.)
    j'ignorais que les feuille étaient accessibles c'est intéressant


    en l'état mon xml se présente comme ca
    j'ai choisi une méthode linéaire et non balises imbriquées pour ne pas avoir a sub boucler sur les childs et parent (ces renseignements sont des attributs)
    nom du fichier "barre1.xml"
    Code xml : 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
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <barre Name="MenuUSF">
     <bouton caption="Nouveau" Type="1" parent="barre" faceID="2520" begingroup="0" enable="-1" onaction="macro2" /> 
     <bouton caption="Ouvrir" Type="1" parent="barre" faceID="23" begingroup="0" enable="-1" onaction="macro2" /> 
      <popup caption="Enregistrement" Type="10" parent="barre" faceID="" begingroup="-1" enable="-1" /> 
       <bouton caption="enregistrer" Type="1" parent="Enregistrement" faceID="3" begingroup="0" enable="-1" onaction="macro3" /> 
       <bouton caption="enregistrer sous" Type="1" parent="Enregistrement" faceID="3" begingroup="0" enable="0" onaction="macro4" /> 
     <popup caption="Impression" Type="10" parent="barre" faceID="" begingroup="-1" enable="-1" /> 
      <bouton caption="Apercu" Type="1" parent="Impression" faceID="109" begingroup="0" enable="-1" onaction="macro4" /> 
      <bouton caption="Impression couleur" Type="1" parent="Impression" faceID="2521" begingroup="-1" enable="-1" onaction="macro4" /> 
      <bouton caption="imprimer en noir et blanc" Type="1" parent="Impression" faceID="2521" begingroup="0" enable="-1" onaction="macro4" /> 
     <popup caption="Envoyer" Type="10" parent="barre" faceID="" begingroup="-1" enable="-1" /> 
      <bouton caption="Par TELECOPIE" Type="1" parent="Envoyer" faceID="888" begingroup="-1" enable="-1" onaction="sendtel" /> 
      <bouton caption="Par Mail Outlook 2013" Type="1" parent="Envoyer" faceID="3738" begingroup="-1" enable="0" onaction="sendoutlook" /> 
      <bouton caption="Par Mail CDO 2007" Type="1" parent="Envoyer" faceID="2188" begingroup="-1" enable="-1" onaction="sendCDO" /> 
     <popup caption="Exporter" Type="10" parent="barre" faceID="" begingroup="-1" enable="-1" /> 
      <bouton caption="Feuille active en PDF" Type="1" parent="Exporter" faceID="444" begingroup="0" enable="-1" onaction="macro4" /> 
      <bouton caption="Le Classeur en PDF" Type="1" parent="Exporter" faceID="444" begingroup="0" enable="-1" onaction="macro4" /> 
    </barre>

    et le constructeur sur la base du xml

    appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
        Dim chemin$
        chemin = "C:\Users\polux\DeskTop\barre1.xml"
        createbarrebyXml chemin, destroy_imediately:=True
    End Sub
    code constructeur
    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
     
    Option Explicit
    Sub createbarrebyXml(chemin, Optional label As Object, Optional Usf As Object, Optional destroy_imediately As Boolean)
        Dim barre As CommandBar, Ctrl As Object, par As Object, typectrl, pos, barName$, Capt$, p$, FiD$, AcT$, enable&, begin&
        Dim xmldoc As Object, xmlbarre As Object, elem As Object
        Set xmldoc = CreateObject("Microsoft.XMLDOM"): xmldoc.async = False: xmldoc.Load chemin    'load du xml
        Set xmlbarre = xmldoc.getelementsbytagname("barre")(0)    'recupération  du node "barre" dans le xml
        If xmlbarre Is Nothing Then MsgBox "barre non trouvée dans le xml": Exit Sub
        barName = CStr(xmlbarre.getattribute("Name"))
     
        On Error Resume Next
        CommandBars(barName).Delete
        On Error GoTo 0
        Set barre = CommandBars.Add(barName, msoBarPopup, False, True)
        For Each elem In xmlbarre.ChildNodes
            'on repeche les information sur les controls dans le xml
            typectrl = IIf(elem.getattribute("Type") = "1", msoControlButton, msoControlPopup)    ' le type de control
            Capt = elem.getattribute("caption")    'la caption (string)
            p = elem.getattribute("parent")    'le parent (string)
            If Not IsNull(elem.getattribute("faceID")) Then FiD = elem.getattribute("faceID")    ' l'icon(faceID) (string)
             If Not IsNull(elem.getattribute("onaction")) Then AcT = elem.getattribute("onaction")   ' la macro associée(string)
            enable = Val(elem.getattribute("enable"))    ' l'etatdu control (enabled(false/true)(numeric))
            begin = Val(elem.getattribute("begingroup"))    ' beguingroup(false/true)(numeric)
            'recherche et determine selon la donnée parent repeché si c'est la barre ou un controlpopup
            If p = "barre" Then Set par = barre Else Set par = FindControlByCaption(CommandBars(barName), CStr(p), True)
            'et enfin insertion du control dans le menu et parametrage selon les données repéchées
            With par
                Set Ctrl = par.Controls.Add(typectrl, , , , True): Ctrl.Caption = Capt
                If typectrl = 1 Then Ctrl.FaceId = FiD: Ctrl.OnAction = AcT
                Ctrl.BeginGroup = Val(begin)
                Ctrl.Enabled = Val(enable)
            End With
        Next
        'si l'apel vient d'un control dans un userform
        If Not label Is Nothing And Not Usf Is Nothing Then    'si un control activX et userform a été injecté
            pos = position(label, Usf)
            barre.ShowPopup pos(1), pos(2)
        Else
            barre.ShowPopup    'sinon le show se fait ou est le curseur
        End If
        If destroy_imediately Then barre.Delete    'pour ne pas avoir a le faire a la fermeture du classeur
    End Sub
    '
    'fonction de recherche de control par la caption
    Function FindControlByCaption(Lparent As Variant, Lcaption As String, Optional raze As Boolean = False) As Object
        Static mycontrol As Object, Ctrl As CommandBarControl
        If raze = True Then Set mycontrol = Nothing
        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
            Set FindControlByCaption = mycontrol
        Next
    End Function
    je suis en train de créer aussi la chose a l'envers c'est a dire partir de la commandbarpopup vers un fichier xml
    demo

    Nom : demo2.gif
Affichages : 176
Taille : 407,4 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

  16. #16
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Organisé ainsi, ton xml pourra difficilement être multilingue. Les attributs n'ont normalement pas pour vocation d'être des données, mais d'être, comme leur nom l'indique, des attributs d'une entité.

    Pour lier les menus à un fichier xml (un par langue ou un pour toutes les langues), on utilise simplement un ID que l'on retrouve tant dans la table que dans le fichier xml. Ca permet de ne pas multiplier les fichiers xml tout en créant ces derniers avec une structure assez simple. L'idée est qu'un humain puisse facilement s'y retrouver. L'idée est aussi de pouvoir ainsi créer un fichier xml par langue sans t'obliger à recréer dans chaque xml l'entièreté des données nécessaires à la création de tes menus. Sinon, lorsque tu vas devoir ajouter ou modifier un menu, tu devras le faire dans chaque xml. Donc, les données nécessaires à la structure de ton application sont stockées dans des feuilles de ton xlam, et les textes (caption, messages, infobulles, données textuelles de tes rubans, etc) dans des xml linguistiques.

    Pour ce qui est des feuilles dans un xlam, il faut juste comprendre qu'un xlam, c'est un fichier Excel comme un autre. La seule différence, au delà de son extension, est que son thisworkbook a la propriété IsAddIn est à True, ce qui le rend invisible. Mais tu peux l'utiliser comme un autre, et donc stocker des données dans des feuilles, y avoir accès, les modifier ou les supprimer.
    "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
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    [...]

    @philippe

    j'ignorais que les feuille étaient accessibles c'est intéressant[...]
    Sans cela, un xlam se réduirait à une bibliothèque de code, en gros. Un xlam est un fichier Excel comme un autre, sauf qu'il est invisible pour l'utilisateur à cause de sa propriété IsAddin = True. Ans cette configuration, on ne peut donc le manipuler que par VBA, mais tout ce que l'on peut faire en VBA sur un fichier Excel, on peut le faire sur un xlam.

    On peut donc, et de manière non exhaustive:
    • y créer, supprimer des feuilles;
    • y manipuler des tables de données (paramères, textes multilingues, ...);
    • y stocker des feuilles "modèles" que l'on pourra copier dans les classeurs qui utilisent le xlam;
    • y stocker des graphiques, ...;
    • y placer du code qui pilotera le classeur "données";
    • y placer un ruban permettant le pilotage de l'application;
    • ...



    En passant sa propriété IsAddin à False, on le rend visible. Ne pas oublier, après modifications manuelles dans les feuilles, de remettre IsAddin à True puis d'enregistrer le classeur.
    "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. #18
    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
    bonjour pierre
    Sans cela, un xlam se réduirait à une bibliothèque de code,
    je m'en suis toujours servi comme tel
    le fait que l'on puisse se servir des feuille comme base ou stockage est intéressant
    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. #19
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    [...]
    le fait que l'on puisse se servir des feuille comme base ou stockage est intéressant
    Intéressant? Primordial, dirais-je . C'est justement ce qui permet de créer une appli pro qui tient la route en minimisant le code
    "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
    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 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    J'ai oublié de dire: Si l'on veut rendre le xlam visible pour travailler sur les feuilles en manuel par exemple, il suffit de basculer sa propriété IsAddin à False. Deux choses à ne pas oublier cependant: La remettre à True après les modifs ET ne pas oublier d'enregistrer le fichier (il est devenu invisible et n'est pas sauvé lors de la fermeture d'Excel)
    "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...
    ---------------

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. besoin d'aide dans un petit exercice
    Par midoutn dans le forum PowerAMC
    Réponses: 0
    Dernier message: 28/11/2009, 19h40
  2. Réponses: 3
    Dernier message: 09/04/2008, 14h24
  3. Besoin d'aide sur 3 petits programmes en Cobol
    Par gecko64 dans le forum Cobol
    Réponses: 2
    Dernier message: 12/09/2007, 22h30
  4. [VB6 + Excel] besoin d'aide sur 3 petits points
    Par Mackouacloth dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/07/2007, 16h09

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