Filtrer les cellules avec proprieté X dans une Plage

Mi_

XLDnaute Occasionnel
Bonjour le forum,

Pour filtrer rapidement les cellules contenant des commentaires, dans une plage très étendue, il y a

Set Plage = Range("A1:Z2000")
Set PlageCom = Plage.SpecialCells(xlCellTypeComments)

Où PlaceCom, qui designe les cellules contenant des commentaires, est facilement utilisable pour d'autres actions VBA.

Je vous demande s'il existe un moyen similaire de filtrer les cellules ayant le fond rouge (interior.colorindex = 3) dans une plage A1:Z2000.

Merci d'avance pour toute idée.
Mi_
 
Dernière édition:

JeanMarie

XLDnaute Barbatruc
Re : Filtrer les cellules avec proprieté X dans une Plage

Bonjour

Essaye ce code
Code:
Public Sub Mi_CelluleRouge()
Dim I As Long
Dim bigRange As Range
For I = 1 To 65536
   If Cells(I, 6).Interior.ColorIndex = 3 Then
      If bigRange Is Nothing Then
         Set bigRange = Cells(I, 6)
      Else
         Set bigRange = Application.Union(bigRange, Cells(I, 6))
      End If
   End If
Next I
bigRange.Select
End Sub

@+Jean-Marie
 

JeanMarie

XLDnaute Barbatruc
Re : Filtrer les cellules avec proprieté X dans une Plage

Re...

J'ai adapté le code, en fonction de ta plage (autre plage, autre boucle)

Code:
Public Sub Mi_CelluleRouge()
Dim bigRange As Range
Dim vCell As Range
For Each vCell In Range("A1:Z2000")
   If vCell.Interior.ColorIndex = 3 Then
      If bigRange Is Nothing Then
         Set bigRange = vCell
      Else
         Set bigRange = Application.Union(bigRange, vCell)
      End If
   End If
Next vCell
bigRange.Select
End Sub

@+Jean-Marie
 

myDearFriend!

XLDnaute Barbatruc
Re : Filtrer les cellules avec proprieté X dans une Plage

Bonjour Mi_, Jean-Marie, le Forum,

Tout d'abord, je précise que la méthode présentée ci-dessous n'apporte rien de plus que celle de Jean-Marie (très efficace au demeurant), si ce n'est un gain en rapidité d'exécution.

Depuis Excel 2002, MS met à notre disposition une nouvelle propriété FindFormat de l'objet Application qui, associée à la méthode Find, permet d'obtenir un résultat similaire mais beaucoup plus rapide qu'une boucle testant chaque cellule de la plage source.

Code:
[SIZE=2]Sub PlageRouge()
[/SIZE][SIZE=2][COLOR=green]'myDearFriend! - juillet 2006[/COLOR][/SIZE]
[SIZE=2] [COLOR=navy]Dim [/COLOR]Cel[COLOR=navy] As [/COLOR]Range, Plage[COLOR=navy] As [/COLOR]Range
      [COLOR=green]'Définir le format de cellule à rechercher (fond = rouge)[/COLOR]
      Application.FindFormat.Interior.ColorIndex = 3
      [COLOR=green]'Obtenir la plage des cellules correspondant à ce format[/COLOR]
      [COLOR=navy]With[/COLOR] Sheets(1).Range("A1:Z2000")
            [COLOR=navy]Set[/COLOR] Cel = .Find(What:="", SearchFormat:=[COLOR=navy]True[/COLOR])
            [COLOR=navy]If Not [/COLOR]Cel[COLOR=navy] Is Nothing Then[/COLOR]
                  [COLOR=navy]Set[/COLOR] Plage = Cel
                  Do
                        [COLOR=navy]Set[/COLOR] Plage = Application.Union(Plage, Cel)
                        [COLOR=navy]Set[/COLOR] Cel = .Find(What:="", SearchFormat:=[COLOR=navy]True[/COLOR], After:=Cel)
                  [COLOR=navy]Loop While[/COLOR] Application.Intersect(Cel, Plage)[COLOR=navy] Is Nothing[/COLOR]
            [COLOR=navy]End If[/COLOR]
      [COLOR=navy]End With[/COLOR]
      Plage.[COLOR=navy]Select[/COLOR]
      MsgBox Plage.Address
[COLOR=navy]End[/COLOR] Sub[/SIZE]
Cordialement,
 

JeanMarie

XLDnaute Barbatruc
Re : Filtrer les cellules avec proprieté X dans une Plage

Re...

Merci Didier, j'ai quand même une question à te poser Didier.

J'utilise If bigRange Is Nothing Then et tu utilises If Not Cel Is Nothing Then

Que fait de plus ce Not dans la condition ?

@+Jean-Marie

 

myDearFriend!

XLDnaute Barbatruc
Re : Filtrer les cellules avec proprieté X dans une Plage

Salut Jean-Marie,

Le test que j'effectue est l'inverse du tien d'où le Not avant l'instruction pour moi. En effet, la méthode Find que j'utilise peut très bien renvoyer une valeur nothing si le format recherché n'existe pas dans la plage source. Il me faut impérativement pouvoir le tester pour empêcher le déroulement du code dans ce cas.

A bientôt,
Amicalement,
 

Mi_

XLDnaute Occasionnel
Bonsoir Jean-Marie, myDearFriend!, le forum

Avec un peu de retard je découvre les solutions proposées.

Le principal problème pour moi représente en fait la vitesse d'exécution, car je dois balayer une plage très vaste plusieurs centaines de fois, donc le résultat file à la vitesse de l'escargot enragé.

La solution de myDearFriend! est plus rapide, par contre l'application sera utilisée sur Excel 2000 aussi donc pas de fonction FindFormat.

Je garde le code de Jean-Marie mais la vitesse est très similaire au code que j'utilisais déjà, sorte de

For Each Cel in Range("A1:Z2000")
if Cel.Interior.Colorindex = 3 then
FaireA
Else
FaireB
end if
Next

Je répète, c'est affreusement long. Je croyais qu'il existe un équivalent de la fonction SpecialCells() car elle est vachement rapide.

Merci beaucoup en tout cas. ;)

Cordialement,
Mi_
 

Discussions similaires

Statistiques des forums

Discussions
312 325
Messages
2 087 306
Membres
103 513
dernier inscrit
adel.01.01.80.19