Filtre de données
Bonjour à tous
J'ai une liste d'appels reçu. Le problème est que lorsqu'un appel n'est pas pris immédiatement, il apparaît plusieurs fois dans les données à quelques secondes d'écart. J'aimerais enlever ces doublons.
Mes différents champs sont :
J'ai essayé d'enlever les numéros ayant une durée de 0 sec mais je perd également les appels qui ont été tout simplement manqués.
Donc j'aimerais enlever uniquement les lignes des appels venant d’un numéro dont il existe une autre ligne d’un appel du même numéro avec une durée différente de 0.
Est-ce possible ?
Merci d'avance.
Bonjour et bienvenue sur le forum
Joins ton fichier et on regardera ça !
Bye !
Ouaip, fichier en CSV c'est bon ?
EDIT : je le met en xlsx, ça me parait plus logique
Merci. Mais je n'arrive pas à le tester. Comment dois-je m'y prendre ?
EDIT: J'ai réussi à le tester. Cette solution me convient mais n'est pas tout à fait suffisante.
Le problème est qu’apparemment, quand un appel est passé, un lignes s'ajoute pour l'appel lui-même mais d'autres lignes s'ajoutent aussi pendant toute la durée de l'appel, des lignes avec une durée de 0s. Ce sont ces lignes, et aussi celle que tu as réussi à enlever, que j'aimerais enlever.
Bonjour,
sans beaucoup toucher au code de GMB (que je salue), une petite modif qui teste si la colonne "duration" est égale à zéro:
For i = 1 To UBound(tablo, 1)
If tablo(i, 3) = 0 Then GoTo suivant ' tester si duration zéro, si 0 on va au suivant
If dico.exists(tablo(i, 2) & tablo(i, 4)) Then
dico(tablo(i, 2) & tablo(i, 4)) = Application.Max(dico(tablo(i, 2) & tablo(i, 4)), tablo(i, 3))
Else
dico(tablo(i, 2) & tablo(i, 4)) = tablo(i, 3)
End If
suivant:
Next iBonjour à tous
Merci Patrick pour la modif.
On va attendre la réaction de escsr pour savoir si elle règle son problème et si on peut s'en tenir là.
Bye !
Merci à vous deux pour votre aide. Le résultat me convient à première vu.
Il y a juste un problème au niveau des dates, dont le format change sur certaines lignes (JJ/MM/AA en MM/JJ/AA), ce qui pose problème pour la construction de graphique.
J'aimerais aussi si possible avoir une explication sur l'ensemble de boucles imbriquées suivant :
k = 1
For i = 0 To dico.Count - 1
For ln = 1 To UBound(tablo, 1)
If tablo(ln, 2) & tablo(ln, 4) = clé(i) And dico(tablo(ln, 2) & tablo(ln, 4)) = it(i) Then
ReDim Preserve tablor(1 To UBound(tablo, 2), 1 To k + 1)
For j = 1 To UBound(tablo, 2)
tablor(j, k) = tablo(ln, j)
Next j
k = k + 1
Exit For
End If
Next ln
Next iIl s'agit en fait d'un problème de VBA qui, par défaut, considère une date au format américain. Cela joue pour les 12 premiers jours du mois..escsr a écrit :Il y a juste un problème au niveau des dates, dont le format change sur certaines lignes (JJ/MM/AA en MM/JJ/AA
On s’en sort en travaillant avec les dates en format nombre
Voir les commentaires de la nouvelle macro....avoir une explication sur l'ensemble de boucles imbriquées suivant...:
OK ?
Bye !
re,
assez curieusement, GMB, j'ai testé et toutes les cellules de la colonne date ne se mettent pas au bon format ...
et ça se fait partiellement, pas sur toutes
J'ai modifié ici pour que ça soit au format date mais j'aimerais avoir ton avis sur ça ...si tu as aussi le soucis sur le tableau
Range("J2").CurrentRegion.Offset(1, 0).ClearContents
For i = 1 To UBound(tablor, 2)
tablor(6, i) = CDate(tablor(6, i)) ' 6e colonne (date) au format date
Next
Range("J2").Resize(UBound(tablor, 2), UBound(tablor, 1)) = Application.Transpose(tablor)P.
@Patrick
Un vrai casse-tête ce problème de format de date américain.
J'ai testé maintes solutions qui marchent dans certains cas mais pas dans d'autres.
Le plus sûr, à mon sens, est celui que j'ai indiqué dans mon dernier message et appliqué dans la version 2.
Il consiste à demander à la macro de prendre non la date contenue dans une cellule mais sa valeur, en mettant auparavant cette cellule au format nombre et non date. Une cellule qui contient par exemple 10/07/2017 doit alors contenir 42926.
Pour les américains comme pour les petits français comme gmb, et surtout pour VBA, il n'y a plus de confusion possible car cette valeur est le nombre de jours écoulés à aujourd'hui depuis le 31décembre 1899. Et le 10/07/2017 (42926) ne pourra pas être pris pour le 07/10/2017 (43015)
Bye !
Bonjour,
En y regardant de plus près, j'ai remarqué qu'il y avait des erreurs dans le résultat. Des lignes qui devraient être présentes sont absentes et vice-versa.
J'ai fait mon propre pseudo code en m'inspirant de votre solution. Pensez-vous pouvoir le programmer ? (J'ai de expérience dans la programmation mais je ne connaissais rien à VBA il y a quelques jours et j'ai du mal) Sinon seriez-vous disponible pour répondre à mes questions ?
Le principe est d'avoir un dictionnaire avec comme clé le numéro appelant et comme item des tableaux contenant les lignes qui correspondent au numéro appelant. On parcourt les lignes du tableau et pour chacune, on la met dans le tableau correspondant du dictionnaire si la durée de l'appel est non nul ou si il n'existe pas d'autre ligne d'appel ayant été fait à +/- 20 minutes de l'appel.
A la fin, tous les appels qui doivent être filtré seront filtré.
Déclaration :
- Tablo -> contiendra la feuille
- Dico -> dictionnaire (callingNumber, tableau de ligne)
- tabTmp -> tableau temporaire pour modifier les tableau du dico
mettre toute la feuille dans tablo
Créer le dictionnaire
Pour chaque ligne de tablo :
S’il existe un tableau correspondant dans le dico alors
Si la durée est égal à 0 alors
Pour chaque ligne dans le tableau correspondant :
Si durée != 0 et date proche alors
Passer à la ligne de tablo suivante
Sinon mettre la ligne dans le tableau correspondant dans le dico
Sinon
Compter le nombre de ligne dans le tableau correspondant
Redimensionner tabTmp selon le nombre de ligne trouver
Mettre le tableau correspondant dans tabTmp
Rajouter la ligne dans tabTmp
Remplacer le tableau correspondant dans le dico par tabTmp
Sinon
Créer un tableau
Mettre la ligne dans le tableau
Placer le tableau dans le dico
Pour chaque item du dico
Pour chaque ligne de l’item
Ajouter la ligne dans une feuille
Trier la feuille par date puis par heure
Afficher la feuilleBonjour
Désolé mais ça, je ne sais pas faire.Mettre un numéro de ligne comme item oui, mais pas un tableau, fut-il de lignesescsr a écrit :Déclaration :
- Tablo -> contiendra la feuille
- Dico -> dictionnaire (callingNumber, tableau de ligne)
Bye !
Sinon j'avais écris un deuxième algorithme avec une complexité algorithmique un peu supérieure mais peut-être plus simple à écrire. Je reprends d'ailleurs votre idée de remplacer les lignes par les numéros de ligne.
Le voici :
Déclaration :
- feuille
- tablo -> tableau (nx1) contenant les numéros des lignes
Pour chaque ligne de la feuille :
Si la durée est égale à 0 alors
Pour chaque numéro de ligne dans tablo :
Si durée != 0 et date proche et même numéro appelant alors
Passer à la ligne suivante
Mettre la ligne dans le tableau
Sinon mettre la ligne dans le tableau
Afficher le tableauBonjour
Si date proche de quoi ?escsr a écrit :Si durée != 0 et date proche
La date je suppose est celle de la colonne B mais on doit la comparer à quelle valeur de la même ligne ?
Bye !
Bonjour,
ça ne serait pas d'éliminer donc les lignes à zéro (comme déjà fait) mais s'il existe plusieurs lignes "phoneline" ou "callingNUmber" (?
précision à donner) de n'en garder qu'une ?
P.
@gmb
Je pensais utiliser l'heure des deux lignes que je compare, vérifier si la valeur absolue de la différence est inférieur à 2000 (d'après le format, 2000 correspond donc à 20 minutes, valeur arbitrairement choisie) puis vérifier si la date est la même. Pour la date, je ne sais pas si un simple test "=" suffit.
@patrick1957
Oui, comme expliqué dans mon premier message, je pourrais simplement utiliser un filtre d'Excel (sans passer par des macro vba) pour enlever tous les appels dont la durée est égale à 0s, mais je perds ainsi les appels manqués. Le soucis est que le dispositif d'ovh qui récupère les données est selon moi mal fichu, il rajoute beaucoup de lignes incohérentes de durée égale à 0s. Ce sont ces lignes là que j'aimerais enlever. Elles apparaissent proches des appels réels, d'où ma fourchette de 20 min donnée plus haut.
J'ai fait ce code là. Je n'ai pas pu le tester, je dois encore faire en sorte que le nouveau tableau apparaissent comme ce que vous avez fait dans le premier programme que vous m'avez donné.
Option Explicit
Dim n&, taille&
Dim tablo(), ligne As Integer, Rows
Sub filtre()
n = Range("A" & Rows.Count).End(xlUp).Row
taille = 0
For i = 1 To n
If Cells(i, 3) = 0 Then
For j = 1 To UBound(tablo)
If Cells(tablo(j), 3) <> 0 And Abs(Cells(i, 7) - Cells(tablo(j), 7)) < 2000 And Cells(i, 4) = Cells(tablo(j), 4) Then
Next i
End If
End If
ReDim Preserve tablo(taille To taille + 1)
taille = taille + 1
tablo(taille) = i
Next iPeux tu mettre un exemple concret avec le avant et le après sur une date ou un numéro appelé/appelant ?
On verra ainsi quelles ligne tu veux éliminer et sur base de quoi
escsr a écrit :Je pensais utiliser l'heure des deux lignes que je compare
Comment ça deux lignes que tu compares ? Tu dis passer chaque ligne mais tu ne dis pas avec laquelle tu fais la comparaison...
Bye !
Pour l'exemple concret, en voici 4 (170445 signifie 17h04min et 45s):
+33186958725 20170630170445 222 +33614517478 transfert 30/06/2017 170445 13266169759
+33186958725 20170630170445 0 +33614517478 transfert 30/06/2017 170445 13266145735
+33186958725 20170630170445 0 +33614517478 transfert 30/06/2017 170445 13266145594Ici, les deux dernières lignes sont à supprimer.
+33186958725 20170630170329 20 +33614517478 transfert 30/06/2017 170329 13266143086
+33186958725 20170630170343 0 +33614517478 transfert 30/06/2017 170343 13266140416
+33186958725 20170630170336 0 +33614517478 transfert 30/06/2017 170336 13266137433ici, les deux dernière lignes sont également à supprimer.
+33186958725 20170630145045 136 +33145057079 transfert 30/06/2017 145045 13265329696
+33186958725 20170630145041 0 +33145057079 transfert 30/06/2017 145041 13265312060
+33186958725 20170630145040 0 +33145057079 transfert 30/06/2017 145040 13265312003
+33186958725 20170630145048 0 +33145057079 transfert 30/06/2017 145048 13265311698
+33186958725 20170630145034 0 +33145057079 transfert 30/06/2017 145034 13265311618
+33186958725 20170630145047 0 +33145057079 transfert 30/06/2017 145047 13265311090
+33186958725 20170630145026 0 +33145057079 transfert 30/06/2017 145026 13265309883ici, idem, les 6 dernières lignes sont en trop.
Un petit exemple d'appel réellement manqué pour la route :
+33186958725 20170629150655 0 +33961450032 transfert 29/06/2017 150655 13261209671
+33186958725 20170629150710 0 +33961450032 transfert 29/06/2017 150710 13261209088
+33186958725 20170629150648 0 +33961450032 transfert 29/06/2017 150648 13261207992
+33186958725 20170629150649 0 +33961450032 transfert 29/06/2017 150649 13261207669
+33186958725 20170629150709 0 +33961450032 transfert 29/06/2017 150709 13261207636
+33186958725 20170629150656 0 +33961450032 transfert 29/06/2017 150656 13261207554Ici, aucun appel n'a de durée différente de 0s, j'en déduis que c'est un appel manqué. Je garde donc une seule ligne.
@gmb
Je met le numéro des lignes que je veux garder dans un tableau, je compare les lignes de ma feuilles à ces lignes là, en passant par leur numéro. Et je rempli donc ce tableau de numéro de ligne petit à petit.
Je suis navré si tout cela ne semble pas clair, et vous remercie grandement pour votre patience et votre aide !!