Comparer deux colonnes et extraire des valeurs dans une 3ème colonne en VBA

Bonjour,

Je rencontre un problème en VBA.

J'ai un fichier qui comporte trois colonnes.

La colonne A contient les candidats inscrits à un marathon.

La colonne B contient les candidats qui ont franchi la ligne d'arrivée

La colonne C doit contenir le nom des personnes qui ont abandonnées.

En clair la colonne C doit contenir les personnes présentes dans la colonne A mais non présentes dans la colonne B.

J'ai commencé à rédiger un code VBA mais je suis en difficulté et j'aurai besoin d'un coup de main.

L'idée étant de faire un code simple (sans des fonctions VBA de type worksheetfunction).

Trois variables grand maxi.

Si quelqu'un a une idée alors grand merci à lui.

Je vous transmets mon fichier.

Merci d'avance

154abandon.xlsm (16.76 Ko)

Bonsoir,

Un début de piste... A mettre en C2 et à recopier.

=SI(ESTERREUR(RECHERCHEV(A2;B$2:B$31;1;FAUX));A2;"")

Mais ça ne te regroupe pas les abandons sur les 1ères lignes ?! La chose est beaucoup plus complexe.

bonjour christophe 88

une petite formule excel c simpa aussi

=SI(ESTNA(RECHERCHEV(B2;$A$2:$A$500;1;FAUX));"Abandon";"")

filtrage avec un clic droit

1772fee8b00.xlsm (19.72 Ko)

Salut

un code pas spécialement compliqué (car pas 100% générique)

Sub abandon2()
    Dim depart, arrivee As Range
    Dim trouve As Boolean
    Set depart = Range("A2:A100")
    Set arrivee = Range("B2:B100")
    i = 0

    For Each c In depart
        trouve = False
        'Debug.Assert c.Value <> "DAUMAS"
        For Each d In arrivee
            If c.Value = d.Value Then
                trouve = True
                GoTo suite
            End If
        Next d
        If (Not trouve) Then
            Range("C2:C2").Offset(i, 0).Value = c.Value
            i = i + 1
        End If
suite:
    Next c
End Sub

Merci pour vos réponses très pertinentes.

Le principe étant étant pour moi d'utiliser du code VBA, j'exclus donc les formules Excel.

Concernant le code pas tout à fait générique, il fonctionne impeccablement mais à l'inconvénient de faire appel à des fonctions pas toujours très compréhensibles sur le plan algorithmique.

Je pense qu'il y a une réponse avec trois variables et un système de boucle qui permet de renseigner la colonne C (nom des inscrits qui ont abandonné).

J'y travaille de mon côté mais si quelqu'un à une proposition alors grand merci

Merci d'avance

Bonsoir Christophe88, le forum

Avec la méthode Remove de Dictionary

Option Explicit
Sub test()
Dim a, e, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    With Sheets("Feuil1")
        a = .Range("a2", .Range("a" & .Rows.Count).End(xlUp)).Value
        For Each e In a
            If Not dico.exists(e) Then dico(e) = Empty
        Next
        a = .Range("b2", .Range("b" & .Rows.Count).End(xlUp)).Value
        For Each e In a
            If dico.exists(e) Then dico.Remove e
        Next
        .Range("c2").Resize(dico.Count).Value = Application.Transpose(dico.keys)
    End With
End Sub

J'ai bien répondu au cahier des charges

klin89

Bonjour,

Une proposition Excel 2016 avec Récupérer et transformer (Power Query).

Cdlt.

192abandon.xlsm (130.21 Ko)

Merci pour vos réponses et vos propositions.

Cela reste toute même des options qui me semblent trop complexes.

Je regarde de mon côté et vous tiens au courant mais n'hésitez pas à me proposer quelque chose si vous trouvez.

Merci d'avance.

A+

De rien.

Ce qui rend la chose complexe, c'est la structure que tu veux donner à ton tableau. Tester des valeurs pour les regrouper n'est pas chose facile. Il est toujours plus simple de travailler en ligne et utiliser les tableaux structurés pour faire des tris ou filtres.

Peut être peux tu revoir la structure de ton tableau ?!

  • Colonne A les participants
  • Colonne B ordre d'arrivée ou temps
  • Colonne C un test simple avec SI pour indiqué arrivé ou abandon soit
SI(ESTVIDE(B2);"abandon";"arrivé")

Ensuite dans l'onglet "accueil" tu cliques sur "mettre sous forme de tableau" pour trier et filtrer simplement.

96abandon-v2.xlsm (17.27 Ko)

Ok,

J'ai trouvé la solution.

Merci pour vos réponses.

Je vous transmets en pièce jointe mon résultat.

309abandon.xlsm (20.24 Ko)

Re Christophe88

with Application.Match

Option Explicit
Sub test()
Dim r As Range, pos, txt As String, e
    With Sheets("feuil1").Cells(1).CurrentRegion
        With .Offset(1).Resize(.Rows.Count - 1)
            .Columns(3).ClearContents
            For Each r In .Columns(1).Cells
                pos = Application.Match(r.Value, .Columns(2), 0)
                If Not IsNumeric(pos) Then txt = txt & "," & r.Row - 1
            Next
            For Each e In Split(Mid$(txt, 2), ",")
                .Cells(e, 3).Value = .Cells(e, 1).Value
            Next
        End With
    End With
End Sub

Plus simple

Option Explicit
Sub test()
Dim r As Range, pos
    With Sheets("feuil1").Cells(1).CurrentRegion
        With .Offset(1).Resize(.Rows.Count - 1)
            .Columns(3).ClearContents
            For Each r In .Columns(1).Cells
                pos = Application.Match(r.Value, .Columns(2), 0)
                If Not IsNumeric(pos) Then
                    .Cells(r.Row - 1, 3).Value = .Cells(r.Row - 1, 1).Value
                End If
            Next
        End With
    End With
End Sub

Une autre disposition :

Option Explicit
Sub test()
Dim r As Range, pos, lig As Long
    With Sheets("feuil1").Cells(1).CurrentRegion
        With .Offset(1).Resize(.Rows.Count - 1)
            .Columns(3).ClearContents
            For Each r In .Columns(1).Cells
                pos = Application.Match(r.Value, .Columns(2), 0)
                If Not IsNumeric(pos) Then
                    lig = lig + 1
                    .Cells(lig, 3).Value = .Cells(r.Row - 1, 1).Value
                End If
            Next
        End With
    End With
End Sub

klin89

Bonjour,

Comparaison de 2 listes:

  • Communs
  • Différence
  • Fusion

http://boisgontierjacques.free.fr/fichiers/Divers/Dictionary.xls

Ceuzin

Salut !

Petit déterrage car en modifiant un 0 par un 1 la formule me correspond !

Merci pour ce forum et les utilisateur c'est vraiment sympa!

Le truc c'est que souhaiterai comparer 2 colonnes mais extraire la ligne complete (a partir de Bde la colonne.

j'ai repris le fichier pour montrer le résultat souhaité

En claire j'ai une liste complete d'article de 1000 lignes, avec tout a un tas d'information,

De l'autre , un liste avec quelques références 100 ligne,

Je sais que ces produits sont présent dans la liste détaillé,

du coup je souhaiterai extraire l'ensemble sur les colonne a coté voir dans une autre feuille.

J'ai juste posté une une capture d'écran pour simuler mon souhait

Si une amae charitable et experte passe par là

d'avance merci

Rechercher des sujets similaires à "comparer deux colonnes extraire valeurs 3eme colonne vba"