Macro commune plusieurs feuilles
Bonjour,
Je bidouille comme je peux avec les informations que je trouve ici et là mais il se trouve que je ne maîtrise pas grand chose et cette fois il me fait un coup de main pour parvenir à mes fins
Tout d'abord j'ai un code :
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
'si le nombre de cellules sélectionnées est supérieur à 1 ou si
'la ligne de la cellue éditée est inférieure à 10, sort de la procédure
If Target.Cells.Count > 1 Or Target.Row < 10 Then Exit Sub
If Target.Column = 1 Then 'condition : si la cellule éditée se trouve dans la colonne 1 (=A)
'si la cellule est effacée, efface la ligne entière(colonnes B + E + F), sort de la procédure
If Target.Value = "" Then Target.Resize(1, 2).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 5).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 6).ClearContents: Exit Sub
With Target.Offset(0, 4)
.Value = Date
ActiveSheet.Unprotect
.NumberFormat = "dd/mm/yyyy"
End With 'place la date en colonne E
With Target.Offset(0, 5)
.Value = Time
ActiveSheet.Unprotect
.NumberFormat = "hh:mm:ss"
End With 'place l'heure en colonne F
Target.Offset(0, 1).Select 'sélectionne la cellule en colonne B
End If
If Target.Column = 2 Then 'condition : si la cellule éditée se trouve dans la colonne 2 (=B)
Cells(Target.Row + 1, 1).Select 'sélectionne la cellule de la ligne du dessous de la colonne A
End If 'fin de la condition
ActiveSheet.Protect
End SubCe code se trouve dans une seule feuille.
Les feuilles sont protégées pour éviter les manipulations hasardeuse.
Il n'est pas optimal et demanderai quelques amélioration notement au niveau du "ClearContents" mais ce n'est pas ma priorité, ça fonctionne bien déjà comme ça ^^
Ce que je n'arrive pas à faire c'est comment utiliser ce code sur toutes mes feuilles SAUF certaines.
Si une bonne âme passait par là...
Merci d'avance
Bonjour et bienvenue sur le forum
Essaie en mettant ta macro dans un module et non dans une feuille.
Et modifie le début de la façon suivante :
Sub Essai()
Dim f As Worksheets
For Each f In Worksheets
If f.Name <> ActiveSheet.Name And "Feuille X" And f.Name <> "Feuille Y" Then
'...
'le reste inchangé
'...
End If
Next f
End SubBye !
Bonjour,
je dirais dans le Sub Workbook_SheetChange de ThisWorkbook.
Tu reçois un paramètre supplémentaire Sh qui est la feuille ayant provoqué l'événement.
A toi de contrôler Sh.Name pour traiter ou non.
eric
Bonjour,
Une piste à adapter. A mettre dans le module du classeur.
Quand tu modifie une valeur dans la procédure événementielle Change(), ceci a pour effet de rappeler la procédure donc, il te faut suspendre la gestion d'événements avant d'effectuer une modif et la rétablir ensuite :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Select Case Sh.Name
'feuilles cible
Case "Feuil1", "Feuil3" ',"Feuil4", etc...
Sh.Unprotect
'si le nombre de cellules sélectionnées est supérieur à 1 ou si
'la ligne de la cellue éditée est inférieure à 10, sort de la procédure
If Target.Count > 1 Or Target.Row < 10 Then Exit Sub
On Error GoTo Fin
Application.EnableEvents = False
If Target.Column = 1 Then 'condition : si la cellule éditée se trouve dans la colonne 1 (=A)
'si la cellule est effacée, efface la ligne entière(colonnes B + E + F), sort de la procédure
If Target.Value = "" Then Target.Resize(1, 2).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 5).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 6).ClearContents: Exit Sub
With Target.Offset(, 4)
.Value = Date
ActiveSheet.Unprotect
.NumberFormat = "dd/mm/yyyy"
End With 'place la date en colonne E
With Target.Offset(, 5)
.Value = Time
ActiveSheet.Unprotect
.NumberFormat = "hh:mm:ss"
End With 'place l'heure en colonne F
Target.Offset(0, 1).Select 'sélectionne la cellule en colonne B
End If
If Target.Column = 2 Then 'condition : si la cellule éditée se trouve dans la colonne 2 (=B)
Cells(Target.Row + 1, 1).Select 'sélectionne la cellule de la ligne du dessous de la colonne A
End If 'fin de la condition
Sh.Protect
End Select
Fin:
Application.EnableEvents = True
End SubJe n'ai rien testé, à toi de le faire !
Bonjour et bienvenue sur le forum
Merci
Pour le reste, ça n'a pas fonctionné
[...]
je dirais dans le Sub Workbook_SheetChange de ThisWorkbook.
Peux-être bien ^^ J'ai vu passé un truc du genre mais ne sachant pas le manipuler c'est compliqué.
[...]
Je n'ai rien testé, à toi de le faire !
Merci... J'avoue que là c'est du chinois ancien
Je joints un fichier exemple, ça pourrait aider
Merci en tous cas d'avoir apporté votre aide
Oups, à effacer. En éditant le premier message ça en rajoute un nouveau au fils de la discution sans éditer le message...
Oups, à effacer. En éditant le premier message ça en rajoute un nouveau au fils de la discution sans éditer le message...
Pour le reste, ça n'a pas fonctionné
Aucun code dans le module ThisWorbook comme indiqué...
Les événements se traitent dans les modules feuille et celui-ci.
En aucun cas dans un module Standard comme tu l'as fait.
Dans ThisWorkbook, en haut liste de gauche choisi Workbook, dans la liste de droite choisi l'événement voulu. Tu as tous ceux qu'il connait et la déclaration sera correcte.
eric
Essaie comme ça :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nomF$
nomF = ActiveSheet.Name
If nomF = "Recherche" Or nomF = "Feuil100" Or nomF = "Feuil101" Then Exit Sub
ActiveSheet.Unprotect
'si le nombre de cellules sélectionnées est supérieur à 1 ou si
'la ligne de la cellue éditée est inférieure à 10, sort de la procédure
If Target.Cells.Count > 1 Or Target.Row < 10 Then Exit Sub
If Target.Column = 1 Then 'condition : si la cellule éditée se trouve dans la colonne 1 (=A)
'si la cellule est effacée, efface la ligne entière(colonnes B + E + F), sort de la procédure
If Target.Value = "" Then Target.Resize(1, 2).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 5).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 6).ClearContents: Exit Sub
With Target.Offset(0, 4)
.Value = Date
ActiveSheet.Unprotect
.NumberFormat = "dd/mm/yyyy"
End With 'place la date en colonne E
With Target.Offset(0, 5)
.Value = Time
ActiveSheet.Unprotect
.NumberFormat = "hh:mm:ss"
End With 'place l'heure en colonne F
Target.Offset(0, 1).Select 'sélectionne la cellule en colonne B
End If
If Target.Column = 2 Then 'condition : si la cellule éditée se trouve dans la colonne 2 (=B)
Cells(Target.Row + 1, 1).Select 'sélectionne la cellule de la ligne du dessous de la colonne A
End If 'fin de la condition
'ActiveSheet.Protect
End SubBye !
Fait comme je t'ai dit à 19:50, tu verras la différence.
Là tu as collé un code d'un événement qui n'existe pas dans Thisworkbook.
Bonjour,
Voici ton classeur avec la procédure événementielle au bon endroit !
Bonjour Theze
Je crois que tu as oublié l'essentiel : joindre le classeur !
Bye !
Merci à tous pour votre aide.
@Eriic : J'avais fini par trouver en effet où placer le code mais c'est finalement l'exemple de @Theze qui m'a montré où ça coincé : la protection !
ActiveSheet.Unprotect ==> Sh.Unprotect
"Tout simplement"
Pour un parfait ignorant que je suis ce n'était pas évident.
J'avais fini par trouver en effet où placer le code
sauf que, je le répète, tu y mettais un événement qui n'y existe pas.
Dans un module feuille on met les événements worksheet, dans ThisWorkbook on met les événements Workbook.
Et, je le répète aussi, tu auras les événements accessibles en utilisant la liste déroulante de droite et il seront correctement déclarés.
Entiendo ?
Il faut chercher à comprendre ce qu'on fait pour progresser
Bonsoir,
J'ai une question tout de même car il se passe quelque chose d'étrange avec mon code.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'A placer dans le "ThisWorkbook"
Select Case Sh.Name
Case "Recherche", "BDD"
'ne rien faire pour ces feuilles !
Case Else
'toutes les autres feuilles sont ciblées
Sh.Unprotect
'Enlève la protection
'si le nombre de cellules sélectionnées est supérieur à 1 ou si
'la ligne de la cellue éditée est inférieure à 10, sort de la procédure
If Target.Count > 1 Or Target.Row < 10 Then Exit Sub
On Error GoTo Fin
Application.EnableEvents = False
If Target.Column = 1 Then
'condition : si la cellule éditée se trouve dans la colonne 1 (=A)
'si la cellule est effacée, efface la ligne entière(colonnes B + C + F + G), sort de la procédure
If Target.Value = "" Then Target.Resize(1, 2).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 3).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 6).ClearContents
If Target.Value = "" Then Target.Resize.Cells(1, 7).ClearContents: Exit Sub
With Target.Offset(, 5)
'place la date en colonne F
.Value = Date
ActiveSheet.Unprotect
.NumberFormat = "dd/mm/yyyy"
End With
With Target.Offset(, 6)
'place l'heure en colonne G
.Value = Time
ActiveSheet.Unprotect
.NumberFormat = "hh:mm:ss"
End With
Target.Offset(0, 1).Select
'sélectionne la cellule en colonne B
End If
If Target.Column = 3 Then
'condition : si la cellule éditée se trouve dans la colonne 3 (=C)
Cells(Target.Row + 1, 1).Select
'sélectionne la cellule de la ligne du dessous de la colonne A
End If
If Target.Column = 2 Then
'condition : si la cellule éditée se trouve dans la colonne 3 (=C)
Target.Offset(0, 1).Select
'sélectionne la cellule en colonne C
End If
Sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
'Rétabli la protection de la feuille
End Select
Fin:
Application.EnableEvents = True
End SubLe problème intervient quand je supprime le contenu de la première colonne. Le code exécute convenablement ce qui est écrit pour supprimer le reste des colonnes MAIS après Excel refuse de répéter en boucle la macro.
En gros après une suppression c'est comme si je perdais le focus ou je ne sais quoi.
La seule solution : fermer complétement Excel (fermer juste la feuille ne suffit pas) pour ré-ouvrir le fichier et tout redevient normal.
Un peu étrange
Si quelqu'un peu m'apporter un éclairage ^^
Merci
Bonjour,
Application.EnableEvents = False
....
If .... : Exit Sub
....Vu ?
eric
PS : rien à voir mais pourquoi faire 4 fois If Target.Value = "" Then ?
Tu peux faire un If sur plusieurs lignes
If Target.Value = "" Then
' action 1
' action 2
' ...
EndifPS 2 : regarde l'aide sur Resize.
Tes Target.Resize.Cells(1, 3) me font mal aux yeux
