Conditions sur toutes les feuilles d'un classeur
Résolu
dhaze
Messages postés
113
Statut
Membre
-
Le Pingou Messages postés 12639 Statut Contributeur -
Le Pingou Messages postés 12639 Statut Contributeur -
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...
Lo.
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.
A voir également:
- Conditions sur toutes les feuilles d'un classeur
- Comment faire un livret avec des feuilles a4 - Guide
- Bruler les feuilles de laurier - Guide
- Imprimer un classeur excel sur mac - Guide
- Excel reporter des données sur une autre feuille avec conditions ✓ - Forum Excel
- Je ne suis pas un robot confidentialité - conditions ✓ - Forum Mail
13 réponses
Bonjour à tous,
je crois que le problème c'est d'abord
et ensuite, c'est
qui devrait être placé après le FOR et en plus qui devrait s'écrire
cordialement
je crois que le problème c'est d'abord
Dim Feuille_énumérée As Integerqui 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
Bonjour,
Excusez-moi, c'était un peu lapidaire comme post...
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:
J'utilise directement
bizarement la macro "tourne" si je mets
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.
Est-ce que le fait de ne pas sélectionner chaque feuille avant de demander une action a une influence ?
Lo.
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.
Bonjour,
Normal que tu aies une Erreur d'execution '9' vu que tu n'as pas mis
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
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
Bonjour,
La macro
Et
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.
La macro
Créer_Boutons_Environcré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_8formate 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.
Pour être vraiment complet
Il s'agit au final de personnaliser une barre de boutons selon l'utilisateur...
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...
Je viens de faire un essai avec
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...
Setdans
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...
Pour l'énigme des boutons qui ne s'effacent pas, c'est résolu.
A la fin de la macro
Apparemment le fait de grouper les boutons doit changer quelque-chose qui l'empêche de les effacer...
A la fin de la macro
Créer_Boutons_Environil 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...
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) ...?
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) ...?
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Essayer une fois avec cette procédure :
Note: c'est prévu pour un bouton par feuille...!
Salutations.
Le Pingou
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
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 :
L'effacement marche sur toutes les feuilles.
Mais les boutons ne sont "reconstruits" que sur la première feuille du classeur.
Note:
Lo.
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.NAMEn'affiche que les feuilles avec boutons, donc traitées par la macro, ce qui est déjà bon signe...
Lo.
Bonjour,
essaye avec le passage de paramètre :
et l'appel :
cordialement
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
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.
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.
Bonjour,
En principe la procédure modifiée efface uniquement les boutons de commande.
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
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.
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.
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
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
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.
Quand à la version sans paramètre, j'ai une Erreur :
Lo.
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.
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.
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.
Bonjour,
Effectivement, encore un oubli de ma part.
Là ça fonctionne avec ceci en prologue :
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.
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.