Ignorer cellules vides dans plage de cellules

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

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

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

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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
482
Réponses
3
Affichages
485
Réponses
3
Affichages
569
  • Question Question
Microsoft 365 VBA Transpose
Réponses
11
Affichages
727
Retour