Comparer

Fermé
freebike Messages postés 105 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 16 juillet 2019 - Modifié par freebike le 20/02/2016 à 11:03
Heas Messages postés 71 Date d'inscription samedi 21 novembre 2015 Statut Membre Dernière intervention 3 juillet 2018 - 23 févr. 2016 à 19:25
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

Heas Messages postés 71 Date d'inscription samedi 21 novembre 2015 Statut Membre Dernière intervention 3 juillet 2018 5
20 févr. 2016 à 11:22
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
freebike Messages postés 105 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 16 juillet 2019 5
20 févr. 2016 à 12:13
Bonjour Heas
oui un peu...
0
via55 Messages postés 14501 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 28 novembre 2024 2 735
20 févr. 2016 à 11:48
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
freebike Messages postés 105 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 16 juillet 2019 5
22 févr. 2016 à 10:32
Bonjour et merci via55

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

Bonne journée
0
Heas Messages postés 71 Date d'inscription samedi 21 novembre 2015 Statut Membre Dernière intervention 3 juillet 2018 5
21 févr. 2016 à 19:15
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
freebike Messages postés 105 Date d'inscription jeudi 2 juillet 2009 Statut Membre Dernière intervention 16 juillet 2019 5
22 févr. 2016 à 10:37
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
Heas Messages postés 71 Date d'inscription samedi 21 novembre 2015 Statut Membre Dernière intervention 3 juillet 2018 5
23 févr. 2016 à 19:25
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