Condition sur des données filtrées

[Résolu/Fermé]
Signaler
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016
-
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016
-
Bonjour,

Toujours dans ma réalisation d'indicateurs, je bute actuellement sur une impasse on va dire.

Je décris ce que je fais et désire en plusieurs points:

-Réaliser un premier filtre qui tri une première fois les données sur la feuille 1.
-Réaliser sur ce filtre existant un deuxième tri toujours sur les données de la feuille 1.
-Réaliser une condition qui permet de chercher dans la colonne BV quand la date du jour est supérieure aux dates (Now > La_date) où La_date est une date qui peut soit être inférieure à la date du jour soit supérieure.
-Renvoyer toutes les lignes filtrées respectant la condition dans une autre feuille que l'on nommera "Feuil3", et ne copier coller que certaines colonnes.

J'ai fait une réalisation de code, mais j'ai l'impression que ce qui bloque c'est de faire la condition sur un filtre, car je réalise le filtre puis la condition, mais j'ai l'impression que la condition ne prend pas en compte le filtrage, ou bien ce sont les données collées qui n'en prennent pas compte. Du coup, je suis passé par une astuce où je scinde les étapes en ouvrant une nouvelle feuille 2 et réalisant la dernière partie de ce que je souhaite obtenir, je vais vous montrer ce code qui marche, mais ma question est : m'est-il possible de réaliser ce que je fais sans passer par cette feuille intermédiaire?

Voici le code :

Option Explicit

-----------------------------------------------------
Private Sub CommandButton1_Click()

'Dim Dernligne As Integer, Lig As Integer, Lg As Integer
Dim La_date As Date
Dim Date_test As Date
Dim n As Integer
Date_test = Now()
Dim DerColonne As Integer
Dim Cl As Integer
Dim dernligne As Integer, T_statut
Dim cptr As Byte, Statut As String
Dim Idx As Integer, Nbre As Integer

'Cache les traitements et défilements
Application.CutCopyMode = False
Application.ScreenUpdating = False

'Ajout de la feuille test
Sheets.Add.Name = "test"

'Nettoyage des anciennes données précédentes
Sheets("Feuil3").Select
Range("A2:CX10000").Select
Selection.Delete

'On enlève tous les filtres déjà présents
Sheets("Feuil1").AutoFilterMode = False

'Filtrage 1
Selection.AutoFilter
Worksheets("Feuil1").Range("A2:CX65536").AutoFilter Field:=42, Criteria1:="=Ordre de fabrication", Operator:=xlOr, Criteria2:="=OF non standard"
'Sous filtrage en fonction du statut Lancé
Selection.AutoFilter
Worksheets("Feuil1").Range("A2:CX65536").AutoFilter Field:=75, Criteria1:="Lancé"

Dim Lg As Integer
Dim Lig As Integer
Dim ligne As String

dernligne = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row

Lg = 1
'Boucle sur les lignes
For Lig = 3 To dernligne (car la première date commence ligne 3)

La_date = Sheets("Feuil1").Range("BV" & Lig).Value
If La_date < Now Then

Sheets("Feuil1").Select
Range("A" & Lig & ":BW" & Lig).Select
Selection.Copy
'collage dans synthese
Sheets("Feuil2").Select
Lg = Lg + 1
Range("A" & Lg).Select
ActiveSheet.Paste

End If
Next


'Filtrage des types d'OF en standard et non standard
'Selection.AutoFilter
Worksheets("Feuil2").Range("A2:CX65536").AutoFilter Field:=42, Criteria1:="=Ordre de fabrication", Operator:=xlOr, Criteria2:="=OF non standard"
'Sous filtrage en fonction du statut Lancé
'Selection.AutoFilter
Worksheets("Feuil2").Range("A2:CX65536").AutoFilter Field:=75, Criteria1:="Lancé"


With Sheets("Feuil2")
Union(.Columns(3), .Columns(4), .Columns(5), .Columns(42), .Columns(47), .Columns(49), .Columns(52), .Columns(54), .Columns(55), .Columns(67), .Columns(74)).Copy Sheets("Feuil3").Range("A1")
End With


