IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comparer 2 colonnes chaine commune [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 7
    Par défaut Comparer 2 colonnes chaine commune
    Bonjour à tous.

    Voici mon problème.
    J'ai un fichier excel avec un certain nombre de référence dans 2 colonnes.
    Je souhaiterais comparer ces 2 colonnes et renvoyer dans une (ou plusieurs) autre(s) colonne(s) les valeurs des cellules de la 2eme colonnes qui ont une chaine commune d'au moins 10 caractères avec une des cellules de la première colonne.
    Il faudrait vraiment que quel que soit l'emplacement de la chaine de 10 caractères minimum dans les valeurs des cellules 1 et 2 les correspondances soient renvoyées.
    Et il y a des cas où il peut y avoir plusieurs valeurs répondant aux critères dans la colonne 2, Il faudrait que les différentes réponses se mettent sur la même ligne dans la colonne suivante.

    Petite précision : le fichier que je dois traiter comporte 5644 lignes en colonne A et 6297 lignes en colonne B.

    Merci d'avance de votre aide.
    Cdt.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 186
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En Excel, les fonctions de la catégorie Texte devraient t'aider et particulièrement GAUCHE, EXCACT et bien entendu la fonction de la catégorie Logique SI
    En VBA, If et Left
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 7
    Par défaut
    Bonjour Philippe.

    En fait j'ai déjà essayé pas mal de choses au niveau formule mais le problème c'est que les chaines communes à trouver peuvent se trouver au début, au milieu ou à la fin.
    On m'avait déjà aiguillé vers une formule matricielle de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {=SIERREUR(INDEX($B$1:$B$22;PETITE.VALEUR(SI(SIERREUR(CHERCHE($A2;$B$1:$B$22)>0;0);LIGNE($B$1:$B$22));COLONNES($A:A)));"")}
    Mais le fichier est un peu lourd pour ça et je n'arrive pas à l'implanter dans mon fichier (impossible de l'incrémenter correctement et je n'ai que les valeurs de la première ligne qui apparaissent :/) et je ne comprends pas tout dans cette formule car je ne vois pas apparaitre le critère correspondant aux chaines de 10 caractères minimum.
    Cette formule peut-elle vraiment fonctionner et si oui est-il possible de la remplacer par du vba (que je ne maitrise pas) ?
    Merci Philippe.

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    ce que je lis :
    le fichier que je dois traiter comporte 5644 lignes en colonne A et 6297 lignes en colonne B.
    signifie pour moi :
    1) si les chaînes ont une longueur moyenne de 15 caractères --->> 177 701 340 comparaisons minimum (et encore -->> en utilisant l'opérateur Like, qui aide) !
    2) si leur longueur moyenne est de 18 caractères ----->> 284 322 144 comparaisons minimum
    j'ose à peine faire allusion à des chaînes de plus grande longueur moyenne.
    Possible, oui, mais il va falloir mettre plusieurs galériens aux rames. Et même ainsi, être extrêmement patient

  5. #5
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Février 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2019
    Messages : 7
    Par défaut
    Rerebonjour.

    On m'a aidé d'un autre coté et voici ce qui fonctionne (précisons que j'avais zappé dans ma demande que pour la colonne A les chaines de 11 caractères se trouvait toujours au début, ce qui réduit les calculs quand même)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub doublons()
        With Sheets("feuil1")
            dl = .Cells(Rows.Count, 1).End(xlUp).Row
            Set plage = .Cells(1, 2).Resize(dl)
            For i = 2 To dl
                sv = Left(.Cells(i, 1), 11)
                Set re = plage.Find(sv, lookat:=xlPart)
                If Not re Is Nothing Then
                    fa = re.Address
                    col = 2
                    Do
                        col = col + 1
                        .Cells(i, col) = re.Value
                        Set re = plage.FindNext(re)
                    Loop Until re.Address = fa
                End If
            Next i
        End With
    End Sub
    ça peut mettre quelques minutes à traiter mais ça marche .
    En tout cas merci d'avoir pris le temps d'étudier la question.
    Cdt

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    C'est déjà moins douloureux avec ces nouvelles précisions.
    Voici, pour ton info, ce que tu aurais dû faire (et que j'avais préparé) si les choses avaient été celles énoncées par ton message initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim dlb As Long, dla As Long, k As Long, ch As String, sch As String, m As Integer, n As Long
    dlb = Range("B" & Rows.Count).End(xlUp).Row
    dla = Range("A" & Rows.Count).End(xlUp).Row
    For k = 1 To dlb
      ch = Range("B" & k).Text
        For m = 1 To Len(ch) - 10
          sch = Mid(ch, m, 10)
          For n = 1 To dla
            If InStr(Range("A" & n).Text, sch) > o Then MsgBox sch & "présent en ligne " & k & " de colonne B & ligne " & n & " de colonne A"
          Next
        Next
    Next

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    un exemple codé a main levée
    ici on compare la colonne 1 et 2 et si un left 10 se trouve dans les 2 on la met dans la colonne 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub testx()
        For Each cel2 In Range(Cells(1, 2), Cells(Rows.Count, 2).End(xlUp)).Cells
            For Each cel1 In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Cells
                If Left(cel1, 10) Like Left(cel2, 10) Then Cells(Rows.Count, 4).End(xlUp).Offset(1) = Union(cel1, cel2).Address & " = " & cel1
            Next
        Next
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/11/2006, 16h23
  2. Trouver la chaine commune
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2006, 19h49
  3. Réponses: 3
    Dernier message: 23/10/2006, 00h15
  4. comparer deux colonnes sur Excel
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/12/2005, 11h50
  5. Réponses: 5
    Dernier message: 15/11/2005, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo