Comparaison deux colonnes données en désordre

lili4915 Messages postés 13 Statut Membre -  
lili4915 Messages postés 13 Statut Membre -
Bonjour,

Je souhaiterais créer un programme qui compare les données de deux colonnes (A et D) et qui m'indique si les données (texte) sont les mêmes dans les deux colonnes. Cependant, elles ne sont pas dans le même ordre (donc sur les mêmes lignes) dans les deux colonnes.
Par exemple, le programme devrait comparer le nombre de fois où il retrouve les mots PARIS et RENNES dans chaque colonne et afficher un message d'erreur si le nombre est différent.
Cependant, ayant beaucoup de noms différents, je ne souhaiterais pas devoir les écrire dans le programme.

Je n'ai pas trouvé de renseignements sur le forum. Est-ce que cela est envisageable ?
Merci d'avance

2 réponses

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour Lili, bonjour le forum,

    Peut-ête comme ça :
    Sub Macro1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim PLA As Range 'déclare la variable PLA (PLage de la colonne A)
    Dim PLD As Range 'déclare la variable PLD (PLage de la colonne D)
    Dim TCA As Variant 'déclare la variable TCA (Tableau de la Colonne A)
    Dim TCD As Variant 'déclare la variable TCD (Tableau de la Colonne D)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim VT As Byte 'déclare la variable VT (Valeur Trouvée)
    Dim NA As Integer 'déclare la variable NA (Nombre en colonne A)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim K As Integer 'déclare la variable K (incrément)
    Dim L As Integer 'déclare la variable L (incrément)
    Dim ND As Integer 'déclare la variable ND (Nombre en colonne D)
    Dim TD() As Variant 'déclare la variable TD (Tableau Doublons)
    
    '**********************
    'Colonne A -> Colonne D
    '**********************
    
    Set O = Worksheets("Feuil1") 'défnit l'onglet O
    Set PLA = O.Range("A1:A" & O.Cells(Application.Rows.Count, "A").End(xlUp).Row) 'définit la plage PLA
    Set PLD = O.Range("D1:D" & O.Cells(Application.Rows.Count, "D").End(xlUp).Row) 'définit la plage PLD
    TCA = PLA 'définit le tableau de la colonne A TCA
    TCD = PLD 'définit le tableau de la colonne A TCA
    
    For I = 1 To UBound(TCA, 1) 'boucle 1 : sur toutes les lignes I du tableau TCA
        VT = 0 'initialise la valeur trouvée VT
        NA = Application.WorksheetFunction.CountIf(PLA, TCA(I, 1)) 'définit le nombre d'occurrence de la valeur TCA de la boucle dans la colonne A : NA
        For J = I To UBound(TCD, 1) 'boucle 2 : sur toutes les lignes J du tableau TCD
            If TCA(I, 1) = TCD(J, 1) Then 'condition 1 : si la valeur de la boucle 1 et de la boucle 2 est identique
                VT = 1 'redifinit la valeur trouvée VT
                ND = Application.WorksheetFunction.CountIf(PLD, TCD(J, 1)) 'définit le nombre d'occurrence de la valeur TCD de la boucle dans la colonne D : ND
                If ND <> NA Then 'condition 2 : si les deux nombre sont différents
                    If K > 0 Then 'condition 3 : si K est supérieur à 0 (=> si le tableau des doublons TD n'est pas vide)
                        For L = 0 To UBound(TD) 'boucle 3 : sur tous les éléments du tableau des doublons TD
                            If TCA(I, 1) = TD(L) Then GoTo suite 'si la valeur de TCA de la boucle 1 est égale à un élément du tableau des doublons TD, va à l'éqiquette "suite"
                        Next L 'prochain élément de la boucle 3
                    End If 'fin de la condition 3
                    MsgBox NA & " fois la valeur " & TCA(I, 1) & " en colonne A" & Chr(13) & _
                       ND & " fois la valeur " & TCA(I, 1) & " en colonne D" 'message
                    ReDim Preserve TD(K) 'redimensionne le tableau des doublon TD
                    TD(K) = TCA(I, 1) 'récupère la valeur de TCA de la boucle 1 dans le tableau des doublons TCD
                    K = K + 1 'incrémente K
                    Exit For 'for de la boucle 2
                End If 'fin de la condition 2
            End If 'fin de la condition 1
    suite: 'étiquette
        Next J 'prochaine ligne J de la boucle 2
        If VT = 0 Then 'condition 4 : s'il n'existe aucune occurrence de TCA de la boucle 1 dans la colonne D (=> si VT=0)
            If K > 0 Then 'condition 5 : si K est supérieur à 0 (=> si le tableau des doublons TD n'est pas vide)
                For L = 0 To UBound(TD) 'boucle 4 : sur tous les éléments du tableau des doublons TD
                    If TCA(I, 1) = TD(L) Then GoTo fin 'si la valeur de TCA de la boucle 1 est égale à un élément du tableau des doublons TD, va à l'éqiquette "fin"
                Next L 'prochain élément de la boucle 5
            End If 'fin de la condition 5
            MsgBox "La colonne D ne contient pas la valeur " & TCA(I, 1) & " !" 'message
            ReDim Preserve TD(K) 'redimensionne le tableau des doublon TD
            TD(K) = TCA(I, 1) 'récupère la valeur de TCA de la boucle 1 dans le tableau des doublons TCD
            K = K + 1 'incrémente K
        End If 'fin de la condition 4
    fin: 'étiquette
    Next I 'prochaine ligne de la boucle 1
    
    '**********************
    'Colonne D -> Colonne A (commentaires idem)
    '**********************
    
    For I = 1 To UBound(TCD, 1)
        VT = 0
        ND = Application.WorksheetFunction.CountIf(PLD, TCD(I, 1))
        For J = I To UBound(TCA, 1)
            If TCD(I, 1) = TCA(J, 1) Then
                VT = 1
                NA = Application.WorksheetFunction.CountIf(PLA, TCA(J, 1))
                If ND <> NA Then
                    If K > 0 Then
                        For L = 0 To UBound(TD)
                            If TCD(I, 1) = TD(L) Then GoTo suite2
                        Next L
                    End If
                    MsgBox ND & " fois la valeur " & TCD(I, 1) & " en colonne D" & Chr(13) & _
                       NA & " fois la valeur " & TCD(I, 1) & " en colonne A"
                    ReDim Preserve TD(K)
                    TD(K) = TCD(I, 1)
                    K = K + 1
                    Exit For
                End If
            End If
    suite2:
        Next J
        If VT = 0 Then
            If K > 0 Then
                For L = 0 To UBound(TD)
                    If TCD(I, 1) = TD(L) Then GoTo fin2
                Next L
            End If
            MsgBox "La colonne A ne contient pas la valeur " & TCD(I, 1) & " !"
            ReDim Preserve TD(K)
            TD(K) = TCD(I, 1)
            K = K + 1
        End If
    fin2:
    Next I
    End Sub
    

    1
    1. lili4915 Messages postés 13 Statut Membre
       
      Bonjour ThauTheme,

      Cette formule fonctionne parfaitement sur mes tableaux simples (lorsque chaque ville est en lien avec une seule autre) et me sera très utile, merci beaucoup !!

      Cependant, je me suis rendue compte qu’elle ne fonctionnait pas sur mes tableaux les plus complexes (lorsque chaque ville est en lien avec plusieurs autres). C’est de ma faute, l’exemple que j’ai donné n’était pas le plus adéquat. Pour mes tableaux les plus développés j’aurais besoin d’une formule qui analyse les réciprocités entre chaque couple de villes. Qu’elle fasse par exemple le rapprochement entre le nombre de
      « colonne A : PARIS / colonne D : RENNES » et
      « colonne A : RENNES / colonne D : PARIS ».

      J’imagine qu’à ce niveau, cela devient compliqué à mettre en place…
      0
      1. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784 > lili4915 Messages postés 13 Statut Membre
         
        Re,
        et bonjour ThauTheme,

        Je ne comprends pas ton problème :
        1) « L'objectif est de savoir si il y a une réciprocité entre les données » c'est à dire ???
        2) « une formule qui analyse les réciprocités entre chaque couple de villes » c'est quoi un couple de villes ?
        Sous quelle forme veux-tu le résultat ???
        Je suppose que pour des milliers de lignes, afficher un message n'est pas satisfaisant.
        0
    2. lili4915 Messages postés 13 Statut Membre
       
      Une réciprocité entre chaque couple de villes comme l'exemple que j'ai montré tout à l'heure :
      « colonne A : PARIS / colonne D : RENNES » et
      « colonne A : RENNES / colonne D : PARIS ».

      Les messages devraient m'afficher par exemple "35x la valeur entre Paris et Rennes et 35x la valeur entre Rennes et Paris". Ainsi, si le chiffre n'est pas le même cela signifie qu'il y a une erreur dans mon tableau entre ce couple de villes.

      En réalité il s'agit d'opérations entre sociétés et non de villes, j'ai donné cet exemple par soucis d'anonymat.
      0
  2. Patrice33740 Messages postés 8400 Date d'inscription   Statut Membre Dernière intervention   1 784
     
    Bonjour,

    « Est-ce que cela est envisageable ? » : Très probablement !

    Il faudrait préciser le problème :
    - Les textes cherchés sont-ils des mots contenus dans le texte des cellules ?
    - Vu que tu ne veux pas les préciser dans le code, quels critères permettent de retenir ou d’éliminer les mots ?
    - Quelle est exactement le résultat recherché ?
    - ...
    0
    1. lili4915 Messages postés 13 Statut Membre
       
      Voici un exemple très court.
      L'objectif est de savoir si il y a une réciprocité entre les données de chaque colonne.
      Dans ce cas il y a un problème avec Rennes et Strasbourg.
      La formule me permettrait de vérifier des tableaux avec un nombre de lignes conséquent.
      0