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

Résolu
mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   -  
mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   -
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

4 réponses

  1. Gyrus Messages postés 3360 Statut Membre 526
     
    Bonjour,

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

    A+
    0
    1. mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   11
       
      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
  2. Gyrus Messages postés 3360 Statut Membre 526
     
    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
    1. mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   11
       
      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
    2. Gyrus Messages postés 3360 Statut Membre 526 > mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention  
       
      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
    3. mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   11 > Gyrus Messages postés 3360 Statut Membre
       
      Bonjour et merci pour la solution, qui bien sur fonctionne très bien.

      bien cordialement
      0
    4. mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   11 > Gyrus Messages postés 3360 Statut Membre
       
      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
    5. Gyrus Messages postés 3360 Statut Membre 526 > mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention  
       
      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
  3. mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   11
     
    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
  4. mijean94 Messages postés 413 Date d'inscription   Statut Membre Dernière intervention   11
     
    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