Comparer

freebike Messages postés 107 Statut Membre -  
Heas Messages postés 73 Statut Membre -
Bonjour,

Je dois souvent faire cette comparaison et cela me prend beaucoup de temps à faire à la main :
Récupérer les lignes tableau A et B pour n'en faire qu'un seul (C)



Ya t'il une fonction qui permet de faire ça?
Merci d'avance

4 réponses

  1. Heas Messages postés 73 Statut Membre 5
     
    Bonjour,
    à ma connaissance, il n'y a pas de fonction toute prête...

    Pour ce genre de problème, je pense qu'il faut travailler avec une macro-instruction.

    Tu as déjà fait du VBA?
    0
    1. freebike Messages postés 107 Statut Membre 5
       
      Bonjour Heas
      oui un peu...
      0
  2. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Bonjour freebike

    Une fonction non, mais en rajoutant des colonnes de comptage et en associant plusieurs fonctions c'est possible :
    http://www.cjoint.com/c/FBukVU3Gaob

    Cdlmnt
    Via
    0
    1. freebike Messages postés 107 Statut Membre 5
       
      Bonjour et merci via55

      Ce n'est pas simple mais ça marche...

      Bonne journée
      0
  3. Heas Messages postés 73 Statut Membre 5
     
    Bonjour,
    Via55 t' indiqué une solution.

    Tu dois pouvoir améliorer un petit peu, car la solution implique une numérotation manuelle.

    Ce que je te suggère, une macro instruction qui :
    1) Va copier les deux tableaux initiaux dans une autre feuille TRAVAIL(pour garder ton ordre de saisie qui a peut-être son importance).
    2) Les trier
    3) Ensuite, dans ta macro tu fais une fusion entre les deux tableaux :
    Soit A le Nb d'éléments du tableau A
    Soit B le Nb d'éléments du tableau B
    Déclarer un tableau Rangement
    A1=1
    B1=1
    Rangement=1
    Tant que / A<=A1 ET B1<=B Répéter
    Si / TableauA(A1) = TableauB(B1) Alors /
    /Rangement(Rangement) = TableauA(A1)
    / A1=A1+1
    / B1=B1+1

    Si / TableauA(A1) < TableauB(B1) Alors /
    /Rangement(Rangement) = TableauA(A1)
    / A1=A1+1

    Si / TableauA(A1) > TableauB(B1) Alors /
    /Rangement(Rangement) = TableauB(B1)
    / B1=B1+1
    / B1=B1+1

    Rangement=rangement+1

    Répéter


    ' Traitement des lignes restantes d'un tableau quand on a atteint la fin de l'autre tableau
    Si A1> A Alors / Tant que B1<=B Répéter /
    /Rangement(Rangement) = TableauB(B1)
    /Rangement=rangement+1
    Sinon / Tant que A1<=A Répéter /
    /Rangement(Rangement) = TableauA(A1)
    /Rangement=rangement+1

    ' A l'issue de cette étape, on a un tableau Rangement qui contient l'ensemble des valeurs des deux tableaux initiaux.

    Et dans la feuille TRAVAIL on a, hors macro - instruction :
    Déclaré deux matrices
    créé deux colonnes de recherche (voir l'exemple de Via55)
    Pour chaque valeur de Fruit, on recherche dans chaque tableau (A et B)
    Si La valeur existe, on prend la valeur Num
    sinon 0
    La première partie de macro est de l'enregistrement.
    La deuxième est toute tracée dans l'analyse ci-dessus

    Bon courage
    0
    1. freebike Messages postés 107 Statut Membre 5
       
      Merci de s'intéresser à mon problème

      Je comprend a peu près la macro mais ou commence t'elle et ou fini t'elle? (J'ai peur de copier coller des lignes inutiles et de me tromper dans la syntaxe)
      0
  4. Heas Messages postés 73 Statut Membre 5
     
    Bonjour,
    avec un petit délai, une solution à débugger.

    PRECISION : La macro est du type hyper simplifiée....
    Il y sans doute plus "élégant" en programmation, plus rapide aussi...

    Mais cela devrait fonctionner.

    Le fichier EXCEL DOIT AVOIR UNE FEUIILE "travail" qui contient en
    B1 =NB.SI(B3:B100;"<>"&"*")
    E1 =NB.SI(B3:B100;"<>"&"*")
    Bon courage

    Sub Conca()
    '
    ' Conca Macro
    ' Déclaration des tableaux
    Dim TabA$(100, 2)
    Dim TabB$(100, 2)
    Dim Conca$(200, 2)

    'RAZ des zones de travail issues d'un précédent traitement
    Sheets("Travail").Select
    Range("B3:C11").Select
    Selection.ClearContents
    Range("E3:F6").Select
    Selection.ClearContents
    Range("h3:I200").Select
    Selection.ClearContents
    Sheets("Feuil1").Select

    ' Copie des infos
    Range("B2:C4").Select
    Selection.Copy
    Sheets("Travail").Select
    Range("B3").Select
    ActiveSheet.Paste
    Range("B3").Select
    Sheets("Feuil1").Select
    Range("F2:G4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Travail").Select
    Range("E3").Select
    ActiveSheet.Paste

    ' Chargement des tableaux
    For Indice = 3 To 100
    TabA$(Indice, 1) = Worksheets("Travail").Cells(Indice, 1).Value
    TabA$(Indice, 2) = Worksheets("Travail").Cells(Indice, 2).Value
    TabB$(Indice, 1) = Worksheets("Travail").Cells(Indice, 1).Value
    TabB$(Indice, 2) = Worksheets("Travail").Cells(Indice, 2).Value

    Next i

    ' Tri des informations
    ' Tri tableau A
    Range("B3:C100").Select
    ActiveWorkbook.Worksheets("Travail").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Travail").Sort.SortFields.Add Key:=Range("B3:B7") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Travail").Sort
    .SetRange Range("B3:C7")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With
    ' Tri Tableau B
    Range("E3:F100").Select
    ActiveWorkbook.Worksheets("Travail").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Travail").Sort.SortFields.Add Key:=Range("E3:E6") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Travail").Sort
    .SetRange Range("E3:F6")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
    End With

    ' Fusion
    A1 = 3: B1 = 3: Rangement = 3
    ' Nb de cellules du tableau A
    A = 100 - Worksheets("Travail").Range("B1").Value
    ' Nb de cellules du tableau B
    B = 100 - Worksheets("Travail").Range("E1").Value
    ' Boucle principale
    While (A1 <= A And B1 <= B)
    If TabA$(A1, 1) = TabB$(B1, 1) Then
    Conca$(Rangement, 1) = TabA$(A1, 1)
    Conca$(Rangement, 2) = TabA$(A1, 2) + TabB$(B1, 2)
    A1 = A1 + 1: B1 = B1 + 1: Rangement = Rangement + 1
    End If
    If TabA$(A1, 1) < TabB$(B1, 1) Then
    Conca$(Rangement, 1) = TabA$(A1, 1)
    Conca$(Rangement, 2) = TabA$(A1, 2)
    A1 = A1 + 1: Rangement = Rangement + 1
    End If
    If TabA$(A1, 1) > TabB$(B1, 1) Then
    Conca$(Rangement, 1) = TabB$(B1, 1)
    Conca$(Rangement, 2) = TabB$(B1, 2)
    B1 = B1 + 1: Rangement = Rangement + 1
    End If
    Wend

    ' un des deux tableaux est terminé, il faut ranger la fin de l'autre tableau
    If A1 > A Then ' Le tableau A est terminé, on lit le tableau B
    While B1 <= B
    Conca$(Rangement, 1) = TabB$(B1, 1)
    Conca$(Rangement, 2) = TabB$(B1, 2)
    B1 = B1 + 1: Rangement = Rangement + 1
    Wend
    Else
    ' Le tableau B est terminé, on lit le tableau A
    While B1 <= B
    Conca$(Rangement, 1) = TabA$(A1, 1)
    Conca$(Rangement, 2) = TabA$(A1, 2)
    A1 = A1 + 1: Rangement = Rangement + 1
    Wend
    End If

    ' Rangement des valeurs trouvées dans la grille
    For Indice = 3 To Rangement
    Worksheets("Travail").Cells(Indice, 1) = Conca$(Indice, 1)
    Worksheets("Travail").Cells(Indice, 2) = Conca$(Indice, 2)
    Next Indice
    End Sub
    0