Problème ToggleButton & Me

Bonjour à toutes et à tous,

Au cours d’un projet je rencontre un problème avec la fonctionnalité .Me et les ToggleButtons.

Tout d’abord, je vous explique ce que je souhaite réaliser.

J’aimerai créer une macro qui permet d’insérer un nombre n de ToggleButton, les uns au-dessus des autres, chacun dans une cellule et qui paramètre automatiquement leur LinkedCell par leur cellule de départ.

Débutant en VBA, je ne vais pas vous partager ce que j’ai réussi à faire car ce sont surtout des ébauches de code qui concerne les étapes d’avant et après cette histoire de ToggleButton.

En revanche, je peux vous partager un code que j’ai trouvé sur Internet (sur MrExcel.com) et qui semble être exactement ce que je souhaite, mais qui ne fonctionne pas chez moi.

Sub test()

    Dim TB As MSForms.ToggleButton

    Dim OleObj As Excel.OLEObject

    Dim StartCell As Range
    Dim Col As Integer
    Dim LeftPos As Long
    Dim TopMargin As Long
    Dim i As Long

    Application.ScreenUpdating = False

    Set TB = Me.ToggleButton1 'change the name accordingly

    Set StartCell = TB.TopLeftCell

    Col = StartCell.Column

    LeftPos = TB.Left

    TopMargin = TB.Top - StartCell.Top

    For i = 2 To 30
        Cells(i, Col).RowHeight = StartCell.RowHeight 'ensure each row is the same height
        Set OleObj = Me.OLEObjects.Add( _
            ClassType:="Forms.ToggleButton.1", _
            Left:=LeftPos, _
            Top:=Cells(i, Col).Top + TopMargin, _
            Width:=TB.Width, _
            Height:=TB.Height)
        With OleObj
            .LinkedCell = Cells(i, Col).Offset(, -1).Address
            .Object.Value = False
        End With
    Next i

    Application.ScreenUpdating = True

    

Lorsque j’active la macro, j’ai une fenêtre d’erreur qui me dit : « Erreur de compilation : Utilisation incorrecte du mot clé Me ».

Étant totalement débutant en VBA, je dois sûrement passer à côté de quelque chose d’évident. Si c’est le cas je m’en excuse par avance !

S'il faut que donne davantage de détails, n'hésitez pas à me le demander.

Merci à ceux qui me viendront en aide !

Bonjour,

Avant d'entrer dans des améliorations d'ordre cosmétique ...

il me semble que tu devrais tester la structure de base ...

A titre de point de départ :

Sub TestToggle()

Dim OleObj As Excel.OLEObject
Dim i As Long, col As Long

Application.ScreenUpdating = False
    col = 5
    For i = 2 To 6
        Set OleObj = ActiveSheet.OLEObjects.Add( _
            ClassType:="Forms.ToggleButton.1", _
            Left:=Cells(i, col).Left, _
            Top:=Cells(i, col).Top, _
            Width:=Cells(i, col).Width, _
            Height:=Cells(i, col).Height)
        With OleObj
            .LinkedCell = Cells(i, col).Offset(, -1).Address
            .Object.Value = False
        End With
    Next i
Application.ScreenUpdating = True
End Sub

En espèrant que cela t'aide

Super, ça marche nickel ! Merci !

J'analyserai les différences entre ce que j'avais trouvé qui ne fonctionnait pas, et ce que tu m'as partagé.

Par contre je viens de tomber sur un nouveau problème que je n'avais pas anticipé...

Je souhaiterai que chaque ToggleButton modifie certaines cellules de la ligne sur laquelle se trouve sa LinkedCell (en fonction de la value donc).

Pour ça, j'étais parti pour utiliser :

Private Sub ToggleButton1_Click()

    If ToggleButton1 Then

  ' Code de l'action quand value=True

       Else

   ' Code de l'action quand value=False

     End If

End Sub

Est-il possible d'automatiser l'incrémentation ce code pour chaque ToggleButton lors de leur création ?

