Ignorer cellules vides dans plage de cellules

Nico44044

XLDnaute Nouveau
Bonsoir à tous,

Je souhaiterais pouvoir effectuer une recherche dans une feuille excel en effectuant une comparaison entre plusieur plage de cellules, en ignorant les cellules vide.(le tout en VBA)

J'ai un début de piste mais je bloque pour la suite.

Je joint un fichier avec plus de precisions ...

Ce code fonctionne il ne me reste plus qu'a trouver comment ignorer les criteres vide dans Range("A1:C1")


Option Explicit Sub es()
Dim a, b, c, d As Variant, i As Long, j As Long, t As Long, J1 As Long
Application.ScreenUpdating = False
With ActiveSheet.UsedRange For t = 2 To 15
a = Range("A1:C1").Value
b = Range("A" & t & ":C" & t).Value
c = Range("D" & t & ":F" & t).Value
d = Range("G" & t & ":I" & t).Value
For i = LBound(a, 2) To UBound(b, 2)
For j = LBound(a, 1) To UBound(a, 1)
If a(j, i) = b(j, i) Or a(j, i) = c(j, i) Or a(j, i) = d(j, i) Then
Else
Rows(t).Hidden = True
End If
Next j
Next i
Next t
End With
End Sub

Merci d'avance à celui qui pourra m'aider
 

Pièces jointes

  • test moteur recherche v2.xlsm
    19.2 KB · Affichages: 29

job75

XLDnaute Barbatruc
Bonsoir Nico44044, eriiiic,

Une solution très classique dans le fichier joint avec le filtre avancé :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion.Resize(, 3)
    .Rows(2).EntireRow.Insert
    .Cells(2, 1) = "c1": .Cells(2, 2) = "c2": .Cells(2, 3) = "c3" 'titres provisoires
    .Cells(3, 10) = "=AND((A3=A$1)+ISBLANK(A$1),(B3=B$1)+ISBLANK(B$1),(C3=C$1)+ISBLANK(C$1))" 'critères
    .Offset(1).AdvancedFilter xlFilterInPlace, .Cells(2, 10).Resize(2) 'filtre avancé
    .Cells(3, 10) = ""
    .Rows(2).EntireRow.Delete
End With
End Sub

Sub RAZ()
If Feuil1.FilterMode Then Feuil1.ShowAllData
End Sub
Bonne nuit.
 

Pièces jointes

  • test moteur recherche(1).xlsm
    23.3 KB · Affichages: 19

Nico44044

XLDnaute Nouveau
Bonsoir Nico44044, eriiiic,

Une solution très classique dans le fichier joint avec le filtre avancé :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion.Resize(, 3)
    .Rows(2).EntireRow.Insert
    .Cells(2, 1) = "c1": .Cells(2, 2) = "c2": .Cells(2, 3) = "c3" 'titres provisoires
    .Cells(3, 10) = "=AND((A3=A$1)+ISBLANK(A$1),(B3=B$1)+ISBLANK(B$1),(C3=C$1)+ISBLANK(C$1))" 'critères
    .Offset(1).AdvancedFilter xlFilterInPlace, .Cells(2, 10).Resize(2) 'filtre avancé
    .Cells(3, 10) = ""
    .Rows(2).EntireRow.Delete
End With
End Sub
Sub RAZ()
If Feuil1.FilterMode Then Feuil1.ShowAllData
End Sub

Sub RAZ()
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
End Sub
Bonne nuit.


Bonsoir job75,

Merci pour ta proposition mais je pense qu'elle ne rempli pas toutes mes attentes :)
Si tu essaies de chercher par exemple uniquement les véhicules de couleur Noir, cela ne donne qu'une seule ligne alors qu'il y en a beacoup plus ... j'ai l'impression que ta macro cherche uniquement dans la zone bleu alors que je souhaiterais qu'elle cherche aussi dans la zone grise et orange ...
Approche interessante cependant.
Penses-tu qu'elle serait facilement adaptable avec bcp plus de criteres ? (dans la mesure ou on arriverai a la faire fonctionner avec un seul critere à la fois, ou 2 ou 3 etc ...)
 

job75

XLDnaute Barbatruc
Re,

Ah mais bien sûr, il y a 3 tableaux et je ne filtrais que le 1er, ceci va bien :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion.Resize(, 9)
    .Rows(2).EntireRow.Insert
    .Cells(2, 1) = "c1": .Cells(2, 1).AutoFill .Cells(2, 1).Resize(, 9) 'titres provisoires
    .Cells(3, 10) = "=AND((A3=A$1)+ISBLANK(A$1),(B3=B$1)+ISBLANK(B$1),(C3=C$1)+ISBLANK(C$1))" & _
        "+AND((D3=A$1)+ISBLANK(A$1),(E3=B$1)+ISBLANK(B$1),(F3=C$1)+ISBLANK(C$1))" & _
        "+AND((G3=A$1)+ISBLANK(A$1),(H3=B$1)+ISBLANK(B$1),(I3=C$1)+ISBLANK(C$1))" 'critères
    .Offset(1).AdvancedFilter xlFilterInPlace, .Cells(2, 10).Resize(2) 'filtre avancé
    .Cells(3, 10) = ""
    .Rows(2).EntireRow.Delete
