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

Un essai à tester. Te convient-il ?

Bye !

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 i

Bonjour à 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 i
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

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

On s’en sort en travaillant avec les dates en format nombre

...avoir une explication sur l'ensemble de boucles imbriquées suivant...:

Voir les commentaires de la nouvelle macro.

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 feuille

Bonjour

escsr a écrit :

Déclaration :

  • Tablo -> contiendra la feuille
  • Dico -> dictionnaire (callingNumber, tableau de ligne)
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 lignes

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 tableau

Bonjour

escsr a écrit :

Si durée != 0 et date proche

Si date proche de quoi ?

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 i

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

Ici, 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    13266137433

ici, 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    13265309883

ici, 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    13261207554

Ici, 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 !!

Rechercher des sujets similaires à "filtre donnees"