Bouton pour effacer contenu de cellules non verrouillées

Bonjour à tous,

Mise en contexte.

Les gestionnaires utilise chaque semaine un classeur excel dans lequel se trouve :

  • une feuille d'horaires pour la semaine en cours, qu'ils ont planifier la semaine précédente
  • des feuilles pour les horaires quotidiens à remplir chaque matin (une feuille par jour)
  • une feuille de donnée qui est masqué et verrouillé

Voici le classeur en question :

(Le mot de passe est ren123)

La problématique.

Lorsque les gérants veulent préparer la semaine suivante, ils créer une copie du document et le renomme :

  • semaine en cours : fichier nommé " horaires du 13 au 19 juillet 2020"
  • copie et renommage en "horaires du 20 au 26 juillet 2020"

Cependant, les données qui ont été saisies dans les autres feuilles de travail la semaine précédent sont toujours présents, et il faut les effacer.

Comment créer un bouton sur chaque page hebdomadaire qui efface le contenu des cellules non verrouillées?

Je n'arrive pas à trouver quelque chose de semblable sur le forum, il a changé de look et je suis perdu

Merci d'avance et bonne journée

Laurent

Bonjour,

Tu n'as pas encore reçu de réponse ... je crois que les multiples champs fusionnés effraient bien des gens ... dont moi-même.

Cela nous mène à des codes longs pour tous les champs différents.

ric

Bonjour,

Peut-être un fichier modèle, déjà vide, qu'il ne reste qu'à copier serait plus convivial.

En le sauvegardant en modèle, toute sauvegarde créera un nouveau fichier. Ainsi, le modèle n'est pas altéré par mégarde.

ric

Bonjour à tous,

enregistre ton fichier en tant que modèle *.xltx ou *.xltm, c'est prévu pour ça.
Son ouverture créera une copie vierge qu'ils seront obligé de renommer en faisant Enregistrer sous...

Le modèle sera toujours préservé.
Garde une version vierge en xlsx pour faire les évols.
eric

Bonjour,

Oui je suis au courant pour le fichier modèle. La problématique réside que le premier onglet comporte le travail de toute une semaine et que les gérants le réutilisent pour préparer leur semaine suivante.

Et malheureusement, je ne pense pas que dire aux gérant qu'ils doivent recommencer tout le travail chaque semaine ne leur plaise...

Donc il faut vraiment que je trouve une solution.

Et si on ne pensait pas en cellule mais en plage de cellule? Donc plutôt que dire d'effacer telle ou telle cellule, pourquoi pas ne dire de trouver les cellules non verrouillées et de les effacer? je crois qu'il existe une manière de trouver les cellules non verrouillée en vba non?

Alors pour me répondre à moi-même j'ai trouvé ça :

Sub Vider()

    Dim Fe As Worksheet
    Dim C As Range

    If MsgBox("Êtes-vous sûr de vouloir effacer ce classeur entièrement ?", vbYesNo, "Confirmation") = vbNo Then Exit Sub

    If MsgBox("Cette action est définitive, confirmez-vous?", vbYesNo, "Confirmation") = vbNo Then Exit Sub

    'parcours toutesz les feuilles...
    For Each Fe In Worksheets

        'seulement pour les feuilles ayant un index entre 1 et 9
        If Fe.Index > 0 And Fe.Index < 10 Then

            'ôte la protection (adapter mot de passe)
            Fe.Unprotect "MDP"

            On Error Resume Next '<--- évite l'erreur de la feuille totalement vide de valeurs constantes
            'parcours seulement les cellules qui on une valeur constante
            For Each C In Fe.Cells.SpecialCells(2)

                'seulement si déverrouillée
                If C.Locked = False Then

                    'si fusionnée, fait référence à toute la plage, sinon juste la cellule
                    If C.MergeCells Then C.MergeArea.ClearContents Else C.ClearContents

                End If

            Next C

            're-protège
            Fe.Protect "MDP"

        End If

    Next Fe

    Application.Goto (ActiveWorkbook.Sheets("Sommaire").Range("B9"))

End Sub

Ça pourrait donner des pistes de travail? je l'ai trouvé sur google mais je suis incapable de le modifier je ne le comprends pas, je ne suis pas du tout bon en vba.

Bonjour,

Je ne connaissais pas cette méthode ... merci de m'instruire ...

À tester sur une copie d'un fichier contenant des données ...

Ce code parcours toutes les feuilles > à l'exception des feuilles "DONNÉES" et "TEMPLATE SEMAINE"