End With
End Sub

Sub RAZ()
If Feuil1.FilterMode Then Feuil1.ShowAllData
End Sub
Fichier (2).

Re-bonne nuit.
 

Pièces jointes

  • test moteur recherche(2).xlsm
    23.6 KB · Affichages: 24

Nico44044

XLDnaute Nouveau
Re,

Ah mais bien sûr, il y a 3 tableaux et je ne filtrais que le 1er, ceci va bien :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion.Resize(, 9)
    .Rows(2).EntireRow.Insert
    .Cells(2, 1) = "c1": .Cells(2, 1).AutoFill .Cells(2, 1).Resize(, 9) 'titres provisoires
    .Cells(3, 10) = "=AND((A3=A$1)+ISBLANK(A$1),(B3=B$1)+ISBLANK(B$1),(C3=C$1)+ISBLANK(C$1))" & _
        "+AND((D3=A$1)+ISBLANK(A$1),(E3=B$1)+ISBLANK(B$1),(F3=C$1)+ISBLANK(C$1))" & _
        "+AND((G3=A$1)+ISBLANK(A$1),(H3=B$1)+ISBLANK(B$1),(I3=C$1)+ISBLANK(C$1))" 'critères
    .Offset(1).AdvancedFilter xlFilterInPlace, .Cells(2, 10).Resize(2) 'filtre avancé
    .Cells(3, 10) = ""
    .Rows(2).EntireRow.Delete
End With
End Sub

Sub RAZ()
If Feuil1.FilterMode Then Feuil1.ShowAllData
End Sub
Fichier (2).

Re-bonne nuit.



Ca fonctionne !

Penses-tu pouvoir adapter cette solution avec beacoup plus de criteres de recherches ?
Car j'en avais mis seulement 3 pour simplifier ma demande mais en pratique j'en ai beaucoup plus ... :)

En tout cas merci d'avoir pris le temps ;-)
 

job75

XLDnaute Barbatruc
Bonjour Nico44044, le forum,

Avec COUNTIF (NB.SI) les critères en A1 B1 C1 etc... peuvent être dans n'importe quel ordre :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion.Resize(, 9)
    .Rows(2).EntireRow.Insert
    .Cells(2, 1) = "c1": .Cells(2, 1).AutoFill .Cells(2, 1).Resize(, 9) 'titres provisoires
    .Cells(3, 10) = "=AND(COUNTIF(A3:I3,A$1)+ISBLANK(A$1),COUNTIF(A3:I3,B$1)+ISBLANK(B$1)" _
        & ",COUNTIF(A3:I3,C$1)+ISBLANK(C$1))" 'critères
    .Offset(1).AdvancedFilter xlFilterInPlace, .Cells(2, 10).Resize(2) 'filtre avancé
    .Cells(3, 10) = ""
    .Rows(2).EntireRow.Delete
End With
End Sub

Sub RAZ()
If Feuil1.FilterMode Then Feuil1.ShowAllData
End Sub
C'est plus facile à écrire mais le calcul prend plus de temps.

Durées d'exécution sur un tableau de 50 000 lignes :

- macro du fichier (2) post #6 => 0,43 seconde

- macro de ce fichier (3) => 0,92 seconde.

Bonne journée.
 

Pièces jointes

  • test moteur recherche(3).xlsm
    24 KB · Affichages: 23

Nico44044

XLDnaute Nouveau
Bonjour Nico44044, le forum,

Avec COUNTIF (NB.SI) les critères en A1 B1 C1 etc... peuvent être dans n'importe quel ordre :
Code:
Sub Filtrer()
Application.ScreenUpdating = False
With Feuil1.[A1].CurrentRegion.Resize(, 9)
    .Rows(2).EntireRow.Insert
    .Cells(2, 1) = "c1": .Cells(2, 1).AutoFill .Cells(2, 1).Resize(, 9) 'titres provisoires
    .Cells(3, 10) = "=AND(COUNTIF(A3:I3,A$1)+ISBLANK(A$1),COUNTIF(A3:I3,B$1)+ISBLANK(B$1)" _
        & ",COUNTIF(A3:I3,C$1)+ISBLANK(C$1))" 'critères
    .Offset(1).AdvancedFilter xlFilterInPlace, .Cells(2, 10).Resize(2) 'filtre avancé
    .Cells(3, 10) = ""
    .Rows(2).EntireRow.Delete
End With
End Sub

Sub RAZ()
If Feuil1.FilterMode Then Feuil1.ShowAllData
End Sub
C'est plus facile à écrire mais le calcul prend plus de temps.

Durées d'exécution sur un tableau de 50 000 lignes :

- macro du fichier (2) post #6 => 0,43 seconde

- macro de ce fichier (3) => 0,92 seconde.

Bonne journée.
Ok je vais tester cette solution egalement !

1000 merci
 

Discussions similaires

Réponses
11
Affichages
280

Statistiques des forums

Discussions
312 103
Messages
2 085 317
Membres
102 862
dernier inscrit
Emma35400