Conditions sur toutes les feuilles d'un classeur

Résolu/Fermé
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 - 19 juin 2015 à 16:53
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 - 10 juil. 2015 à 15:09
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

Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
19 juin 2015 à 17:45
Bonjour,
C'est quoi le problème... !

0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
19 juin 2015 à 18:00
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
22 juin 2015 à 14:34
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
22 juin 2015 à 15:21
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 > JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020
22 juin 2015 à 17:56
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 > dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
22 juin 2015 à 18:16
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 > JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020
22 juin 2015 à 18:39
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020 > dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
22 juin 2015 à 19:01
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
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
22 juin 2015 à 14:42
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
22 juin 2015 à 15:08
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
Modifié par Le Pingou le 22/06/2015 à 15:22
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
22 juin 2015 à 17:36
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856 > dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
22 juin 2015 à 18:59
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
22 juin 2015 à 19:07
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
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
22 juin 2015 à 21:13
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
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
22 juin 2015 à 21:55
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
26 juin 2015 à 18:52
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
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
Modifié par Le Pingou le 26/06/2015 à 22:16
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
9 juil. 2015 à 18:28
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
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
10 juil. 2015 à 00:05
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
dhaze Messages postés 109 Date d'inscription mardi 27 septembre 2011 Statut Membre Dernière intervention 6 février 2020
Modifié par dhaze le 10/07/2015 à 11:38
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
Le Pingou Messages postés 12041 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 22 avril 2024 1 426
10 juil. 2015 à 15:09
Bonjour,
Merci du retour.
L'important est que votre application fonctionne correctement chez vous.

0