Microsoft 365 Gestion des doublons

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonsoir à toutes et à toute :)
Me voilà avec une nouvelle opération à réaliser que je n'arrive pas à faire malgré mes recherches
et essais. Faut dire (enfin pour moi), que c'est certainement un codage ardu !
P'tit exposé de la situation :
Dans notre fichier de travail, quand nous appelons un nouveau prospect, nous créons une ligne d'appel.
Mais il arrive que nous ne nous apercevions pas que nous avons déjà appelé et déjà créé une ligne d'appel et que nous créions, par erreur une nouvelle ligne = doublon !
Le souci est que nous avons les commentaires des 1er appels dans la 1ère ligne créée et les commentaires des appels suivants dans la ligne doublon (ou dans les lignes doublons).
Pire encore, il peut y avoir des commentaires mélangés dans les 2 ou les 3 (voire 4) lignes doublons.

J'ai codé pour trouver les doublons et faire un classement pour trier n° par numéro comme dans le fichier test joint. J'en suis à ce niveau actuellement.

Ce que je voudrais pouvoir faire :
En vérifiant les doublons, dans mon fichier actuellement il y a 144 doublons avec des commentaires comme dans l'exemple du fichier test joint.... et tout remettre manuellement est long et fastidieux !

Partant du principe que les commentaires commencent tous avec une date comme ci-dessous :
"- 05/11/19 Consulte conjoint , Rap : OUI + OK RDV SPV"

Ce serait super bien que les commentaires des doublons soient rassemblés automatiquement par l'exécution d'un code (secret pour moi LOL) dans la 1ère ligne et que les commentaires de la ou des lignes en doublons soient effacés
fichier test joint :
- Feuille "doublons",
- Feuille "résultat attendu".
Si un magicien pouvait m'aider ?

Avec mes remerciements pour m'avoir lu en espérant être clair,
Je vous souhaite à toutes et à tous une bonne fin de journée,
Amicalement,
lionel,
 

Pièces jointes

  • Doublons_test.xlsm
    20.3 KB · Affichages: 25
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
allons Laurent !!!:rolleyes:;) met des debug dans ton code et vois ce qui l'en sort
c'est simple
  1. tu compile tout!!!!!!! les "AE" par rapport aux même référence en"G"
  2. tu split par les"-"
  3. et tu tri les doublons de ce split (c'est la ET SUR CA!!!!et rien qu'a ce moment que ton regex doit opérer )
  4. tu vide les élément en doublons dans ce split
  5. tu recolle le tout avec join par les "-" en replacant les"- -" par "-"
terminé ta ta chaîne sans doublons ;)

après sincèrement un regex pour ce que fait simplement "like"
heu comment dire heu.....donne moi la marque de tes cigarettes que j'en achète pas :D:D:D
 

laurent950

XLDnaute Accro
Hello Patrick, les deux texte soit 2 deux couleurs (1 sur 2) c'est en fait une couleur par commentaire :
Chaine verte le premier commentaire, puis la bleu clair la suivant, puis en vert latroisieme, ect. (sans les doublons bien sur) :p

Aie Aie Aie... Lionel va completer sont usine à Gaz ha ha ha avec moi il va Gazer hi hi hi :D:D

J'ai trop d'idées c'est vrais, je vais m'appliquer a faire plus simple, mais bon j'apprend assez vite et j'y arrive, je passe quand même par New York pour aller à Rome :p:p:p c'est vrais qu'il y a plus simple mais comme tous les chemins mènent à rome j'y arrive quand même :confused::confused: mais ilne faut pas faire comme le petit poucé et se perdre ha ha ha :D:D

En tous cas un grand merci tu es hyper performant et tu conseilles bien, tu m'as débloqué cette situation ou je me suis enlisé avec les Regex

Merci Patrick
 

patricktoulon

