Effacer les données des cellules colorisées en blanc

Résolu/Fermé
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 - 7 oct. 2016 à 23:04
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 - 9 oct. 2016 à 22:25
Bonjour à tous,

J’ai un tableau, la zone de travail est D3:Q40 (par exemple)

Ce que je souhaiterais faire :

a) comment définir dans cette zone de travail, la zone ou il y a des informations. Dans l'exemple : F13:M23

https://www.cjoint.com/c/FJhu7ryqZst

b) Mémoriser cette zone dans une variable (plages) pour si besoin pouvoir faire un zoom ou un copier collé plus tard.

c) Rechercher dans cette zone (plages) s'il y a des données ou la coloration de la cellule est blanche. Si oui supprimer les données dans les cellules blanches, uniquement


J'ai essayé le code ci-dessous mais ça ne marche pas.

Merci pour l'aide.

Bien cordialement

Sub efface_donnee()

'Efface les données non utile
Dim Plage As Range
Dim vcel As Variant
Set Plage = Range("D3:Q40")
For Each vcel In Plage
If vcel.Interior.Color = 2 Then vcel.Clear
Next vcel

End Sub
A voir également:

4 réponses

Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
8 oct. 2016 à 00:16
Bonjour,

Essaie avec :
If vcel.Interior.ColorIndex = 2 Then vcel.Clear

A+
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
8 oct. 2016 à 09:20
Bonjour,

Merci Gyrus pour ta solution qui fonctionne parfaitement bien et répond donc au point c de mes interrogations.

Aurais-tu une solution pour le point a et b ?

Merci pour vos réponses.

Bien cordialement
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
8 oct. 2016 à 10:53
Bonjour,

Effectivement, j'avais zappé les deux premiers points.

Pour la détermination de la plage, j'ai opté pour une recherche des limites en balayant les lignes et les colonnes de la plage D3:Q40.

La mémorisation de la plage est obtenue avec la variable "Plage". Il reste à voir comment tu souhaites utiliser cette plage et adapter la portée de la variable, si nécéssaire.

Sub efface_donnee()
Dim LigDeb As Long, LigFin As Long
Dim ColDeb As Integer, ColFin As Integer
Dim Plage As Range, Cel As Range
Dim vcel As Variant
LigDeb = Rows.Count
LigFin = 1
ColDeb = Columns.Count
ColFin = 1
For Each Cel In Range("D2").Resize(, 14)
If Cel.End(xlDown).Row < LigDeb Then LigDeb = Cel.End(xlDown).Row
Next Cel
For Each Cel In Range("D41").Resize(, 14)
If Cel.End(xlUp).Row > LigFin Then LigFin = Cel.End(xlUp).Row
Next Cel
For Each Cel In Range("C3").Resize(38)
If Cel.End(xlToRight).Column < ColDeb Then ColDeb = Cel.End(xlToRight).Column
Next Cel
For Each Cel In Range("R3").Resize(38)
If Cel.End(xlToLeft).Column > ColFin Then ColFin = Cel.End(xlToLeft).Column
Next Cel
Set Plage = Range(Cells(LigDeb, ColDeb), Cells(LigFin, ColFin))
For Each vcel In Plage
If vcel.Interior.ColorIndex = 2 Then vcel.Clear
Next vcel
End Sub

A+
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
8 oct. 2016 à 22:08
Bonjour, et merci pour cette proposition qui fonctionne très bien dans mon fichier d’exemple.

Le problème :

Lorsque je place la macro dans mon fichier finale la sélection n’est pas la bonne ?

J’ai fait des essais et je n’arrive pas à comprendre pourquoi ???

Peux-tu m’orienter pour la recherche du défaut ?

Voici mon fichier : https://www.cjoint.com/c/FJiudv31iPt

Voici la macro modifiée :

Option Explicit

Sub efface_donnee()

'efface les donnée non utiles

Dim LigDeb As Long, LigFin As Long
Dim ColDeb As Integer, ColFin As Integer
Dim Plages As Range, Cel As Range
Dim vcel As Variant
LigDeb = Rows.Count
LigFin = 1
ColDeb = Columns.Count
ColFin = 1
' cas pour une plage qui va de D3 à IU302

For Each Cel In Range("D3").Resize(, 253) '("= premiere ligne -1 et le nombre après resize = nombre de cellule à traiter
If Cel.End(xlDown).Row < LigDeb Then LigDeb = Cel.End(xlDown).Row
Next Cel
For Each Cel In Range("D303").Resize(, 253) ' ("= dermièere ligne +1
If Cel.End(xlUp).Row > LigFin Then LigFin = Cel.End(xlUp).Row
Next Cel
For Each Cel In Range("C3").Resize(250) '("= premiere colonne -1
If Cel.End(xlToRight).Column < ColDeb Then ColDeb = Cel.End(xlToRight).Column
Next Cel
For Each Cel In Range("IV302").Resize(250) '("= derniere colonne +1
If Cel.End(xlToLeft).Column > ColFin Then ColFin = Cel.End(xlToLeft).Column
Next Cel
Set Plages = Range(Cells(LigDeb, ColDeb), Cells(LigFin, ColFin))

