Conditions sur toutes les feuilles d'un classeur
Résolu
dhaze
Messages postés
109
Date d'inscription
Statut
Membre
Dernière intervention
-
Le Pingou Messages postés 12249 Date d'inscription Statut Contributeur Dernière intervention -
Le Pingou Messages postés 12249 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...
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
- Libreoffice calc si plusieurs conditions ✓ - Forum Excel
- Fusionner feuilles excel - Guide
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.