XLDnaute Barbatruc
re
tiens laurent j'ai fait ca vite fait
voila ce qu'est un regex
j'ai repris mon code version tableau
j'ai bloqué la concaténation
regarde seulement dans le debug et regarde le pattern
VB:
Sub test()
    Dim newval$, i&, Firstindex&, texte$, regex As Object, Matchs As Object
    newval = ""
    tableau = Range("A6:AE" & Cells(Rows.Count, "A").End(xlUp).Row)
    For i = 1 To UBound(tableau)
        If tableau(i, 7) <> newval Then
            If Firstindex > 0 Then
                t = Split(tableau(Firstindex, 31), "-")
                For x = 0 To UBound(t)
                    If Not Trim(t(x)) = "" And Not texte Like "*" & Trim(t(x)) & "*" Then texte = texte & "-" & t(x)
                Next
                If Left(texte, 1) = "-" Then texte = Mid(texte, 2)
                tableau(Firstindex, 31) = texte
                '**********************************************************************************************************
                texte = tableau(Firstindex, 31)
                With CreateObject("VBScript.RegExp")
                    .Global = True: .IgnoreCase = True: .Pattern = "[^\w]+(\d{2})+[^\w]+(\d{2})+[^\w]+(\d{2})+(\D{20,200})"
                    Set Matchs = .Execute(texte)
                    Debug.Print tableau(Firstindex, 7); " :occurences chaines " & Matchs.Count
                    If Matchs.Count > 0 Then
                        For x = 0 To Matchs.Count - 1
                            Debug.Print tableau(Firstindex, 7) & "--->" & Matchs(x)
                        Next
                    End If
                End With
                '**********************************************************************************************************


            End If
            Firstindex = i
            newval = tableau(i, 7)
            texte = ""
        Else
            If tableau(i, 31) <> "" Then
                tableau(Firstindex, 31) = tableau(Firstindex, 31) & " - " & tableau(i, 31): tableau(i, 31) = ""
            End If
            'on enleve les doublons(texte dans le resultat en first cellule de chaque valeur
            'en gros on suprime les chaines qui se repete mot pour mots
        End If
    Next i

    Application.EnableEvents = False
    'Cells(6, "AE").Resize(UBound(tableau), 1) = WorksheetFunction.Index(tableau, 0, 31)    'on retranscrit que la colonne 31 "AE"
    Application.EnableEvents = True
End Sub

LOL ;)
 

laurent950

XLDnaute Accro
Je viens de voir, j'ai compris tu es fort, vraiment très très fort, je vais m'inspirer de ta logique, je vais me poser et à tête reposée je vais m'imprégner de cela vraiment c'est le top cette méthode
ici tu pourrais
For x = 0 To UBound(t) / par / For x = LBound(t) To UBound(t)

le pattern est top :
.Pattern = "[^\w]+(\d{2})+[^\w]+(\d{2})+[^\w]+(\d{2})+(\D{20,200})"
je sais pas comment tu arrives à en construire un aussi vite, incroyable. tu as un générateur d'expression réguliére ?
Je sais qu' Access génére du texte SQL les requêtes donc peux être qu'il y a un systéme ou tu connais cela très très bien en tous cas félicitation, c'est de la haute voltigie

Demain je penche sur le sujet regex :p :p

Ha j'ai compris Optional il me reste ParamArray ?
et aussi IsMissing et Not IsMissing avec les paramétres Optional... je pense que c'est pour les Objets IsMissing (mais j'en suis pas très sur)
Bon je Polue pas le Forum et demain je me penche sur La regex et je reviens

Bonne nuit Patrick, Le Forum

Merci Patrick pour tes explications de qualités et ta sympathie

Laurent
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
oulah!! t'emballe pas c'est juste a but école


.Pattern = "[^\w]+(\d{2})+[^\w]+(\d{2})+[^\w]+(\d{2})+(\D{20,200})"
traduction
pattern=un caractère particulier + 2 chiffres + un caractère particulier + 2 chiffre+un caractère particulier + 2 chiffres + une chaîne de 20 à 200 caractères
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Gérard, Patrick, Laurent950, le Forum :)

@ Patrick @ Laurent950
Je suis de près vos échanges et je suis toujours émerveillé par tant de passion :)
Très fatigué en ce moment par de grosses journées de boulot, je regarderai ce WE vos fichiers et codes et je vous répondrai :)
Merci à vous vraiment,
lionel,
 