Sub Vider()
Dim Fe As Worksheet
Dim C As Range

    If MsgBox("Êtes-vous sûr de vouloir effacer ce classeur entièrement ?", vbYesNo, "Confirmation") = vbNo Then Exit Sub
    If MsgBox("Cette action est définitive, confirmez-vous?", vbYesNo, "Confirmation") = vbNo Then Exit Sub

    Application.ScreenUpdating = False

    'parcours toutes les feuilles...
    For Each Fe In Worksheets
        ' toutes les feuilles, excepté ...
        If Fe.Name <> "DONNÉES" And Fe.Name <> "TEMPLATE SEMAINE" Then

            'ôte la protection (adapter mot de passe)
            Fe.Unprotect "ren123"

            On Error Resume Next '<--- évite l'erreur de la feuille totalement vide de valeurs constantes
            'parcours seulement les cellules qui on une valeur constante
            For Each C In Fe.Cells.SpecialCells(2)

                'seulement si déverrouillée
                If C.Locked = False Then
                x = C.Address
                    'si fusionnée, fait référence à toute la plage, sinon juste la cellule
                    If C.MergeCells Then C.MergeArea.ClearContents Else C.ClearContents
                End If
            Next C

            're-protège
            Fe.Protect "ren123"
        End If
    Next Fe
    On Error GoTo 0     ' réinitialise la gestion des erreurs pour mettre fin à "On Error Resume Next"
End Sub

ric

Bonjour,

Merci pour la réponse.

J'ai donc créé un bouton activx sur la page "horaires hebdo", je lui ai associé la macro que l'on m'a fournie, mais ça ne fonctionne pas

(mot de passe : ren123)

Ma question est : serait-il plus facile de faire une macro par page?

Je veux dire par là que la personne qui ouvre le matin doit utiliser la page du jour correspondant (elle ouvre le mardi, elle utilise la page du mardi) et avant de travailler, elle clic sur le bouton "effacer" et ça n'efface que cette page.

Qu'en dites-vous?

Bonjour,

Un essai ...

Le bouton de chacune des feuilles (moins les 2 exceptions) mémorise le nom de la feuille dans une variable publique, puis appelle la macro; laquelle est située dans le Module1 avec la variable publique.

ric

Je viens de l'essayer et effectivement ça a l'air de bien fonctionner.

Donc la personne qui clique sur le bouton dans la feuille verra les données des cellules non verrouillées s'effacer.

Mais pas celles de tout le classeur entier.

Pour cela il faut le faire feuille par feuille c'est bien comme ça que je le comprends?

Bonjour,

N'est-ce pas cela que tu as demandé ? Une feuille = un bouton = supprimer les données de cette seule feuille.

Bien sûr, je t'invite à tester le tout sur une copie du fichier de travail.

ric

Bonjour,

N'est-ce pas cela que tu as demandé ? Une feuille = un bouton = supprimer les données de cette seule feuille.

Bien sûr, je t'invite à tester le tout sur une copie du fichier de travail.

ric

Oui oui c'est parfait comme ça Merci beaucoup

Je l'ai testé et c'est très bien.

Dans chaque page j'ai 2 cellules déroulantes (combobox), j'ai remarqué qu'elle ne se vidait pas comme les autres cellules. je suppose que c'est parce qu'elle ne sont pas en saisie manuelle? Est-il possible de les inclure dans l'effacement?

Si ça complexifie trop le code on oublie, c'est juste que si c'est possible de vraiment faire table rase, au moins c'est propre

Bonjour,

Voici la bidouille ...

Un essai...

Dans le Module1 > seules les lignes au bas ont été modifiées ou ajoutées ...

Sub Vider()
Dim Fe As Worksheet
Dim C As Range

    If MsgBox("Êtes-vous sûr de vouloir effacer ce classeur entièrement ?", vbYesNo, "Confirmation") = vbNo Then Exit Sub
    If MsgBox("Cette action est définitive, confirmez-vous?", vbYesNo, "Confirmation") = vbNo Then Exit Sub

    Application.ScreenUpdating = False

    Set Fe = Worksheets(QuelJour)

        ' les feuilles exclues
    If Fe.Name <> "DONNÉES" And Fe.Name <> "TEMPLATE SEMAINE" Then

            'ôte la protection (adapter mot de passe)
        Fe.Unprotect "ren123"

        On Error Resume Next    '<--- évite l'erreur de la feuille totalement vide de valeurs constantes
            'parcours seulement les cellules qui on une valeur constante
        For Each C In Fe.Cells.SpecialCells(2)
                'seulement si déverrouillée
            If C.Locked = False Then
                x = C.Address
                    'si fusionnée, fait référence à toute la plage, sinon juste la cellule
                If C.MergeCells Then C.MergeArea.ClearContents Else C.ClearContents
            End If
        Next C
    End If
    On Error GoTo 0     ' réinitialise la gestion des erreurs pour mettre fin à "On Error Resume Next"

    Fe.OLEObjects("JOURS").Object.ListIndex = 0
    Fe.OLEObjects("Combobox1").Object.ListIndex = 0
    Fe.Protect "ren123"     ' re-protège
End Sub

ric

Oh wow... ça fonctionne parfaitement!

Et bien merci pour le coup de main, j'ai pu apprendre des trucs encore une fois

Je me sens tellement nul en vba des fois.

En tout cas, on se recroisera c'est sûr!

Bonne journée!

Bonjour,

Ça m'a fait plaisir de t'aider ...

Ce que je n'aurai pu faire si tu n'avais pas trouvé le code de départ ... même s'il a fallu y apporter quelques adaptations.

Mes connaissances ne sont pas bonnes pour partir de zéro ... je suis meilleur pour adapter des choses existantes.

Bonne continuité ...

ric

Rechercher des sujets similaires à "bouton effacer contenu verrouillees"