Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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 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



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
Ok je vais tester cette solution egalement !

1000 merci
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Exemple avec 4 critères.

Temps de réponse pour 1000 lignes (0,2 sec)


Boisgontier
 

Pièces jointes

  • Copie de test moteur recherche v3.xlsm
    109.1 KB · Affichages: 26
Dernière édition:

Nico44044

XLDnaute Nouveau
Merci Boisgontier et job75 pour votre aide !!

Si j'ai bien compris, de vos 2 solutions, l'une est plus facilement adaptable sinon rajoute des colonnes /criteres, et l'autre est plus rapide au de la de 1000 lignes ?

C'est bien ca ?
 

Discussions similaires

Réponses
11
Affichages
297
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…