laurent950

XLDnaute Accro
Bonjour Patrick, Lionel, Gérard, le Forum :)

@ Patrick @ Lionel
Bonsoir patrick, j'ai décortiqué la regex que tu as fait est j'ai profité de cette occasion pour utilisé différent élèment :
- Module de Classe
- Variable tableau
- Decoupage de chaine de caractére
- regex
Franchement le résultat n'est pas trop mal est c'est assez bien pensé, bien sur je ne suis pas un pro comme toi mais j'ai le mérite d'avoir réussi quelque chose :p :p (Alors Lionel j'espères que tu suis les cours a patrick aussi :D:D)
Pour le résultat se qui serait pas trop mal au final c'est de faire des couleurs : 1 sur 2.
- Une ligne de couleur automatique (standard a Excel)
- Une lignes en Bleu Ciel Foncé.
- Ect.
* Aussi une largeur automatique de colonnes peux être avec une largeur Max a pas dépasser.
* Ne plus recopier les lignes sans commentaires
* ect


Je pense que l'on peux encore simplifier se code.

Aussi, j'ai compris qu'il est impossible de faire ( Héritage Polymorphisme implémentation) de Module Classe en VBA excel.

C'est un autre sujet mais j'ai trouvé un moyen de réutilisé (Variable Type (chaque nom de variable reprend le même let ou set et get) dans les module de classe (juste a jongler avec les Private ou public enfin la j'ai pas voulus complexifié déjà que c'est pas très intuitif tous ses tableaux.

Même constat pour le module de classe pour un set ou un let (comme c'est de l'écriture il faut une variable obligatoire et autant de Optional que l'on veux) mais pour un get comme ces de la lecture on peux mettre que des optionals (alors bien sur je parle pour les arguments)
Puis le sens d'écritures n'est pas très intuitif aussi (pour envoyer les arguments vers le modules de classes)

Bon je parle de tous cela car j'ai appris et que l'on peux encore tous perfectionner, et aussi que cela m'interresse et que ce fils est riche de connaissance, c'est un vaste sujet les doublons :p:p

Ps : Lionel est ce que cette option de rendu sur la feuille resultat te satifais ?

Merci Patrick

Laurent
 

Pièces jointes

  • Doublons_test (Module de classe et Regex V0).xlsm
    74.9 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
re
Ah ben le voila qui s'attaque aux modules classes maintenant
on l’arrête plus le Laurent ;)

cela dit il y a des erreurs dans le rendu pour le (33111111120)par exemple , il manque certainement des choses

heureusement me semble t il t'avoir dit de simplifier la chose sinon c'est une DLL que tu nous développe ;):p
 

laurent950

XLDnaute Accro
Bonsoir Patrick,
C'est compliqué tu as raisons c'est les caractéres (qui se trouvent dans la chaine de carractéres qui poses un soucis Exemple : Chaine de caractére numéro (2) qui est a supprimer) car le test n'est pas pris en compte avec la REGEX
Je Poste le fichier :
1581019627201.png

1581019698263.png


Il y a surment une solution mais cela doit être lourd !
Je vais chercher quand même interessant le sujet.

j'ai commencer par remplacer les ( ) par des caractéres spéciaux mais c'est lourd et complexe:

en début :
1581019977029.png



puis en fin je restitue
1581020032781.png


C'est pas concluant
 

Pièces jointes

  • Doublons_test (Module de classe et Regex (V1).xlsm
    126.4 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
bonsoir Laurent
c'est bien pour ca que mon pattern est construit de la facon que je l'ai fait dans mon exemple

on cherche un tiret ,une date, un reste de chaine tout caracteres confondu

ainsi le 2d tiret de ton exemple ne sera pas pris comme le début d'un matchs

mais dans ce cas mieux vaut rester dans la méthode split et like
mais bon ça t’entraîne c'est toujours ça de pris ;)
 

Discussions similaires

Haut Bas