[VBA] fonction click sur commandbutton

Bonjour je voudrais savoir pourquoi la fonction permettant le clique sur un commandbutton ne reste pas sauvegarder et disparait a chaque fois que j'enregistre et ferme le classeur...?

J'ai essayer de la mettre dans un module ou dans un module de class rien n'y fait

3 réponses

Résumé de la discussion

Le problème est que le clic sur un MSForms.CommandButton ne se conserve pas après enregistrement et fermeture du classeur, et l’événement n’est plus actif à la réouverture. L’approche proposée consiste à utiliser un module de classe avec WithEvents pour le bouton et d’initier les boutons via InitBoutons à chaque ouverture, afin de réattacher les gestionnaires d’événements. En pratique, il faut créer des boutons avec un nom spécifique, par exemple ButtonInitFeuille, puis appeler InitBoutons dans Workbook_Open pour reprogrammer les événements à l’ouverture. D’autres conseils soulignent que la clé est l’initialisation des boutons ou la création automatique via CreateButton, afin que les boutons restent fonctionnels sans manipulations manuelles.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,
    Pourrais tu placer ici même le code de ta fonction?
    1. oui

      Code de la creation du bouton
      --------------------------------------------------------------------------------------
      Public Function CreateButton()
      Dim o As OLEObject
      Worksheets("Principal").Select
      Set o = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=100, Top:=150, Width:=80, Height:=30)
      o.Select
      Selection.Name = "ButtonInitFeuille"
      o.Object.Caption = "Initialisation"
      End Function

      ----------------------------------------------------------------------------------
      la fonction principal qui l'appelle
      ----------------------------------------------------------------------------------
      Sub InitFeuille()
      Call CreateButton
      End Sub
      -----------------------------------------------------------------------------------

      et la fonction du bouton que j'ai essayer de mettre soit dans le module en lui meme soit dans un module de class
      -----------------------------------------------------------------------------------

      Option Explicit
      Public WithEvents ButtonInitFeuille As CommandButton
      Private Sub ButtonInitFeuille_Click()
      Call InitFeuilleTab
      End Sub
      --------------------------------------------------------------------------
      avec ou sans les deux premiere lignes
      1. Modérateur
        Oui. Ok. Mais qu'elle fonction disparait???
      2. et bien la fonction pour le clic sur le bouton ne disparait pas mais reste inactif
      3. Modérateur
        Cette fonction en appelle une autre, nommée : InitFeuilleTab
        Quel est le code de InitFeuilleTab?
      4. Public Function InitFeuilleTab()
        Worksheets("***").Select
        Range("A1:I1").Select
        Selection.Merge
        End Function
      5. Modérateur
        Bon. Ton souci ne vient aucunement de tes fonctions. En fait, il faut attribuer ta classe (le code du module de classe) à ton bouton. Pour cela, il convient de modifier le code de la fonction CreateButton().
        Tout ça pour fusionner quelques cellules?
        Tu dis...
    2. Module 1
      -----------------------------------------------------------------------------
      Dim Bouton() As New Classe1

      Sub InitBoutons()
      Dim cpt As Integer
      Dim oleObj As OLEObject

      For Each oleObj In ActiveSheet.OLEObjects
      If Left(oleObj.Name, 17) = "ButtonInitFeuille" Then
      cpt = cpt + 1
      ReDim Preserve Bouton(1 To cpt)
      Set Bouton(cpt).ButtonInitFeuille = oleObj.Object
      End If
      Next
      End Sub

      Sub CreateButton()
      Dim o As OLEObject
      Worksheets("Feuil1").Select
      Set o = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=100, Top:=150, Width:=80, Height:=30)
      o.Select
      Selection.Name = "ButtonInitFeuille" & ActiveSheet.OLEObjects.Count
      o.Object.Caption = "Initialisation" & ActiveSheet.OLEObjects.Count
      End Sub

      Public Function InitFeuillTab()
      MsgBox "Sa fonction"
      End Function
      -------------------------------------------------------------------------
      Class 1
      ---------------------------------------------------------------------------

      Option Explicit

      Public WithEvents ButtonInitFeuille As CommandButton

      Private Sub ButtonInitFeuille_Click()
      Call InitFeuilleTab
      End Sub
      ----------------------------------------------------------------------------
      thisworkbook
      ---------------------------------------------------------------------------
      Private Sub Workbook_Open()
      Call InitBoutons
      End Sub
      ---------------------------------------------------------------------------
      1. Modérateur
        Essaye ce test :
        Sub test() 
        Dim cpt As Integer 
        Dim oleObj As OLEObject 
        
        For Each oleObj In ActiveSheet.OLEObjects 
            If Left(oleObj.Name, 17) = "ButtonInitFeuille" Then 
                MsgBox oleObj.Object & " " & oleObj.Name
            End If 
        Next 
        End Sub
      2. et je met sa ou?
      3. Modérateur
        dans le module 1. Ca n'est qu'un test...
      4. il ne peut pas faire le test vu qu'il ne veut meme pas crée le bouton
      5. Modérateur
        Tu n'as pas de boutons sur ta feuille???????????????
        Depuis tout à l'heure, tu me dis que le problème vient de InitButton??????????
        Si tu n'as pas de bouton sur ta feuille comment veux tu les initialiser??????
        SCROGNEUGNEU!!!!!!!!!
        Ta macro CreateButton fonctionne t'elle?
        S'agit-il de la feuille "Feuil1" ou "principale"? en conséquence, adapter : Worksheets("Feuil1").Select
        Tu dis..... Grrrrrrrrr!!!!!!!!