Ne supprimer que les cellules déverrouillées

Loulou2307

XLDnaute Nouveau
Bonjour,

Alors je sais que cette demande a déjà été plusieurs fois, mais je ne trouve pas de réponse concrètes qui me conviennent donc je tente ma chance.

Voila, j'ai une feuille excel où j'ai des cellules verrouillées et des cellules déverrouillées. Jusque là, rien d'exceptionnel.
Dans mes cellules verrouillées se trouvent des formules qui ne doivent pas être supprimées.
Dans mes cellules déverrouillées se trouvent des données temporaires que je souhaite pouvoir supprimer quand je le veux.
Je souhaite pouvoir sélectionner toutes mes cellules et ne supprimer le contenu que des cellules déverrouillées.

Mon problème est que si je protège ma feuille, soit je ne peux pas sélectionner toutes mes cellules (si je choisit l'option correspondante) soit je peux tout sélectionner mais rien supprimer (message d'erreur qui me dit que je ne peux pas modifier mes cellules verrouillées.

Est ce que quelqu'un comprend ma demande et surtout, est ce que quelqu'un peut me donner une solution.

Merci,
Bonne soirée à tous.
 

Jacky67

XLDnaute Barbatruc
Bonjour
Avec une sélection qui comporte des cellules verrouillées et des cellules non verrouillées la suppression du contenu des cellules non verrouillées n'est pas possible manuellement.
Est-ce qu'une solution par VBA ferait l'affaire ?
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Comme suggeré par Jacky67, une solution VBA
(La protection: [X] Sélectionner cellules dévérouillées)
VB:
Sub Effacer_CDeverouillees_SF()
Dim Plage As Range, A_Effacer As Range, Rng As Range
On Error Resume Next
Set Plage = ActiveSheet.UsedRange
Application.ScreenUpdating = False
For Each Rng In Plage
    If Not Rng.Locked  And Not Rng.HasFormula Then
        If A_Effacer.Count = 0 Then
        Set A_Effacer = Rng
        Else
        Set A_Effacer = Union(A_Effacer, Rng)
        End If
    End If
Next
If A_Effacer.Count > 0 Then A_Effacer.ClearContents
End Sub
Cette macro efface le contenu des cellules déverrouillées et sans formule.
 

job75

XLDnaute Barbatruc
Bonjour à tous ,
Dans mes cellules verrouillées se trouvent des formules qui ne doivent pas être supprimées.
Dans mes cellules déverrouillées se trouvent des données temporaires que je souhaite pouvoir supprimer quand je le veux.
Ôtez la protection de la feuille et exécutez cette macro :
Code:
Sub Effacer()
Cells.SpecialCells(xlCellTypeConstants) = ""
End Sub
Ce qui peut se faire manuellement avec la commande Atteindre (touche F5).

Nota : la méthode Union utilisée par Staple1600 pédale dans la choucroute si le nombre de cellules/plages disjointes à unir dépasse 1000 ou 2000.

A+
 

zebanx

XLDnaute Accro
Bonjour Job75, Staple1600, eriiic, jacky67, loulou2307

@job75 :
pour info, je crois que le code #5 efface des données textes même lorsque la cellule est verrouillée (et en ôtant bien la protection de la feuille)

Ce petit code là, récupéré, fonctionne bien en test sur toutes les cellules déverrouillées qu'on peut après délimiter ou pas avec specialcells.

-----
Sub sh01_ClearUnlockedCells()
Application.FindFormat.Clear
Application.FindFormat.Locked = False
Cells.Replace "*", "", SearchFormat:=True '--si on veut tout remplacer : texte, nombre, cellules avec formules par un clearcontents

'ou si on ne veut remplacer que les cellules avec chiffres (formule ou "dur"), par specialcells...
'Cells.SpecialCells(xlCellTypeConstants, 1).Replace "*", "0.00", SearchFormat:=True
'Cells.SpecialCells(xlCellTypeFormulas, xlNumbers).Replace "*", "0.00", SearchFormat:=True


Application.FindFormat.Clear
End Sub

Bonne journée
zebanx
 

job75

XLDnaute Barbatruc
Re,

Par curiosité j'ai comparé la méthode FindFormat avec celle utilisant un tableau VBA :
Code:
Sub Effacer_FindFormat()
Dim t
t = Timer
Application.FindFormat.Clear
Application.FindFormat.Locked = False
Cells.Replace "*", "", SearchFormat:=True
Application.FindFormat.Clear
MsgBox "Effacement en " & Format(Timer - t, "0.00 \s"), , "FindFormat" 'chez moi => 14,2 s
End Sub

Sub Effacer_tableau()
Dim t, P As Range, cc%, tablo, i&, j%
t = Timer
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'si la feuille est filtrée
Set P = ActiveSheet.UsedRange
cc = P.Columns.Count
tablo = P.Resize(P.Rows.Count + 1).Formula 'au moins 2 éléments
For i = 1 To UBound(tablo) - 1
  For j = 1 To cc
    If Not P(i, j).Locked Then tablo(i, j) = ""
Next j, i
ActiveSheet.UsedRange = tablo
MsgBox "Effacement en " & Format(Timer - t, "0.00 \s"), , "Tableau" 'chez moi => 1,8 s
End Sub
Fichier joint, le UsedRange contient 150 000 cellules dont 25 000 sont à effacer.

A+
 

Pièces jointes

  • Effacer(1).xlsm
    902.4 KB · Affichages: 29
  • Effacer(1).xls
    2.3 MB · Affichages: 29

eriiic

XLDnaute Barbatruc
Effectivement, pas très efficient ce Cells.Replace
Vu la différence entre xls et xlsm j'ai tenté de réduire à UsedRange. Résultat : 1/10e de plus... :)
Déjà il doit faire cellule par cellule, une fois nettoyé c'est 0.05s
Par contre je n'ai pas le même écart. C'est 'seulement' :) 5 fois plus lent en xlsm qu'en xls chez moi.
 

zebanx

XLDnaute Accro
Bonsoir à tous,

Merci pour les tests effectués.
C'est dommage que le code #9 soit si long sur xlsm car cela ne vous donnera pas envie de l'utiliser...

Travaillant sur 2003, je constate que c'est plus rapide que le code "tableau" (en doublant les données sur 2 colonnes de 50000 lignes chacune, sur 2003 (xls) je suis à 0.42s vs 3.52 s).
Et que cela peut servir en cas de format spécifique (date, font, specialcells) avec un code court pour un cas de "find/replace".

Bonne soirée
zebanx
 

Discussions similaires