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 :

[Excel 2007] [VBA 6.3] Ajout dynamique de code dans un formulaire


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    chef de projet transverse MOE
    Inscrit en
    Janvier 2015
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : chef de projet transverse MOE
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 121
    Par défaut [Excel 2007] [VBA 6.3] Ajout dynamique de code dans un formulaire
    Bonjour,

    Après quelques recherches et essais infructueux, je me tourne vers les spécialistes

    Je cherche à créer dynamiquement un certain nombre de boutons dans un formulaire et de créer le code associé à l'évènement click pour chaque bouton.

    mon code à la tête suivante:

    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
     
     
    Public Sub affichage_bouton_winrate()
     
    Dim i As Integer
    Dim Bouton As CommandButton
    Dim codeBouton As String
     
    i = 0
    While tab_trié(i + 1).nomDeck <> ""
        Set Bouton = Meta.Controls.Add("Forms.commandButton.1", "BoutonWinRate" & tab_trié(i + 1).nomDeck, True)
        Bouton.Caption = tab_trié(i + 1).nomDeck
        Bouton.Left = 300
        Bouton.Top = 30 + i * 11
        Bouton.Width = 300
        Bouton.Height = 30
     
        codeBouton = "sub BoutonWinRate" & tab_trié(i + 1).nomDeck & "_click()" & Chr(13)
        codeBouton = codeBouton & "msgbox(WinRateDeck(tab_trié(i+1).nomDeck))" & Chr(13)
        codeBouton = codeBouton & "End Sub"
     
        Meta.codeModule.insertLines Meta.countOfLines, code
     
        Set Bouton = Nothing
     
        i = i + 1
     
    Wend
     
    End Sub
    la création des boutons passe à la compilation. Par contre, je n'arrive pas à faire l'insertion dynamique du code dans mon formulaire (Meta).
    VBA ne reconnait pas "codeModule", "insertLines" et countOfLines.

    Une idée pour m'aider à avancer sur l'origine de l'erreur? est ce que ces méthodes / attributs d'un formulaire ne sont disponibles que dans une autre version de VBA?
    Ou plutôt les méthodes que je veux utiliser ne sont peut être pas disponibles pour un formulaire?
    Quelles seraient les objets contenant le code d'un formulaire? comment y acceder? et comment compter le nombre de ligne de code pour pouvoir ajouter ce code sans ecraser le reste?

    Merci d'avance,

    Tylert

  2. #2
    Inactif  

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

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    le probleme avec l'ecriture de code dynamique dans les module est que parfois la syntaxe c'est une torture
    interesse toi plutot aux modules classes sera plus facilement gerable
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

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

  3. #3
    Inactif  

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

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    un exemple comme ca vite fait

    prend un fichier vierge et met un userform vide de au moins 300 de haut par 300 de large

    dans le module userform met ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cl As New ma_first_classe
    Private Sub UserForm_Activate()
    cl.addbutton Me, 5
    End Sub
    ajoute un module classe que tu nommera "ma_first_classe"
    et met ce code dans ce module
    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
     
    Public WithEvents boutons As msforms.CommandButton
    Public WithEvents form As UserForm
    Public usf As Object
    Dim mesbouts(10) As New ma_first_classe
    Public Function addbutton(uf, nombre)
    For i = 1 To nombre
    Set bt = uf.Controls.Add("Forms.CommandButton.1", "bouton" & i)
    With bt: .Move 20, (i - 1) * 40, 100, 20: .Caption = "bouton" & i: End With '
    Set mesbouts(i).boutons = bt: Set usf = uf
    Next
    End Function
    Private Sub boutons_Click()
    MsgBox " coucou je suis le bouton " & boutons.Name
    End Sub
    voila lance ton userform surprise surprise et clique sur les boutons

    analyse bien le code et reviens pour demander des explications
    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

  4. #4
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    La création dynamique de code est à mon avis un non-sens et son besoin résulte souvent d'un problème de conception.

    A mon estime également, la création dynamique de boutons n'est utile que dans des cas très spécifiques et il est souvent plus intéressant, là aussi, de se pencher d'abord sur une conception de userform qui permettrait de l'éviter.

    Si tu disais ce que tu souhaites réaliser avec ton formulaire, peut-être pourrions-nous te donner des pistes d'une conception plus simple.
    "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
    Membre expérimenté
    Homme Profil pro
    chef de projet transverse MOE
    Inscrit en
    Janvier 2015
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : chef de projet transverse MOE
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 121
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    La création dynamique de code est à mon avis un non-sens et son besoin résulte souvent d'un problème de conception.

    A mon estime également, la création dynamique de boutons n'est utile que dans des cas très spécifiques et il est souvent plus intéressant, là aussi, de se pencher d'abord sur une conception de userform qui permettrait de l'éviter.

    Si tu disais ce que tu souhaites réaliser avec ton formulaire, peut-être pourrions-nous te donner des pistes d'une conception plus simple.
    TOut d'abord merci pour vos réponses.
    En fouillant sur les sites anglais, j'avais effectivement trouvé plus simple: la création d'un type de bouton avec une méthode associée.

    Ce que je veux faire dans mon formulaire:
    Je calcule un certain nombre de taux, pour chaque ligne, je veux afficher en face un bouton qui permet d'afficher un certain nombre d'informations dans un autre formulaire.
    Je pourrais limiter le nombre de taux a afficher (par exemple je n'affiche que les X plus grands, et je peux avoir un bouton pour les effacer et afficher les X suivants, et donc avoir un nombre limité de boutons et ce serait plus simple effectivement. je peux les rendre invisibles si le nombre de taux n'atteint pas le maximum d'une page.
    Mais comme je fais ca pour le plaisir et pas pour le boulot, je voulais faire un truc un peu compliqué que je ne savais pas faire...

    Merci encore.

  6. #6
    Rédacteur/Modérateur


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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Perso, un seul bouton et en fonction du taux sur lequel je me trouve, le bouton ouvre la boite de dialogue des détails correspondants. Si c'est pour de la consultation simple, je ferais même cela dans Excel avec des INDEX/EQUIV...

    Citation Envoyé par Tylert Voir le message
    [...]
    Mais comme je fais ca pour le plaisir et pas pour le boulot, je voulais faire un truc un peu compliqué que je ne savais pas faire... [...]
    Alors, c'est évidemment différent... Bon amusement
    "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
    Membre expérimenté
    Homme Profil pro
    chef de projet transverse MOE
    Inscrit en
    Janvier 2015
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : chef de projet transverse MOE
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 121
    Par défaut
    Pour ceux qui chercheraient à résoudre ce genre de probleme, ci dessous mon code:

    D'abord, créer une classe dans un module classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Option Explicit
     
    Public WithEvents BtnEvents As msforms.CommandButton
     
    Private Sub BtnEvents_click()
     
      MsgBox (WinRateDeck(BtnEvents.Caption))
     
    End Sub
    puis dans la méthode qui créé les boutons dynamiquement, créer un tableau de boutons de la nouvelle classe auquel on va assigner chaque bouton afin d'associer la methode au nouveau bouton.

    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
    68
    69
    70
    71
    72
    73
     
     
    Dim BtnArray() As New BtnClass
     
    Dim i As Integer
    Dim j As Integer
    Dim codeBouton As String
    Dim Bouton As msforms.CommandButton
     
    'on supprimme d'abord tous les boutons existants créé pour l'affichage des winrate particuliers
    Dim ctl As Control
    For Each ctl In Meta.Controls
        If Left(ctl.Name, 13) = "BoutonWinRate" Then
            Meta.Controls.Remove (ctl.Name)
        End If
    Next ctl
     
    'pour chaque ligne du tableau trié, on affiche un bouton.
    ' sur 2 colonnes
    'on ne le fait que pour la page en cours
    i = 0 + (NumPage - 1) * 20
    j = 0
    While tab_trié(i + 1).nomDeck <> "" And i < (NumPage * 20)
        Set Bouton = Meta.Controls.Add("Forms.commandButton.1", "BoutonWinRate" & tab_trié(i + 1).nomDeck, True)
        Bouton.Caption = tab_trié(i + 1).nomDeck
        If i = 0 Then
            Bouton.Left = 265
            Bouton.Top = 45 + (j) * 17
            Bouton.Width = 60
            Bouton.Height = 17
        Else
            If (CLng(Right(CStr(i), 1)) And 1) = 0 Then
                Bouton.Left = 265
                Bouton.Top = 45 + (j / 2) * 17
                Bouton.Width = 60
                Bouton.Height = 17
            Else
                Bouton.Left = 325
                Bouton.Top = 45 + ((j - 1) / 2) * 17
                Bouton.Width = 60
                Bouton.Height = 17
            End If
        End If
     
        If Round((tab_trié(i + 1).WinRate * 1 / tab_trié(i + 1).NbJoué), 2) <= 24.99 Then
            Bouton.BackColor = &HFF&
        End If
        If Round((tab_trié(i + 1).WinRate * 1 / tab_trié(i + 1).NbJoué), 2) <= 49.99 And Round((tab_trié(i + 1).WinRate * 1 / tab_trié(i + 1).NbJoué), 2) > 24.99 Then
            Bouton.BackColor = &H80FF&
        End If
        If Round((tab_trié(i + 1).WinRate * 1 / tab_trié(i + 1).NbJoué), 2) <= 74.99 And Round((tab_trié(i + 1).WinRate * 1 / tab_trié(i + 1).NbJoué), 2) > 49.99 Then
            Bouton.BackColor = &HFFFF&
        End If
        If Round((tab_trié(i + 1).WinRate * 1 / tab_trié(i + 1).NbJoué), 2) > 74.99 Then
            Bouton.BackColor = &HFF00&
        End If
     
        If (Not Not BtnArray) <> 0 Then
     
            ReDim Preserve BtnArray(UBound(BtnArray) + 1)
     
        Else
     
            ReDim BtnArray(0)
     
        End If
     
        Set BtnArray(UBound(BtnArray)).BtnEvents = Bouton
     
        i = i + 1
        j = j + 1
     
    Wend
    Ca fonctionne parfaitement, même si il y a des parties encore obscure pour moi...
    Notamment le code ci dessous. si quelqu'un avait une explication de l'utilité

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        If (Not Not BtnArray) <> 0 Then
     
            ReDim Preserve BtnArray(UBound(BtnArray) + 1)
     
        Else
     
            ReDim BtnArray(0)
     
        End If
    ci dessous, une visu de ce que ca donne
    Je me rends compte que comme j'ai fait de la pagination, j'avais plus besoin de créer les boutons dynamiquement. je n'aurais eu besoin que de 20 boutons qu'on fait disparaitre ou rend visible selon les besoins
    Pas grave, j'ai progressé.

    J'aurais pu faire des combos box pour les tris tiens aussi...

    Nom : capture.png
Affichages : 554
Taille : 46,9 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/02/2013, 16h39
  2. [1.x] EmbedForm et ajout dynamique de champ dans une formulaire.
    Par Noobboy dans le forum Symfony
    Réponses: 6
    Dernier message: 10/08/2011, 15h03
  3. Ajout dynamique d'input dans un formulaire
    Par Nappo dans le forum Général JavaScript
    Réponses: 20
    Dernier message: 26/12/2009, 11h47
  4. Ajout dynamique de champ dans un formulaire
    Par gendalf37400 dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 06/06/2007, 15h11
  5. ajout dynamique de contrôle dans un formulaire
    Par celiaaa dans le forum IHM
    Réponses: 2
    Dernier message: 26/02/2007, 19h23

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