filtrer des lignes en fonction d'une condition | ||
---|---|---|
Inscription: 26/07/2013
Messages:
8
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 08-08-2013 18h13
Bonjour à tous !!
Me revoilà avec un nouveau problème de filtrage de données. J'aimerai supprimer automatiquement certaines lignes en fonction de plusieurs données.
Voila ma structure actuelle : date | heure | numéro | durée | Statut 2013-07-26 | 17:23:24 | 04 72 70 97 04 | 00:07:09 | Reçu 2013-07-26 | 17:02:13 | 09 67 00 22 34 | 00:00:00 | Manqué 2013-07-26 | 17:01:44 | 09 67 00 22 34 | 00:00:00 | Manqué 2013-07-26 | 17:01:15 | 09 67 00 22 34 | 00:00:00 | Manqué 2013-07-26 | 16:23:24 | 04 72 70 97 04 | 00:07:09 | Reçu
Et la structure que j'aimerai : date | heure | numéro | durée | Statut 2013-07-26 | 17:23:24 | 04 72 70 97 04 | 00:07:09 | Reçu 2013-07-26 | 17:02:13 | 09 67 00 22 34 | 00:00:00 | Manqué 2013-07-26 | 16:23:24 | 04 72 70 97 04 | 00:07:09 | Reçu
En gros c'est une condition à mettre en place : Si (numéro de téléphone identique sur plusieurs lignes) et si (appel passé dans les 32sec suivantes) alors (suppression de toute les lignes sauf la dernière arrivée (en fonction de l'heure))
Je sais pas si c'est bien expliqué. Et je doute que cela soit possible, ou sinon je sous-estime la puissance d'Excel, ce que j'espère être le cas !! :D
Merci pour vos avis d'experts
Mickaël |
|
|
Re: filtrer des lignes en fonction d'une condition | ||
---|---|---|
Inscription: 23/05/2008
De La Varenne Saint-Hilaire
Messages:
356
Système d'exploitation: PC Version Excel utilisée: 2010 |
Posté le : 08-08-2013 21h51
Bonjour Mickaël, bonjour à tous,
Une suggestion par macro avec ce code, mais on peut aussi bien le faire à la main avec une formule et une suppression de lignes si cela te semble trop compliqué.
Le code dans un module standard, affecté au bouton "Go" dans la feuille 1 du fichier joint: Sub Macro1() Dim Dlig As Long With Sheets("Feuil1") 'test pour éviter de traiter plusieurs fois les données If .Cells(1, 6) = "Données traitées" Then Exit Sub 'calcul de la dernière ligne Dlig = .Cells(Rows.Count, 1).End(xlUp).Row 'tri des données With .Sort.SortFields .Clear .Add Key:=Range("A2:A" & Dlig), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Add Key:=Range("B2:B" & Dlig), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Feuil1").Sort .SetRange Range("A1:E" & Dlig) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With 'formule de test colonne F(même numéro, appel > 32 secondes) .Range("F2").FormulaR1C1 = _ "=IF(AND(SUMPRODUCT((R2C1:R6C1=RC[-5])*(R2C3:R6C3=RC[-3]))>1,RC[-4]-R[-1]C[-4]>0.00037037037037037),""ok"",NA())" .Range("F2").Copy .Range("F2:F" & Dlig) ' élimination des erreurs .Range("F3:F" & Dlig).SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete 'Efface la colonne F .Columns("F:F").ClearContents 'indicateur données traitées .Cells(1, 6) = "Données traitées" End With End Sub Si non avec une formule voir feuille 2 du fichier joint
Vois si cela peut t'aider,
Très bonne soirée,
mth |
|
|
Re: filtrer des lignes en fonction d'une condition | ||
---|---|---|
Inscription: 26/07/2013
Messages:
8
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 09-08-2013 18h57
Bonjour Mth,
C'est génial, c'est effectivement ce que je cherche à faire. Ca marche à la perfection sur ton fichier, par contre sur le mien ça ne fonctionne pas.
Peut-être est-ce parce que mon tableau comporte plus de 1000 lignes, est-ce que tu as basé le code sur la longueur max du tableau ou sur une valeur arrêtée à 6 lignes ?
Maintenant que tu sais que j'ai plus de 1000 lignes sur ce tableau, tu comprends que la deuxième solution risque d'être un peu longue à traiter.
Merci en tous les cas, ça me donne une bonne base de travail, je vais tenter de m'instruire sur le visual basic et voir si j'arrive à modifier ton code !!
|
|
|
Re: filtrer des lignes en fonction d'une condition | ||
---|---|---|
Inscription: 23/05/2008
De La Varenne Saint-Hilaire
Messages:
356
Système d'exploitation: PC Version Excel utilisée: 2010 |
Posté le : 09-08-2013 23h00
re bonjour Mickaël,
J'ai fait une bêtise dans le premier fichier, vraiment désolée, voici en PJ la correction (il s'agit de la formule colonne F qui n'allait pas du tout): Option Explicit Sub Macro1() Dim Dlig As Long With Sheets("Feuil1") 'test pour éviter de traiter plusieurs fois les données If .Cells(1, 6) = "Données traitées" Then Exit Sub 'calcul de la dernière ligne Dlig = .Cells(Rows.Count, 1).End(xlUp).Row 'tri des données With .Sort.SortFields .Clear .Add Key:=Range("A2:A" & Dlig), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Add Key:=Range("B2:B" & Dlig), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Feuil1").Sort .SetRange Range("A1:E" & Dlig) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With 'formule de test colonne F(même numéro, appel > 32 secondes) .Range("F2").FormulaR1C1 = _ "=IF(RC[-3]<>R[-1]C[-3],""ok"",IF(RC[-4]-R[-1]C[-4]>0.00037037037037037,""ok"",NA()))" .Range("F2").Copy .Range("F2:F" & Dlig) ' élimination des erreurs .Range("F3:F" & Dlig).SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete 'Efface la colonne F .Columns("F:F").ClearContents 'indicateur données traitées .Cells(1, 6) = "Données traitées" End With End Sub
Si tu n'es pas fan de VBA tu feras aussi bien avec l'interface Excel: En cellule F2 tu écris cette formule puis tu la copie vers le bas jusqu'à la dernière ligne remplie de ton fichier: =SI(C2<>C1;"ok";SI(B2-B1>0.037;"ok";NA())) Tu auras donc colonne F soit le libellé "ok", soit l'erreur #N/A Sélectionne ta colonne F Dans la menu "Accueil" clique sur "Rechercher et Sélectionner "au bout à droite et choisis "Sélectionner les cellules" Là tu coches la case "Formules" et tu ne laisses que la case "Erreurs" cochée Dans ta colonne F seules les cellules #N/A sont maintenant sélectionnées. En faisant un clic droit sur une de ces cellules au hasard (attention de ne pas tout désélectionner) tu choisis "Supprimer" et tu coches "Ligne entière" Une fois que tu as validé, toutes les lignes indésirables ont été supprimées.
C'est plus long à dire qu'à faire, c'est une petite manip qui te servira à bien des occasions.
En espérant que cela puisse t'aider,
Bonne soirée,
mth
|
|
|
Re: filtrer des lignes en fonction d'une condition | ||
---|---|---|
Inscription: 26/07/2013
Messages:
8
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 13-08-2013 09h07
Génial, ça fonctionne bien, merci Mth !!
Une dernière chose, que je comprend pas, si je souhaite modifier la condition de temps (32sec) et la passer à 1min par exemple. C'est bien la valeur "0.00037037037037037" qui faut que je modifie non ? Mais je ne comprends pas à quoi correspond exactement ce chiffre.
Merci pour ton aide
Mickaël |
|
|
Re: filtrer des lignes en fonction d'une condition | ||
---|---|---|
Inscription: 26/07/2013
Messages:
8
Système d'exploitation: PC Version Excel utilisée: 2007 |
Posté le : 13-08-2013 17h28
J'ai cherché un peu plus et trouver la signification. C'est dans le format de cellule que je peux trouver la correspondance.
1min : 0,00069444
Merci pour les commentaires sur le code et ton aide !
Mickaël |
|
|