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 :

[VBA-E] bouton dynamique avec fonction


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Par défaut
    Citation Envoyé par SpaceFrog
    sur une feuille excel ...
    Les boutons présents sur les feuilles Excel font partis de la collection OLEObjects. Ils n'ont pas de propriété Tag sous Excel 2000...

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 335
    Par défaut
    Bon. J'en reste à la question d'Ogenki
    ma question et se que dit spafy c'est exactement la meme chose...

    Les boutons présents sur les feuilles Excel font partis de la collection OLEObjects. Ils n'ont pas de propriété Tag sous Excel 2000...
    j'utilise Excel 2003..il y a une diference ?

  3. #3
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Alors, ont-ils au moins la propriété caption ?
    Si oui : nom1, nom2,.... nomn
    + une liste avec les paramètres dans le même ordre que val(right(wwwww.caption,1))
    + ce que j'ai dit en ce qui concerne l'appel d'une sous-rounine par un tout petit bout de code

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    J'ai également dit plus haut :
    Pourquoi ne pas les utiliser avec pour rôle, pour chacun d'entre eux, de "rapporter" lorsque cliqué, dans une variable ou ailleurs (y compris le tag du commandbutton) un paramètre "en cours"
    En cliquant alors sur le commandbutton, c'est ce paramètre qui interviendrait)
    et il m'a été répondu que le problème demeurait entier, qu'il faudrait indexer les optionsbuttons.
    1) non si l'on joue avec une liste ou mieux un array (au besoin en utilisant le caption des optionsbuttons, terminé par 1,2, etc...)
    2) il n'y aurait alors besoin que d'un seul commandbutton, donc d'un seul lot d'instructions
    Si aucune de ces solutions n'est finalement acceptable, je n'en vois aucune autre, sauf à écrire en dur (et le code sera encore plus long) de quoi faire face à l'absence de groupes sous Excel

  5. #5
    Expert confirmé
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Par défaut
    Citation Envoyé par Catbull
    Les boutons présents sur les feuilles Excel font partis de la collection OLEObjects. Ils n'ont pas de propriété Tag sous Excel 2000...
    sous 2003, non plus
    c'est vrai qu'ils ont un tag dans les userform et pas dans la feuille
    encore une subtilité crosoft

    catbull, tu viens de nous faire du confit de grenouille

    Je cogite au problème ....

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello,
    Le paramètre à passer vient d'où et quand vient-il ?
    Si c'est avant de créer le bouton, tu peux nommer le bouton du "contenu" du paramètre
    Ex : Paramètre = 12.25
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomDuBouton = AddCellule + ":" + cstr(Paramètre)
    Juste une idée, à défaut de Tag...
    Si le paramètre vient après la création du bouton, séplucompliké mais ce doit être faisable...

    A+

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 335
    Par défaut
    salut

    non mon parametre est bien recuperé avant le bouton

    merci

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Non, pas de merci, je n'ai pas (encore) trouvé le moyen de mettre à jour la propriété name...
    Si tu as la solution, peux-tu la mettre, sinon je vais continuer à chercher...

    A+

    Edit
    On parle bien toujours de bouton se trouvant dans une feuille de calcul ?

  9. #9
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 335
    Par défaut
    non pas de solution a l'horizon..je cherche toujour..

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ça y est ! Ouf ! J'ai bien cru t'avoir fourvoyé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With ActiveWorkbook 'Workbooks("Fichier.xls")
        With .ActiveSheet
               With .OLEObjects(1)
                  'Nom = .Name
                  'MsgBox Nom
                  .name = paramètre
                End With
            End If
        End With
    End With
    Comme je t'ai dit hier, tu peux simplifier

    A+

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    mpegmarques a eu une idée qui m'a donné une idée avec son idée d'ajouter des contrôles.

    Quand les paramètres sont obtenus, pourquoi ne pas les placer dans des zones de texte référencées (avec visible = false) chaque bouton récupérant le paramètre lui correspondant dans la zone de texte idoine ?
    Un bricolage ni plus ni moins sioux que le paramètre dans le nom... non ?

    A+

  12. #12
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Si l'on s'en sort ici, ce sera une fois de plus, à mon avis, plus le résultat d'une gymnastique de la pensée que la mise en oeuvre de connaissances (et c'est - j'ai déjà eu l'occasion de le dire - la meilleure qualité d'un bon développeur)

  13. #13
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Bon! je n'ai rien trouvé de mieux que ce que j'ai déjà dit...
    Même l'utilisation d'un fichier de ressources (j'y ai aussi pensé) n'affranchirait pas totalement de la nécessité, pour chaque bouton, de dire vers quoi "pointer".

    Quel dommage que Excel n'ait pas prévu des groupes de contrôles indexés... le problème eût été facilement résolu.
    Et dire qu'Ogenki (le demandeur) déclarait encore très récemment ne pas en voir l'utilité (voir le sujet : http://www.developpez.net/forums/vie...ghlight=.....)

  14. #14
    Expert confirmé
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Par défaut
    Citation Envoyé par jmfmarques
    Quel dommage que Excel n'ait pas prévu des groupes de contrôles indexés
    mais il faudra apprendre à s'en passer, .net ne supporte pas cette propriété

  15. #15
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Dommage, tout ça...
    Et comme je me sers beaucoup de ça,... voilà, s'il en fallait, une bonne raison pour que je ne mute pas vers .NET...
    Mais Ogenki... en encore sous un VB "civilisé", lui...

  16. #16
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    Voilà comment, sous VB.Net, on peut quand même créer l'équivalent de groupes de contrôles indexés :
    http://www.microsoft.com/france/msdn/vbasic/articles/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.mspx
    Je n'ai pas encore tout analysé, mais la démarche de pensée me parait fort intéressante..

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai compris le problème en me levant ce matin. L'index de l'objet suit le nombre d'objets dans collection et ne peut être utilisé que si le nombre d'objets ne varie pas. Pour utiliser l'objet, il est nécessaire de tester le nom.

    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
     
    Sub CréerBouton()
        With ActiveWorkbook.ActiveSheet
            For i = 2 To 4 Step 2
                      .OLEObjects.Add ClassType:="Forms.CommandButton.1", _
                Link:=False, DisplayAsIcon:=False, Left:=Cells(5, i).Left, Top:=Cells(5, i).Top, Width:=Cells(5, i).Width, Height:=Cells(5, i).Height
                 With .OLEObjects(i / 2)
                    .Name = Cells(5, i).Address
                 End With
            Next
        End With
     
        With ActiveWorkbook.ActiveSheet
            For i = 1 To 2
                 With .OLEObjects(i)
                    MsgBox .Name
                 End With
            Next
        End With
    End Sub
     
    Sub KillButton()
        supprimerBoutons (Cells(5, 2).Address)
        supprimerBoutons (Cells(5, 4).Address)
    End Sub
     
    Function supprimerBoutons(NomBouton)
    Dim i As Integer
        With ActiveWorkbook.ActiveSheet
             For i = 1 To ActiveWorkbook.ActiveSheet.OLEObjects.Count
                If .OLEObjects(i).Name = NomBouton Then
                    .OLEObjects(i).Delete
                    Exit For
                End If
             Next i
        End With
    End Function
    Je laisse ça à votre réflexion... vu que je n'en ai plus...

    A+

  18. #18
    Expert confirmé
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Par défaut
    Citation Envoyé par jmfmarques
    Voilà comment, sous VB.Net, on peut quand même créer l'équivalent de groupes de contrôles indexés :
    http://www.microsoft.com/france/msdn/vbasic/articles/vbtchCreatingControlArraysInVisualBasicNETVisualCNET.mspx
    Je n'ai pas encore tout analysé, mais la démarche de pensée me parait fort intéressante..
    Ici on s'en fiche, c'est le forum VB6-VBA, il y a des forums dotnet pour ca

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello,

    Bbil vient de donner une solution à un autre problème mais qui pourrait t'intéresser.
    Au lieu de la solution des boutons dans ta feuille, un click droit dans la cellule affiche un menu contextuel.
    Le menu contextuel qui s'affiche peut être enrichi de ta propre commande.
    Avantages :
    Le code n'est plus dans la feuille mais dans un module.
    Tu n'as plus à manipuler des OLEObjects
    Tu peux rendre au menu contextuel son aspect originel à la fermeture du fichier.

    Le code signé bbil
    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
    ' Procedure appellé pour effacer option du Menu
    Sub EffaceMenu(CB As CommandBar, stNom As String)
    On Error GoTo Fin
    Dim i As Integer
         For i = 1 To 100 ' Cette boucle ne sert à rien mais me rassure, pour éviter de partir dans boucle infinie..
              CB.Controls(stNom).Delete
         Next
    Fin:
     End Sub
    '
    ' Fonction d'ajout option dans menu contextuel
    Sub AjouteMenuContextuel()
      Dim c As CommandBar
      Dim b As CommandBarButton
      Set c = Application.CommandBars("Cell")
      '.. detruit le bouton si existe déjà
      EffaceMenu c, "Essai"
      Set b = c.Controls.Add(msoControlButton)
      b.Caption = "Essai"
      b.BeginGroup = True
      b.OnAction = "Test2"
      set c = nothing
      set b = noting 
    End Sub
     
    Public Sub test2()
     MsgBox "text2"
    End Sub
    Dans la sub test2, il sera seulement nécessaire de tester la cellule active avant de réaliser l'action désirée.
    Restera toujours le pb des paramètres...

    A toutes fins utiles

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/01/2008, 11h15
  2. [VBA-E]Selection dynamique avec souris de plages de cellules
    Par geeksideofme dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 08/05/2007, 14h25
  3. [VBA-E] Selection dynamique avec la sourie de plages de cellules Excel
    Par geeksideofme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/04/2007, 11h20
  4. [XUL] Boutons dynamiques (avec les dates)
    Par 20_cent dans le forum Autres langages pour le Web
    Réponses: 9
    Dernier message: 09/08/2006, 22h22
  5. [VBA E] bouton dynamique sur une feuille
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/06/2006, 18h05

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