[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. 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!!!!!!!!
  2. 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...
  3. Modérateur
    Bonjour,
    Pourrais tu placer ici même le code de ta fonction?