Application.DisplayAlerts = False
Sheets("Feuil2").Delete
Application.DisplayAlerts = True


End Sub


Merci d'avance si une solution est possible, car déjà, le problème que j'avais avant, c'est qu'il ne me copiait/collait pas les données filtrées, mais seulement celles qui avaient la condition de la date. Ensuite, c'est pour ça que je réaliser un deuxième filtre une nouvelle fois.

3 réponses

Messages postés
13114
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
14 octobre 2021
2 263
Bonjour

Pourquoi filtrer avant et ne pas plutôt ne recopier que les valeurs respectant les 3 conditions ?
Exemple un tableau avec en colonne B les jours, en colonne C le service et en colonne E la date ; je ne veux copier que les dates<aujourdhui des lundi du service compta

For lig=3 to dernligne
le_jour=range("B" & lig)
le_service=range("C" & lig)
la_date=range("E" & lig)

If le_jour="lundi and le_service="compta" and la_date<now then
Sheets("Feuil1").Select
Range("A" & Lig & ":BW" & Lig).Select
Selection.Copy

etc

Cdlmnt
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016

Bonjour via55,

Je ne sais pas pourquoi je suis allé me prendre la tête alors qu'il y avait plus simple. Donc en effet ça marche et c'est plus rapide, et du coup je pourrais supprimer les colonnes dont je n'ai pas besoin par la suite. Ensuite, un peu délicat, comment puis-je faire lorsque, prenons par exemple la colonne D, si elle possède des valeurs fixes, et qu'il y en a 3, et que je désire en afficher que 2 d'entre elles, comment faire?


Car concrètement, si je procède ainsi:

Je déclare la première variable le_service1 = range("D" & lig) pour avoir le service compta puis que je déclare cette variable le_service2 = range("D" & lig) pour avoir le service bureau des études, je savais d'avance que ça bloquerait si je procédais ainsi puisque vba ne me prendra dans ma condition que la première valeur donnée pour la colonne.

Je montre ce qui ne marche pas:

For lig=3 to dernligne
le_jour=range("B" & lig)
le_service1=range("D" & lig)
le_service2=range("D" & lig)
la_date=range("E" & lig)

If le_jour="lundi and le_service1="compta" and le_service2 = "bureau des études" and la_date<now then
Sheets("Feuil1").Select
Range("A" & Lig & ":BW" & Lig).Select
Selection.Copy

etc

C'est au niveau de la condition que je ne vois pas comment l'écrire. J'ai voulu essayer d'utiliser ça "Operator:= X" avec X étant soit Or soit And, mais je pense que je me trompe de syntaxe
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016

Problème résolu. J'effectue un filtre où il y a deux valeurs à afficher venant d'une même colonne puis je fais les autres conditions normalement ensuite.

Merci encore via55 pour m'avoir dépanné.
Messages postés
13114
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
14 octobre 2021
2 263
Bien !

Néanmoins pour le faire par macro, il n'y a pas deux le_service puisque c'est la même cellule et il faut bien appliquer la condition OR ainsi
If le_jour="lundi and ( le_service1="compta" OR le_service1 = "bureau des études" ) and la_date<now then

Cdlmnt
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016

Merci pour la syntaxe du OR, je pense utiliser ça du coup car c'est plus rapide à traiter les données, après, j'ai une petite question si ça ne vous dérange pas. En terme d'optimisation, pourquoi un filtre automatique en vba met plus de temps à réaliser le traitement que la condition?
Messages postés
13114
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
14 octobre 2021
2 263
Là tu me poses une colle ! Je ne sais pas. La différence est vraiment importante ? Tout dépend bien sur du nombre de lignes traitées
On peut supposer dans ton cas que le filtre lisait toutes les données et cachait les lignes non désirées et qu'ensuite la macro reportait les donnés; ce qui peut prendre un peu plus de temps que simplement lire les données et reporter celles satisfaisant à la condition
Messages postés
34
Date d'inscription
mercredi 25 juin 2014
Statut
Membre
Dernière intervention
17 août 2016

Je pense aussi en effet, c'est 10 000 lignes à traiter!