Fusionner 2 tableaux dans un 3ème
Bonjour Le forum,
Je viens solliciter votre aide car je me fais des noeuds au cerveau depuis plusieurs heures sur quelques chose qui me semblait simple à la base
J'ai un tableau 1 qui contient par exemple 1000 lignes avec en colonne A une référence
Un tableau 2 qui contient par exemple 800 lignes avec en colonne A une référence DONT 700 sont déjà présentent dans le tableau 1
Ce que je veux c'est faire un tableau 3 reprenant toutes les références du tableau 1 + les références du tableau 2 qui ne seraient pas déjà présente (donc 1000 + 100 dans l'exemple)...
Evidemment je voudrais éviter de rentrer dans choses compliqué comme du VBA que je ne serais pas (ou peu) capable d'adapter.
Quelqu'un pourrait me venir en aide ? Je lui en serait éternellement reconnaissant
bonsoir,
une solution avec une macro, ... oups désolé
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
Worksheets.Add after:=Worksheets(Worksheets.Count)
' wso feuille résultat
Set wso = Worksheets(Worksheets.Count)
' wsi1 première feuille
Set wsi1 = Worksheets("feuil1")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("A" & Rows.Count).End(xlUp).Row
' on copie toutes les références de wsi1 dans wso
wsi1.Range("A" & 1 & ":A" & dli1).Copy wso.Range("A1")
' wsi2 deuxième feuille
Set wsi2 = Worksheets("sheet2")
'dlo nombre de lignes dans wso
dlo = dli1
' dli2 nombre de lignes dans wsi2
dli2 = wsi2.Range("A" & Rows.Count).End(xlUp).Row
' on passe en revue toutes les références sur wsi2
For i = 1 To dli2
tf = wsi2.Range("A" & i)
'on cherche la référence de wsi2 dans wsi1
Set re = wsi1.Range("A" & 1 & ":A" & dli1).Find(tf, lookat:=xlWhole)
'
If re Is Nothing Then
'on ne l'a pas trouvée on l'ajoute dans wso
dlo = dlo + 1
wsi2.Range("A" & i).Copy wso.Range("A" & dlo)
End If
Next i
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubMerci h2so4,
En fait j'ai pas précisé mais je ne peux pas ajouter une feuille comme proposé car en colonne A du 3 ème tableau j'ai l'ensemble de mes ref mais en colonne B/C/D/E... j'ai pleins d'autres formules de la ligne 1 à la ligne 20 000 (type RECHERCHEV, NBCAR,...)
Au final plusieurs fois par jour, je vais mettre à jour les feuille 1 et 2 pour enregistrer la feuille 3 (mise à jour) en CSV...
Je pensais m'en sortir avec INDEX EQUIV mais en fait pas du tout
bonjour,
ai-je bien compris que le tableau 3 est sur une feuille qui existe déjà ? que tu veux y avoir en colonne A toutes les références uniques que tu trouves sur ta première feuille et sur la seconde (également en colonne A ?
voici le code adapté à cette interprétation de ta demande. à tester
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
' wso feuille résultat
Set wso = Worksheets("feuil3")
' wsi1 première feuille
Set wsi1 = Worksheets("feuil1")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("A" & Rows.Count).End(xlUp).Row
' on copie toutes les références de wsi1 dans wso
wsi1.Range("A" & 1 & ":A" & dli1).Copy wso.Range("A1")
' wsi2 deuxième feuille
Set wsi2 = Worksheets("feuil2")
'dlo nombre de lignes dans wso
dlo = dli1
' dli2 nombre de lignes dans wsi2
dli2 = wsi2.Range("A" & Rows.Count).End(xlUp).Row
' on passe en revue toutes les références sur wsi2
For i = 1 To dli2
tf = wsi2.Range("A" & i)
'on cherche la référence de wsi2 dans wsi1
Set re = wsi1.Range("A" & 1 & ":A" & dli1).Find(tf, lookat:=xlWhole)
'
If re Is Nothing Then
'on ne l'a pas trouvée on l'ajoute dans wso
dlo = dlo + 1
wsi2.Range("A" & i).Copy wso.Range("A" & dlo)
End If
Next i
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubAh c'est pas mal... Bon j'ai 2 contraintes que j'ai pas données et je pensais pouvoir adapter mais non...
La première c'est déjà que je commence à lire en ligne 2 car en ligne 1 j'ai les entêtes de colonne.
Et SURTOUT, je ne dois ajouter en feuille 3 les références non existantes en feulle 2 VS feuille ET uniquement les références dont les quantité est différentes entre les 2 feuilles (oui je sais j'aurais surement du le précisé dès le départ)...
Le plus simple je pense c'est que je poste mon tableau avec ton code que j'ai adapté (avec de grandes incertitudes mais ça à l'air de fonctionner) (en plus j'avais schématiser en parlant de colonne A mais d'un côté c'est N en feuille1 et de l'autre c'est B en feuille2 à copier en B en feuille3)...
Merci beaucoup pour ton aide...
bonsoir,
je reformule ce que j'ai compris (mais cela me parait tellement différent de la demande initiale que j'ai un doute !)
tu veux en feuille 3 en colonne B
les références trouvées en feuillle1 (colonne N) qu'on ne trouve pas en feuille2 (colonne B)
et
les références trouvées en feuille1 (colonne N) qu'on trouve en feuille2 (colonne B) mais dont les quantités diffèrent (colonne Q en feuille1 et Colonne F en feuille2)
voici le code adapté à ce que j'ai compris.
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
' wso feuille résultat
Set wso = Worksheets("import")
' wsi1 première feuille
Set wsi1 = Worksheets("sheet")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("N" & Rows.Count).End(xlUp).Row
Set wsi2 = Worksheets("Prestashop")
' dli1 dernière ligne de wsi1
dli2 = wsi2.Range("B" & Rows.Count).End(xlUp).Row
'on passe en revue toutes les références de wsi1
dlo = 1
For i = 2 To dli1
' tf reference à rechercher dans wsi2
tf = wsi1.Range("N" & i)
Set re = wsi2.Range("B2:B" & dli2).Find(tf, lookat:=xlWhole)
If re Is Nothing Then
'on ne l'a pas trouvée on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
ElseIf wsi11.Range("Q" & i) <> wsi2.Range("F" & re.Row) Then 'on l'a trouvée et les quantités sont différentes
'on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
End If
Next i
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubC'est exactement ça ! Bravo
Sauf que j'ai testé sur un petit échantillon. les références de la feuille 1 non présente dans la feuille 2 sont bien ajoutées. en revanche ensuite j'ai un message "Objet requis" et la référence de la feuille 2 dont la quantité est différente de la feuille 1 n'est pas ajoutée.
Je n'arrive pas à comprendre pourquoi (j'avais dis que je comprenais rien en VBA...)
En tout cas merci pour ce super coup de main et le temps passé à me répondre.
Bonsoir,
il y a un 1 qui est venu se mettre où il ne fallait pas et ma mauvaise vue ne m'a pas permis de le détecter.
essaie ceci, c'est normalement corrigé.
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
' wso feuille résultat
Set wso = Worksheets("import")
' wsi1 première feuille
Set wsi1 = Worksheets("sheet")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("N" & Rows.Count).End(xlUp).Row
Set wsi2 = Worksheets("Prestashop")
' dli1 dernière ligne de wsi1
dli2 = wsi2.Range("B" & Rows.Count).End(xlUp).Row
'on passe en revue toutes les références de wsi1
dlo = 1
For i = 2 To dli1
' tf reference à rechercher dans wsi2
tf = wsi1.Range("N" & i)
Set re = wsi2.Range("B2:B" & dli2).Find(tf, lookat:=xlWhole)
If re Is Nothing Then
'on ne l'a pas trouvée on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
ElseIf wsi1.Range("Q" & i) <> wsi2.Range("F" & re.Row) Then 'on l'a trouvée et les quantités sont différentes
'on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
End If
Next i
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubGénial, c'est exactement ça.
Merci beaucoup.
Bon c'est encore moi...
Après utilisation, je me dis que ce n'est pas pertinent d'ajouter :
Les références de la feuille 1 qui ne sont pas présentes dans la feuille 2 dont la quantité est égale à 0.
J'ai essayé de bidouiller un IF mais j'ai fais n'importe quoi en fait....
Je suis désolé pour ce nouvel argument non précisé...
ben c'est de nouveau moi ...
code à tester
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
' wso feuille résultat
Set wso = Worksheets("import")
' wsi1 première feuille
Set wsi1 = Worksheets("sheet")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("N" & Rows.Count).End(xlUp).Row
Set wsi2 = Worksheets("Prestashop")
' dli1 dernière ligne de wsi1
dli2 = wsi2.Range("B" & Rows.Count).End(xlUp).Row
'on passe en revue toutes les références de wsi1
dlo = 1
For i = 2 To dli1
' on prend les références de wsi1 qui ont une quantité <>0
If wsi1.Range("Q" & i) <> 0 Then
' tf reference à rechercher dans wsi2
tf = wsi1.Range("N" & i)
Set re = wsi2.Range("B2:B" & dli2).Find(tf, lookat:=xlWhole)
If re Is Nothing Then
'on ne l'a pas trouvée on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
ElseIf wsi1.Range("Q" & i) <> wsi2.Range("F" & re.Row) Then 'on l'a trouvée et les quantités sont différentes
'on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
End If
End If
Next i
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubGloups, Il y a un ptit bug quelque part car du coup je n'ai plus les références présentes dans feuille1 ET feuille2 dont la quantité en feuille1 est égale à 0
ta demande était pourtant claire et précise, je dois être fatigué.
à tester
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
' wso feuille résultat
Set wso = Worksheets("import")
' wsi1 première feuille
Set wsi1 = Worksheets("sheet")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("N" & Rows.Count).End(xlUp).Row
Set wsi2 = Worksheets("Prestashop")
' dli1 dernière ligne de wsi1
dli2 = wsi2.Range("B" & Rows.Count).End(xlUp).Row
'on passe en revue toutes les références de wsi1
dlo = 1
For i = 2 To dli1
' tf reference à rechercher dans wsi2
tf = wsi1.Range("N" & i)
Set re = wsi2.Range("B2:B" & dli2).Find(tf, lookat:=xlWhole)
If re Is Nothing Then
'on ne l'a pas trouvée
'on vérifie si la quantité est non nulle
If wsi1.Range("Q" & i) <> 0 Then
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
End If
ElseIf wsi1.Range("Q" & i) <> wsi2.Range("F" & re.Row) Then 'on l'a trouvée et les quantités sont différentes
'on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
End If
Next i
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubSuper merci (bon faut être patient pour le calcul) mais ça m'enlève une grosse épine du pied.
Bonjour,
corrections qui devraient améliorer les performances.
Sub fusiondesreferences()
' on ajoute une nouvelle feuille pour recevoir le résultat de la fusion des références
' wso feuille résultat
Application.ScreenUpdating = False
calcmethod = Application.Calculation
Application.Calculation = xlCalculationManual
Set wso = Worksheets("import")
' wsi1 première feuille
Set wsi1 = Worksheets("sheet")
' dli1 dernière ligne de wsi1
dli1 = wsi1.Range("N" & Rows.Count).End(xlUp).Row
Set wsi2 = Worksheets("Prestashop")
' dli1 dernière ligne de wsi1
dli2 = wsi2.Range("B" & Rows.Count).End(xlUp).Row
'on passe en revue toutes les références de wsi1
dlo = 1
For i = 2 To dli1
Application.StatusBar = "Progress " & Format(i / dli1, "0.00%")
' on prend les références de wsi1 qui ont une quantité <>0
If wsi1.Range("Q" & i) <> 0 Then
' tf reference à rechercher dans wsi2
tf = wsi1.Range("N" & i)
Set re = wsi2.Range("B2:B" & dli2).Find(tf, lookat:=xlWhole)
If re Is Nothing Then
'on ne l'a pas trouvée on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
ElseIf wsi1.Range("Q" & i) <> wsi2.Range("F" & re.Row) Then 'on l'a trouvée et les quantités sont différentes
'on l'ajoute dans wso
dlo = dlo + 1
wsi1.Range("N" & i).Copy wso.Range("B" & dlo)
End If
End If
Next i
MsgBox "Traitement terminé"
Application.ScreenUpdating = True
Application.Calculation = calcmethod
Application.StatusBar = ""
Set wso = Nothing
Set wsi1 = Nothing
Set wsi2 = Nothing
End SubHello,
toujours moi... j'ai un soucis avec ce code.. J'ai tourné le problème dans tout les sens mais je ne comprends pas
- Les ref qui existent dans feuille 2 (colonne B) mais pas dans feuille 1 (colonne N) ne sont pas (ou plus) ajoutées
- Les ref qui existent dans feuille 1 ET feuille 2 qui ont une quantité à zéro dans feuille 1 (uniquement) ne sont pas ajoutées (en fait problème non résolu sur le dernier code
Désolé de revenir maintenant que le sujet n'est plus "chaud"...
Merci d'avance pour le coup de main.
Bonsoir,
peux-tu reformuler ce que tu veux exactement ? je crois que j'avais raison d'avoir un doute
bonsoir,
je reformule ce que j'ai compris (mais cela me parait tellement différent de la demande initiale que j'ai un doute !)
tu veux en feuille 3 en colonne B
les références trouvées en feuillle1 (colonne N) qu'on ne trouve pas en feuille2 (colonne B)
et
les références trouvées en feuille1 (colonne N) qu'on trouve en feuille2 (colonne B) mais dont les quantités diffèrent (colonne Q en feuille1 et Colonne F en feuille2)
voici le code adapté à ce que j'ai compris.
Après utilisation, je me dis que ce n'est pas pertinent d'ajouter :
Les références de la feuille 1 qui ne sont pas présentes dans la feuille 2 dont la quantité est égale à 0.
- Les ref qui existent dans feuille 2 (colonne B) mais pas dans feuille 1 (colonne N) ne sont pas (ou plus) ajoutées
- Les ref qui existent dans feuille 1 ET feuille 2 qui ont une quantité à zéro dans feuille 1 (uniquement) ne sont pas ajoutées (en fait problème non résolu sur le dernier code
Mmmh en effet vu comme ça c'est pas clair
les références trouvées en feuillle1 (colonne N) qu'on ne trouve pas en feuille2 (colonne B) et dont la quantité en feuille 1 est différente de 0
+
les références trouvées en feuille1 (colonne N) qu'on trouve aussi en feuille2 (colonne B) mais dont les quantités diffèrent (colonne Q en feuille1 et Colonne F en feuille2)
+
Les ref qui existent dans feuille 2 (colonne B) mais pas dans feuille 1 (colonne N) et dont la quantité en feuille 2 est différente de 0
Et là je pense que tout sera OK
oooops, je travaille trop tard. J'ai oublié une condition pour le point N° 1 :
- les références trouvées en feuillle1 (colonne N) qu'on ne trouve pas en feuille2 (colonne B) et dont la quantité en feuille 1 est différente de 0
Oui mais avec condition : dans la feuille 1 la valeur de la cellule B est trouvée dans la colonne A de la feuille 2
Merci encore
bonjour,
pus-je te demander de reformuler le tout stp, en mentionnant le nom des feuilles et pas leur numéro ?
merci, j'ai du mal à me replonger dans cette demande.