Conditions sur toutes les feuilles d'un classeur

Résolu
dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   -  
Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je n'arrive pas à venir à bout de cette macro qui doit remplacer les boutons des feuilles visibles, que si cette feuille comportait des boutons auparavant...

Sub Changer_les_Boutons()

    Dim Énumération_Feuilles_Classeur As Integer
    Dim Feuille_énumérée As Integer
    Dim Numération As Integer

         Énumération_Feuilles_Classeur = ActiveWorkbook.Worksheets.Count
         Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)

    For Numération = 1 To Énumération_Feuilles_Classeur
        If Feuille_énumérée.Visible = xlSheetVisible Then
            If Feuille_énumérée.Buttons.Count > 0 Then
                Feuille_énumérée.Buttons.Delete
                Call Créer_Nouveaux_Boutons
            End If
        End If
    Next Numération

End Sub

Lo.

13 réponses

  1. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    C'est quoi le problème... !

    0
  2. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
     
    Bonjour à tous,

    je crois que le problème c'est d'abord
    Dim Feuille_énumérée As Integer
    qui devrait être
    Dim Feuille_énumérée As Worksheet

    et ensuite, c'est
    Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)

    qui devrait être placé après le FOR et en plus qui devrait s'écrire
    Set Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)


    cordialement
    0
  3. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Excusez-moi, c'était un peu lapidaire comme post...

        Dim Énumération_Feuilles_Classeur As Integer
        Dim Feuille_énumérée As Worksheet
        Dim Numération As Integer
    
             Énumération_Feuilles_Classeur = ActiveWorkbook.Worksheets.Count
             Set Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)
    
        For Numération = 1 To Énumération_Feuilles_Classeur
            If Feuille_énumérée.Visible = xlSheetVisible Then
                If Feuille_énumérée.Buttons.Count > 0 Then
                    Feuille_énumérée.Buttons.Delete
                    Call Créer_Boutons_Environ
                    MsgBox Feuille_énumérée.NAME 'pour test de la boucle
                End If
            End If
        Next Numération

    Si on met "Set" avec "Feuille_énumérée As Worksheet"
    Erreur d'execution '9': L'indice n'appartient pas à la sélection.
    <jaune>Set Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)</jaune>
    Sans "Set" c'est la même Erreur.

    Si au lieu de mettre:
    Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)


    J'utilise directement
    ActiveWorkbook.Worksheets(Numération)
    dans le code, il ne se passe rien.

    bizarement la macro "tourne" si je mets
    If Feuille_énumérée.Buttons.Count = 0 Then

    La feuille VeryHidden n'est pas dans la boucle (les boutons ne sont pas effacés).
    Par contre les boutons sont effacés sur toutes les feuilles ou ils sont présents, mais ne sont rajoutés (maro Call) que sur la première feuille.

        Dim Énumération_Feuilles_Classeur As Integer
        'Dim Feuille_énumérée As Worksheet
        Dim Numération As Integer
    
             Énumération_Feuilles_Classeur = ActiveWorkbook.Worksheets.Count
             'Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)
    
        For Numération = 1 To Énumération_Feuilles_Classeur
            If ActiveWorkbook.Worksheets(Numération).Visible = xlSheetVisible Then
                If ActiveWorkbook.Worksheets(Numération).Buttons.Count = 0 Then
                    ActiveWorkbook.Worksheets(Numération).Buttons.Delete
                    Call Créer_Boutons_Environ
                    MsgBox ActiveWorkbook.Worksheets(Numération).NAME 'pour test de la boucle
                End If
            End If
        Next Numération


    Est-ce que le fait de ne pas sélectionner chaque feuille avant de demander une action a une influence ?

    Lo.
    0
    1. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
       
      Bonjour,

      Normal que tu aies une Erreur d'execution '9' vu que tu n'as pas mis
      Set Feuille_énumérée = ActiveWorkbook.Worksheets(Numération)
      à l'intérieur de la boucle FOR.
      Numération est indéfini avant la boucle FOR.

      Je vois que tu as changé de code en fin de message. Il doit fonctionner au niveau de la sélection de feuille.

      Pour la création des boutons, il faudrait connaître le code de Créer_Boutons_Environ.
      Sinon, tu passes la feuille concernée en paramètre de ton appel.

      cordialement
      0
      1. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   > JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour,

        La macro
        Créer_Boutons_Environ
        crée une suite de boutons de ce type:

            ActiveSheet.Buttons.Add(3, 3, 57, 47).Select
                Selection.OnAction = "Créer_Nom_Repertoire"
                Selection.Characters.Text = "Créer les noms"
                    Call Arial_Normal_8 ' VBA Module_Boutons
        
         ActiveSheet.Buttons.Add(60.75, 3, 57, 47).Select
                Selection.OnAction = "Créer_Repertoires"
                Selection.Characters.Text = "Créer les répertoires"
                    Call Arial_Normal_8 ' VBA Module_Boutons


        Et
        Call Arial_Normal_8
        formate le texte du bouton.

        Oui, ça appelle beaucoup dans mes classeurs ! Mais ça me permet de pouvoir réutiliser du code dans d'autres macros et éviter des répétitions...

        Lo.
        0
      2. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   > dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
         
        Pour être vraiment complet
        Sub Changer_les_Boutons()
        est déjà appelée par une autre macro, ce que explique le terme Environ.

        Sub User_Names()
        
            Dim Application_User_Name, Environnement_User_Name As String
        
        Application_User_Name = Application.UserName
        Environnement_User_Name = Environ("UserName")
        
        'MsgBox "Application: " & Chr(10) & Application_User_Name
        'MsgBox "Environnement: " & Chr(10) & Environnement_User_Name
        
            If Application_User_Name = "Jamon MANTEQUILLA" Or Environnement_User_Name = "SESSION_JM" Then
                'MsgBox "Utilisateur: " & Chr(10) & "Jamon MANTEQUILLA"
            Else
                Call Changer_les_Boutons
            End If
        
        End Sub

        Il s'agit au final de personnaliser une barre de boutons selon l'utilisateur...
        0
      3. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   > JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention  
         
        Je viens de faire un essai avec
        Set 
        dans
        For
        , la boucle fonctionne, efface les boutons, mais ne les recrée que dans la feuille active.
        Et la macro ne fonctionne qu'une fois, si on la rappelle, il ne se passe rien.
        Elle n'efface pas les boutons qu'elle a créé (appelé).
        Il faut que j'en ajoute de nouveaux pour qu'elle les efface...
        0
      4. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention   > dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
         
        Pour l'énigme des boutons qui ne s'effacent pas, c'est résolu.

        A la fin de la macro
        Créer_Boutons_Environ
        il y a les instructions suivantes:
        ActiveSheet.Buttons.Select
        Selection.ShapeRange.Group.Select
        Selection.Placement = xlFreeFloating

        Apparemment le fait de grouper les boutons doit changer quelque-chose qui l'empêche de les effacer...
        0
  4. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    Ce que vous désirez : effacer le bouton de commande qui peut se trouver sur une feuille visible du classeur ...Oui / Non... ?
    Que faites-vous des feuilles masquées (invisible) ...?

    0
    1. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour,

      Je veux "scanner" toutes les feuilles visibles du classeur actif.
      Si il existe des boutons, les effacer et appeler une maro qui en recrée de nouveaux.
      Pas de création de bouton, s'il n'y en avait pas auparavant sur la feuille.
      On ne touche pas à l'état visible/invisible, c'est juste un argument de sélection.

      Lo.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    Essayer une fois avec cette procédure :
    Sub testbtcmde()
    Dim c As Object
    For Each c In Worksheets
        If c.Visible = True Then
            If c.Shapes.Count > 0 Then
                c.Shapes.Item(1).Delete
                Call Créer_Boutons_Environ
                MsgBox c.Name 'pour test de la boucle
            End If
        End If
    Next c
    End Sub
    

    Note: c'est prévu pour un bouton par feuille...!
    Salutations.
    Le Pingou
    0
    1. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
       
      J'ai un problème avec Shapes qui englobe trop d'objets.
      Beaucoup trop de mauvaises surprises qui m'ont fait préférer Buttons.

      Petite modif pour effacer tous les boutons et test de la macro proposée :

      Sub testbtcmde()
      Dim c As Object
      Dim obj As Object
      For Each c In Worksheets
          If c.Visible = True Then
              If c.Shapes.Count > 0 Then
                  'c.Shapes.Item(1).Delete
                  For Each obj In c.Shapes
                      obj.Delete
                  Next obj
                  Call Créer_Boutons_Environ
                  MsgBox c.NAME 'pour test de la boucle
              End If
          End If
      Next c
      End Sub


      L'effacement marche sur toutes les feuilles.
      Mais les boutons ne sont "reconstruits" que sur la première feuille du classeur.

      Note:
      MsgBox c.NAME
      n'affiche que les feuilles avec boutons, donc traitées par la macro, ce qui est déjà bon signe...

      Lo.
      0
      1. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859 > dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
         
        Bonjour,

        essaye avec le passage de paramètre :
        Sub Créer_Boutons_Environ(sh As Worksheet)
        With sh.Buttons.Add(3, 3, 57, 47)
        .OnAction = "Créer_Nom_Repertoire"
        .Characters.Text = "Créer les noms"
        Call Arial_Normal_8 ' VBA Module_Boutons
        End With
        With sh.Buttons.Add(60.75, 3, 57, 47)
        .OnAction = "Créer_Repertoires"
        .Characters.Text = "Créer les répertoires"
        Call Arial_Normal_8 ' VBA Module_Boutons
        End With
        End Sub

        et l'appel :
        Sub testbtcmde()
        Dim c As Object
        Dim obj As Object
        For Each c In Worksheets
        If c.Visible = True Then
        If c.Shapes.Count > 0 Then
        'c.Shapes.Item(1).Delete
        For Each obj In c.Shapes
        obj.Delete
        Next obj
        Call Créer_Boutons_Environ(c)
        MsgBox c.Name 'pour test de la boucle
        End If
        End If
        Next c
        End Sub


        cordialement
        0
    2. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
       
      je n'ai pas ton problème d'effacement des boutons créés par la macro.

      essaie le code que je t'ai envoyé.

      il fonctionne chez moi comme j'ai compris que tu voulais qu'il le fasse.

      cordialement
      0
  7. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour dhaze,
    Je pense que vous auriez dû préciser qu'il y avait d'autres types de contrôles sur une feuille et que seules les [CommandButton] doivent être effacées.
    Dans ce cas je dois modifier ma proposition.

    0
  8. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    En principe la procédure modifiée efface uniquement les boutons de commande.
    Sub testbtcmde()
    Dim c As Object
    Dim Obj As OLEObject
    For Each c In Worksheets
        If c.Visible = True Then
            For Each Obj In c.OLEObjects
                ' contrôle si bouton de commande
                If TypeOf Obj.Object Is MSForms.CommandButton Then
                    Obj.Delete
                    Call Créer_Boutons_Environ
                    MsgBox c.Name 'pour test de la boucle
                End If
            Next Obj
        End If
    Next c
    End Sub
    

    0
  9. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Merci pour vos propositions, malheureusement je suis bloquée par une autre macro.
    Je voudrais pouvoir résoudre ce problème avant de reprendre celle-ci...

    Je n'ai pas abandonné ;-)

    Bon WE

    Lo.
    0
  10. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    Eh bien il est nécessaire d'avoir plus de détails.... !
    Merci de préciser si la dernière procédure que j'ai proposée fonctionne correctement.

    Salutations.
    Le Pingou
    0
  11. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Comme je vous le disais j'étais bloquée sur une autre macro de mon tableau. Ce n'est pas résolu, mais je ne voulais pas passée pour ingrate, et vous donner l'impression que vous aviez travaillés pour rien...

    J'ai fait des essais suite à vos réponses, et j'arrive à quelque chose qui fonctionne et semble stable pour la version avec paramètre.

    L'appel de la macro "Call Arial_Normal_8" ne fonctionne plus avec cette méthode, j'ai donc rajoutée "en dur" en fin de macro le formatage du texte des boutons.

    Sub Changer_les_Boutons_Param()
    
    Dim c  As Object
    Dim Obj As Object
    
        Application.ScreenUpdating = False
    
        For Each c In Worksheets
            If c.Visible = True Then
                If c.Shapes.Count > 0 Then
                    For Each Obj In c.Shapes
                    Obj.Delete
                    Next Obj
                    Call Créer_Boutons_Environ_Param(c)
                End If
            End If
        Next c
    
        Application.ScreenUpdating = True
    
    End Sub
    
    Sub Créer_Boutons_Environ_Param(sh As Worksheet)
    
        With sh.buttons.Add(3, 3, 57, 47)
            .OnAction = "Créer_Nom_Repertoire"
            .Characters.Text = "Créer les noms"
        End With
    
        With sh.buttons.Add(60.75, 3, 57, 47)
            .OnAction = "Créer_Repertoires"
            .Characters.Text = "Créer les répertoires"
        End With
    
        With sh.buttons.Font
            .NAME = "Arial"
            .FontStyle = "Normal"
            .Size = 8
        End With
    
    End Sub

    Quand à la version sans paramètre, j'ai une Erreur :
    	Erreur de compilation:
    Type défini par l'utilisateur non défini

    >TypeOf Obj.Object Is MSForms.CommandButton<

    Lo.
    0
  12. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    Merci pour les informations.
    Concerne : Erreur de compilation:
    Type défini par l'utilisateur non défini

    Il s'agit certainement, que la bibliothèque [MicrosoftForms 2.0 ObjectLibrary] est manquante.
    Concerne bouton de commande, n'ayant pas de précision sur le type de bouton que vous utilisez j'ai admis le type [MSForms] là est peut-être le problème.

    0
  13. dhaze Messages postés 113 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Effectivement, encore un oubli de ma part.
    Là ça fonctionne avec ceci en prologue :

    Sub Activer_Références_VBProject()
        With ThisWorkbook.VBProject.References
        ' > Microsoft Forms 2.0 Object Library :
            .AddFromGuid GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", Major:=2, Minor:=0
        End With
    End Sub

    Et c'est vrai, toutes mes excuses pour cela, j'aurais due bien préciser au départ que les boutons de ce tableau sont des boutons(Contrôle de formulaire) et non des boutons de commande(Contrôle ActivX).
    Ce qui rend cette macro inopérante...

    Lo.
    0
  14. Le Pingou Messages postés 12283 Date d'inscription   Statut Contributeur Dernière intervention   1 480
     
    Bonjour,
    Merci du retour.
    L'important est que votre application fonctionne correctement chez vous.

    0