Signaler

Effacer les données des cellules colorisées en blanc [Résolu]

Posez votre question mijean94 291Messages postés mercredi 16 décembre 2015Date d'inscription 26 novembre 2016 Dernière intervention - Dernière réponse le 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

http://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
Afficher la suite 
Utile
+0
moins plus
Bonjour,

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

A+
mijean94 291Messages postés mercredi 16 décembre 2015Date d'inscription 26 novembre 2016 Dernière intervention - 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
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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+
Gyrus 3299Messages postés samedi 20 juillet 2013Date d'inscription 26 novembre 2016 Dernière intervention - 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+
Répondre
mijean94 291Messages postés mercredi 16 décembre 2015Date d'inscription 26 novembre 2016 Dernière intervention - 9 oct. 2016 à 09:46
Bonjour et merci pour la solution, qui bien sur fonctionne très bien.

bien cordialement
Répondre
mijean94 291Messages postés mercredi 16 décembre 2015Date d'inscription 26 novembre 2016 Dernière intervention Gyrus - 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
Répondre
Gyrus 3299Messages postés samedi 20 juillet 2013Date d'inscription 26 novembre 2016 Dernière intervention - 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+
Répondre
mijean94 291Messages postés mercredi 16 décembre 2015Date d'inscription 26 novembre 2016 Dernière intervention - 9 oct. 2016 à 20:49
bonjour,

Merci pour cette réponse.

il faudrait donc ne pas avoir de données dans les lignes 2 et 303 et dans les colonnes C et la derrière IV ?

Fait , mais pas de changement au fonctionnement. même comportement qu'expliqué au post 7.

voici le code utilisé

Sub efface_donnee1()
'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 à traiter qui va de E4 à IU302 *
'*****************************************************

For Each Cel In Range("E4").Resize(, 252)
If Cel.End(xlDown).Row < LigDeb Then LigDeb = Cel.End(xlDown).Row
Next Cel
For Each Cel In Range("E302").Resize(, 252)
If Cel.End(xlUp).Row > LigFin Then LigFin = Cel.End(xlUp).Row
Next Cel
For Each Cel In Range("D3").Resize(250)
If Cel.End(xlToRight).Column < ColDeb Then ColDeb = Cel.End(xlToRight).Column
Next Cel
For Each Cel In Range("IU3").Resize(250)
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


Bien cordialement
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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
Ajouter un commentaire
Utile
+0
moins plus
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
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !