Fusionner plusieurs tableaux Excel
Bonjour,
Voici mon problème, que je n'arrive pas à résoudre malgré plusieurs recherches et essais :
Je voudrais assembler plusieurs tableaux excel de 1000 lignes environ et de tailles différentes, ils sont de ce type :
Tableau 1 :
colonne A : Type produit / Colonne B : nom produit
Tableau 2 :
colonne A : options disponibles /colonne B : type produit (je ne veux pas modifier cette structure)
Tableau 3 :
colonne A :sous options disponibles /colonne B : options disponibles (je ne veux pas modifier cette structure)
Au final je voudrais obtenir un tableau global :
colonne A : Type produit / Colonne B : nom produit / colonne C : options disponibles / colonne D : sous options disponibles
La difficulté est que :
- il y a des types de produits sans options disponibles : je voudrais que la case option qui donc sera vide sorte en rouge
- il y a des options sans sous options disponibles : je voudrais que la case sous option qui donc sera vide sorte en jaune
Voici le lien vers le fichier exemple ou j'ai créé le tableau idéal que je voudrais obtenir :
Merci pour votre aide !
Salut et bienvenue sur le Forum,
Tes feuilles exemples comportent des espaces après leur nom (par exemple ‘types ‘) ; à éviter si possible
Ta feuille ‘options sous options’ comporte une ligne 2 vide
Sinon, si ton fichier réel ressemble vraiment à ton fichier exemple, la macro ci-dessous devrait faire l’affaire :
Option Explicit
Sub xx()
Dim i As Integer, j As Integer
Dim DerLig_Autres As Integer, DerLig_Résultat_Idéal As Integer, Compteur As Integer
With Sheets("types ")
DerLig_Autres = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A2:B" & DerLig_Autres).Copy Range("A2")
End With
With Sheets("types options ")
DerLig_Autres = .Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To DerLig_Autres
j = Application.WorksheetFunction.Match(.Range("B" & i), Range("A:A"), 0)
If Compteur = 0 Then
Range("C" & j) = .Range("A" & i)
Else
DerLig_Résultat_Idéal = Range("A" & Rows.Count).End(xlUp).Row + 1
Range("A" & DerLig_Résultat_Idéal) = Range("A" & j)
Range("B" & DerLig_Résultat_Idéal) = Range("B" & j)
Range("C" & DerLig_Résultat_Idéal) = .Range("A" & i)
End If
If .Range("B" & i) = .Range("B" & i + 1) Then
Compteur = Compteur + 1
Else
Compteur = 0
End If
Next i
End With
DerLig_Résultat_Idéal = Range("A" & Rows.Count).End(xlUp).Row
Range("A1:D" & DerLig_Résultat_Idéal).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, Key2:=Range("C1"), Order1:=xlAscending, Header:=xlYes
Compteur = 0
With Sheets("options sous options ")
DerLig_Autres = .Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To DerLig_Autres
j = Application.WorksheetFunction.Match(.Range("B" & i), Range("C:C"), 0)
If Compteur = 0 Then
Range("D" & j) = .Range("A" & i)
Else
DerLig_Résultat_Idéal = Range("A" & Rows.Count).End(xlUp).Row + 1
Range("A" & DerLig_Résultat_Idéal) = Range("A" & j)
Range("B" & DerLig_Résultat_Idéal) = Range("B" & j)
Range("C" & DerLig_Résultat_Idéal) = Range("C" & j)
Range("D" & DerLig_Résultat_Idéal) = .Range("A" & i)
End If
If .Range("B" & i) = .Range("B" & i + 1) Then
Compteur = Compteur + 1
Else
Compteur = 0
End If
Next i
End With
DerLig_Résultat_Idéal = Range("A" & Rows.Count).End(xlUp).Row
Range("A1:D" & DerLig_Résultat_Idéal).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, Key2:=Range("C1"), Order1:=xlAscending, Header:=xlYes
For i = 2 To DerLig_Résultat_Idéal
If Range("B" & i) <> "" And Range("C" & i) = "" Then
Range("C" & i).Interior.ColorIndex = 3
End If
If Range("C" & i) <> "" And Range("D" & i) = "" Then
Range("D" & i).Interior.ColorIndex = 6
End If
Next
End SubTu n’as par contre pas indiqué ce qu’il faudrait faire si des données étaient déjà en place sur cette feuille ‘résultat idéal assemblé’.
A te relire.
Bonsoir, je ne m'attendais pas a une réponse si rapide, merci Yvouilles !
Je vais tester ça demain grandeur nature avec le fichier 1000 lignes, je te ferai un retour.
Ca a l'air super top efficace en tous cas, c'est parfait
@ +
Lebog
Re,
J'ai oublié une instruction assez importante si tu as 1000 lignes.
place la ligne de code
Application.ScreenUpdating = Falsejuste après la ligne
Dim DerLig_Autres As Integer, DerLig_Résultat_Idéal As Integer, Compteur As Integerça te fera gagner du temps
Merci c'est noté, j'allais partir, ouf
Je te fais un retour.
Salut,
Tu m’écris en privé :
lebog a écrit :Salut,
J'allais te faire un retour ce we, j'ai laisse ce sujet de coté car tres pris par ailleurs, mais je ne l'ai pas abandonné.
Mais voila : il y a des bugs avec mon fichier reel, je pense que c'est a cause d'options ou sous options sans produit. je t'enverrai une copie de cette erreur dans le courant du WE.
Merci de ton iinteret
lebog a écrit :Salut,
voici le tableau reel, tu verras qu'il y a une erreur. comme je tai dis dans mon precedent message, cela vient peut etre d'options ou sous options sans type
Je te laisse interpreter, pour moi c'est du chinois
A plus
Merci de rester sur le Forum pour continuer la discussion.
Je t’ai dit le 17 février de placer une instruction de plus, mais tu ne l’as pas fait dans le fichier que tu me retourne maintenant. Si tu ne savais pas le faire, pourquoi ne pas me l’avoir dit ?
Dans ton fichier modèle, tous les produits étaient présents sur toutes les feuilles ; je n’avais donc pas eu besoin de traiter les cas où un article en place sur les feuilles ‘types options’ et ‘options sous options’ ne se trouvait pas dans la liste principale de la feuille ‘types’. Voilà pourquoi il serait toujours mieux de présenter de suite son fichier réel
J’ai maintenant modifié mon code les articles qui n’ont pas été trouvés sont marqués spécialement dans les colonnes C des feuilles ‘types options’ et ‘options sous options’ en fin de macro.
Encore une chose : pour un code assez complexe comme celui-ci, je ne me souviens plus du tout 2 semaines après ce que j’ai réalisé et je dois le réétudier comme si ce n’était pas moi qui l’avais fait. Merci alors de réagir un peu plus rapidement à l’avenir.
A te relire.
Bonjour
Oui j'ai répondu en privé, mais ce n'était pas intentionnel, j'ai un peu de mal avec le site, et après avoir eu un problème de mot de passe, l'essentiel pour moi était de te faire un retour. je note pour le forum
Concernant la ligne de code a ajouter, puisque mon fichier ne faisait pas plus de 1000 lignes je m'étais dis que je pouvais m'en passer. Je ne te l'ai pas dis, c'est vrai.
Je vois donc que le nouveau fichier fonctionne très bien
Ce forum est vraiment TOP.
Merci Yvouilles.