MsgBox "L" & LigDeb & "/" & "C" & ColDeb & " : " & "L" & LigFin & "/" & "C" & ColFin

MsgBox " prés pour effacer les données ? "

For Each vcel In Plages
If vcel.Interior.ColorIndex = 2 Then vcel.Clear
Next vcel

MsgBox "fin de la sequence d'effacement "

End Sub

Merci d’avance

Bien cordialement
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523 > mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021
9 oct. 2016 à 06:15
Bonjour,

Code modifié (voir la détermination de la dernière colonne) :
Sub efface_donnee()
'efface les donnée non utiles
Dim LigDeb As Long, LigFin As Long
Dim ColDeb As Integer, ColFin As Integer
Dim Plages As Range, Cel As Range
Dim vcel As Variant
LigDeb = Rows.Count
LigFin = 1
ColDeb = Columns.Count
ColFin = 1
' cas pour une plage qui va de D3 à IU302
For Each Cel In Range("D3").Resize(, 253) '("= premiere ligne -1 et le nombre après resize = nombre de cellule à traiter
If Cel.End(xlDown).Row < LigDeb Then LigDeb = Cel.End(xlDown).Row
Next Cel
For Each Cel In Range("D302").Resize(, 253) ' ("= dermièere ligne +1
If Cel.End(xlUp).Row > LigFin Then LigFin = Cel.End(xlUp).Row
Next Cel
For Each Cel In Range("C3").Resize(250) '("= premiere colonne -1
If Cel.End(xlToRight).Column < ColDeb Then ColDeb = Cel.End(xlToRight).Column
Next Cel
For Each Cel In Range("IV3").Resize(250) '("= derniere colonne +1
If Cel.End(xlToLeft).Column > ColFin Then ColFin = Cel.End(xlToLeft).Column
Next Cel
Set Plages = Range(Cells(LigDeb, ColDeb), Cells(LigFin, ColFin))
Plages.Select
MsgBox "Prés pour effacer les données dans la plage " & Plages.Address(0, 0) & " ?"
For Each vcel In Plages
If vcel.Interior.ColorIndex = 2 Then vcel.Clear
Next vcel
MsgBox "fin de la sequence d'effacement "
End Sub

A+
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10 > Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016
9 oct. 2016 à 09:46
Bonjour et merci pour la solution, qui bien sur fonctionne très bien.

bien cordialement
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10 > Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016
9 oct. 2016 à 10:42
Bonjour,

Encore une petite demande sur le code du post 5.

Je n’arrive pas à comprendre le fonctionnement du code,

J’ai mis des données aux 4 coins de mon tableau pour tester :

Au lancement de la macro, il détecte des données sur les cellules D15 :IU300 ?, normalement il devrait trouver D3:IV302 ou peut-être D3:IU302.

Si je relance le code, il trouve D14 :IU300, puis encore une fois, il trouve D12 :IU300 et ainsi de suite D11:IU300 ...

As tu une solution ou explication STP ?

Bien cordialement
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523 > mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021
9 oct. 2016 à 12:58
Bonjour,

Pour effectuer la recherche des limites avec la propriété Range.End, il faut débuter cette recherche à l'extérieur de la plage à délimiter.
Avec ton exemple, il faut utiliser les lignes 2 et 303 pour définir les limites haute et basse, la colonne C pour la limite gauche.
Par contre, pour la la limite droite, cela pose problème si tu utilises la totalité des colonnes de la feuille.

Tu as donc intérêt à définir clairement cette plage à délimiter.

A+
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
9 oct. 2016 à 22:10
Bonjour,

J’ai résolut mon problème (post9) en utilisant uniquement le code si dessous, mais le traitement est long :

Set Plages = Range(Cells(3, 4), Cells(302, 256))
Plages.Select

For Each vcel In Plages
If vcel.Interior.ColorIndex = 2 Then vcel.Clear
Next vcel


Comment compléter le code dans le IF pour ajouter en plus de la condition colorIndex = 2 un condition ET s’il y a une donnée à l’intérieure de la cellule ?

Merci pour l'aide.

Bien cordialement
0
mijean94 Messages postés 394 Date d'inscription mercredi 16 décembre 2015 Statut Membre Dernière intervention 8 novembre 2021 10
9 oct. 2016 à 22:25
bonjour,


j'ai trouvé la solution avec le code si dessous.


If vcel.Interior.ColorIndex = 2 And vcel <> "" Then vcel.Clear


Merci à tous

Bien cordialement
0