Ou alors peut être une macro qui détecte un changement de valeur (LinkedCell) et qui effectue l'action souhaitée avec un .offset ?

Merci d'avance !

Re,

Ravi que cela puisse t'aider ...

Merci pour tes remerciements ...

Pas sûr de comprendre totalement ta nouvelle question ...

Si tu veux intervenir à la création de tes ToggleButtons ...

tu peux utiliser .OnAction si tu veux déclencher une macro par exemple ...

En espèrant que cela t'aide

Re,

En fait, le projet global c'est un formulaire qui selon la valeur du ToggleButton affecte les cellules de la ligne du ToggleButton concerné. Ce sont des changements de mise en forme (pour mettre des éléments en avant), mais également de valeur.

Du coup je n'étais pas sûr de la meilleure méthode à suivre...

Est-ce que j'utilise un code lorsqu'on change la valeur du Toggle ? Mais dans ce cas là, ça demande d'ajouter le code pour chaque bouton ajouté.

Est-ce que j'utilise une macro qui s'effectue à chaque changement de valeur ? Mais est-ce que ça ne va pas prendre du temps/ramer pour que la macro trouve la ligne où le bouton a changé de valeur pour ensuite effectuer les changements ? (sachant que mon formulaire final comportera plusieurs centaines de lignes, voire plusieurs milliers.

Du coup, si je comprends bien ta proposition, il suffit que je rajoute le .OnAction dans la macro d'insert de ToggleButton, et que dans la macro que va lancer le OnAction, j'écrive le code en référence relative (je pense partir du LinkedCell) pour qu'il n'y ait pas de "longue" analyse.

Ai-je bien compris ?

En tout cas, merci beaucoup pour l'aide !

Bonjour,

Effectivement tu as bien compris le principe de .OnAction ...

Mais maintenant que tu décris ton Objectif ... au lieu d'anticiper sur les détails technques de ta solution ...

Il me semble que La solution que tu as choisie est vraiemnt loin d'être la plus simple ... !!!

Car, si je comprends bien, tu risques d'avoir énormément de cas différents à traiter ...

alors qu'avec une macro évènementielle, tout sans doute grandement simplifier ...

Bonjour,

Je ne suis pas sûr de comprendre pourquoi le .OnAction ne fonctionnerait pas...

Sachant que tous les boutons auront le même rôle (changer les valeurs de la ligne concernée).

Bon, en vérité, il y aura 2 boutons par ligne, mais j'effectuerai la même méthode pour le deuxième.

Mais mon bouton en A1 a le même rôle que le B1, que le C1, etc. Le .OnAction en partant de la LinkedCell (automatiquement ajoutée et adaptée avec ton premier script ) et en utilisant des références relatives pour atteindre les cellules de la ligne à modifier n'est pas la bonne solution ?

Sinon je t'avoue que je ne connais pas bien le principe de macro événementielle...

Merci,

Re,

Deux ToggleButtons par ligne pour 60 lignes ... soit 120 objets ... il va te falloir un module de classe ...

Pour savoir de quoi nous parlons concrètement .. peux-tu joindre ton fichier ...

Re,

Je n'ai pas de document précis car justement je dois trouver un moyen de l'adapter en fonction du document traiter.

Du coup je n'ai qu'un doc Test qui effectue quelques actions de bases lorsqu'on clique sur un TB, le problème étant que j'ai du rentrer le code pour les 5 boutons.

15test-importtb.xlsm (26.63 Ko)

Désolé d'insister là-dessus, mais je n'ai pas compris pourquoi le .OnAction ne fonctionnerait pas ?

Ca ne permettrait pas d'écrire qu'une seule macro qui serait effectuer à chaque utilisation d'un TB mais permettant à la commande de s'adapter grâce au LinkedCell concernée ?

Merci pour le temps que tu prends pour m'aider

Re,

Tu peux relire mes messages ...

Je ne pense pas t'avoir dit que OnAction ne fonctionnerait pas ... puisque je te l'ai suggéré ...

Je voulais te mettre en garde sur une macro par ToggleButton ... soit 120 macros ...

Bonsoir,

Et bien je ne comprends pas le soucis si on utilise qu'une seule fonction qui peut être lancé par tous les ToggleButtons, mais je te fais entièrement confiance à ce sujet là

Je suis donc à l'écoute de ta solution de module de classe !

Merci,

Re,

Manifestement .. je ne m'exprime pas clairement ... !!!

OnAction va fonctionner ... Tes 120 ToggleButtons peuvent lancer la même macro ...

D'aiileurs rien ne t'empêche de faire un test ...!!!

Bonne Continuation

Bonjour,

Alors, j'ai fais des tests en regardant sur Internet des applications similaires, mais je n'arrive pas à faire fonctionner le .OnAction durant la création des ToggleButtons... J'ai tout le temps le message d'erreur "Propriété ou méthode non gérée par cet objet".Je commence à bien sentir mon côté débutant... Je te partage ce que j'ai fais.

Script pour l'import :

Sub Import_TB()

Dim OleObj As Excel.OLEObject
Dim i As Long, col As Long

Application.ScreenUpdating = False
    col = 15
    For i = 1 To 5
        Set OleObj = ActiveSheet.OLEObjects.Add( _
            ClassType:="Forms.ToggleButton.1", _
            Left:=Cells(i, col).Left, _
            Top:=Cells(i, col).Top, _
            Width:=Cells(i, col).Width, _
            Height:=Cells(i, col).Height)
        With OleObj
            .LinkedCell = Cells(i, col).Address
            .Object.Value = False
            .Placement = xlMoveAndSize
            .PrintObject = True
            .Object.OnAction = "Action_TB"
        End With
    Next i
Application.ScreenUpdating = True

End Sub

Et le script pour le .OnAction :

Sub Action_TB()

    If ToggleButton.Value = True Then

        Range(ToggleButton.LinkedCell).Select
        With Selection.Offset(0, -2).Range("A1:B1").Font
            .Bold = True
            .Name = "Calibri"
            .Size = 24
        End With
        Selection.Offset(0, -2).Range("A1:B1").Interior.Color = RGB(220, 220, 0)

    Else

        Range(ToggleButton.LinkedCell).Select
        With Selection.Offset(0, -2).Range("A1:B1").Font
            .Bold = False
            .Name = "Calibri"
            .Size = 11
        End With
        Selection.Offset(0, -2).Range("A1:B1").Interior.Color = RGB(255, 255, 255)

    End If

End Sub

Voilà, je suis assez perdu car ça ressemble à ce que j'ai vu sur Internet. J'ai également vu une méthode avec

ActiveSheet.OLEObjects.OnAction = "TB_Action"

mais ça ne fonctionnait pas non plus.

Merci encore une fois pour ton aide.

Bonjour,

J'ai réessayé plusieurs choses hier, mais en vain... Je suis dépassé, je ne comprends pas comment déclarer le .OnAction...

Il ne me reste que ce soucis à résoudre pour pouvoir finaliser ma macro

Si quelqu'un peut me donner un dernier coup de pouce, ça serait avec plaisir !

Merci

Bonjour,

Malheureusement, je n'ai vu ton dernier message ...

Du coup, je viens de tout relire depuis le début ...

Il ne faut pas me demander pourquoi ... mais j'étais convaincu que tu utilisais un contrôle de la famille des ' Forms ' ...

Tous ces contrôles peuvent être pilotés par l'instruction OnAction ...

Mais concrètement tu utilises un ToggleButton qui est un contrôle qui appartient à la famille 'ActiveX ' ...

Or ces contrôles sont de nature différente ... et ont besoin d'un évènement Click pour être déclenché ...

Désolé de t'avoir induit en erreur ...

Bonjour,

Oui j'ai dû utiliser un ActiveX car les Forms n'ont pas la possibilité d'adapter les proportions du boutons à la cellule et de suivre cette dernière...

Pour ceux qui voudraient suivre ce fil ...

La suite ...

https://forum.excel-pratique.com/viewtopic.php?f=2&t=126413

Rechercher des sujets similaires à "probleme togglebutton"