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 Sub

Ce 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

capture 20180127 162427 1281

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 Sub

Bye !

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 Sub

Je 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

9opti-misme2.xlsm (897.86 Ko)

Oups, à effacer. En éditant le premier message ça en rajoute un nouveau au fils de la discution sans éditer le message...

9opti-misme2.xlsm (897.86 Ko)

Oups, à effacer. En éditant le premier message ça en rajoute un nouveau au fils de la discution sans éditer le message...

12opti-misme2.xlsm (897.86 Ko)

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

Je suis allé peut-être un peu vite en partager le fichier allégé mais j'ai pourtant bien placé le code. Sans doute pas bien encore...

10opti-misme.zip (466.19 Ko)
capture 20180127 193155 1282

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 Sub

Bye !

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 !

Salut gmb !

Oups, effectivement

donc voici le fichier

20opti-misme2.xlsm (842.43 Ko)

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 Sub

Le 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
   ' ...
Endif

Merci

PS 2 : regarde l'aide sur Resize.

Tes Target.Resize.Cells(1, 3) me font mal aux yeux

Rechercher des sujets similaires à "macro commune feuilles"