Copier certaines données, sous certaines conditions, entre 2 feuilles
Bonjour,
mes cours de VBA Word sont loin et je voudrais créer une macro...Excel.
J'ai crée le scénario suivant :
'Goal : isolate a brand. Then, copy article numbers and their associated product name and paste them in another table'.
'Loop : because we do the same thing all the time'.
1. Sheet "Manuals"
2. Columns "D" to "AU", lines 5 to 40.
3. Go to "Données", filtre.
4. Go to column "Brand" and untick "Select all".
5. Tick "Branda" (for example) in order to just display "Branda" data.
Then Go to 1st cell "D5"
' Case where VALUE is EMPTY '
IF value = Empty, then, go to cell "E5".
'Each language (FR, AT, BE, etc.) has 2 columns.
'Rule: if cell D5 (for example), under FR, is empty, THEN go to E5, the next FR cell. If this one is empty as well, go to D6, and so on, until you find a cell containing a value. Once the FR cells will be checked, go to the AT cells, and so on.'
' Case where VALUE is FULL '
IF cell "D5" = full (or populated with an article number, the rule to recognize an article number is article number = to 10 digits and starts by "002",
' Copy product name, then article number'
THEN copy, under "Product", cell content "A5" and paste it to sheet "database", under "Description", in cell "F3".
Go back to sheet "Manuals".
AND THEN, copy, under "Installer", content of cell "D5". Paste it to sheet "database", under "Article-no", in cell "D3".
AND then, go back to sheet "Manuals", cell "E5".
REPEAT steps above for E5.
THEN go to cell "D6"
IF value = Empty, then, go to cell "E6".
For each language, as long as a cell is empty, go to the next cell until you find a full cell (containing an article number).
IF cell "D6" = full (or populated with a number = to 10 digits and starting with "002"),
'case 1'
AND IF article number in cell D6 = article number from a previous cell.
'we just copy the product name because we already copied the article number'
THEN copy, under "Product", cell content "A6". Go to sheet "database", under "Description", in cell "F6". Add a ";" after the "Product" name copied and paste the second "Product name".
AND Then, go back to sheet "Manuals", cell "E5".
'case 2 : normal case, we want to copy-paste article numbers + their product name in another sheet'
IF cell "D6" = full (or populated with a number = to 10 digits and starting with "002"),
THEN, under "Product", copy cell content "A6" and paste it to sheet "database", under "Description", in cell "F3".
Go back to sheet "Manuals".
AND Then, under "Installer" column, copy cell content "D6" and paste it to sheet "database", under "Article-no", in cell "D4".
AND Then, go back to sheet "Manuals", cell "E6".
Loop : repeat the same process described from line 21 in this file for each language, then for the other brands.
J'ai également enregistré la macro suivante, via le tableur excel, sans toucher au VBA :
Sub Tri()
'
' Tri Macro
'
Selection.AutoFilter
ActiveSheet.Range("$A$3:$AU$35").AutoFilter Field:=2, Criteria1:="Branda"
Range("A17").Select
ActiveCell.FormulaR1C1 = "azertya B 200/5"
Sheets("Database").Select
ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _
DisplayAsIcon:=False, NoHTMLFormatting:=True
Range("F3").Select
ActiveCell.FormulaR1C1 = "azertya B 200/5 ; "
Sheets("Manuals").Select
Range("D17").Select
Selection.Copy
Sheets("Database").Select
Range("D3").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("E17").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Database").Select
Range("D4").Select
ActiveSheet.Paste
Range("F3").Select
Application.CutCopyMode = False
Selection.Copy
Range("F4").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("A22").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "azertya B 270/5"
Sheets("Database").Select
Range("F3").Select
ActiveCell.FormulaR1C1 = "azertya B 200/5 ; azertya B 270/5"
Range("F4").Select
ActiveCell.FormulaR1C1 = "azertya B 200/5 ; azertya B 270/5"
Sheets("Manuals").Select
Range("A28").Select
Selection.Copy
Sheets("Database").Select
Range("F5").Select
ActiveSheet.Paste
Range("F5").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; "
Range("D5").Select
Sheets("Manuals").Select
Range("D28").Select
Selection.Copy
Sheets("Database").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("E28").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Database").Select
Range("D6").Select
ActiveSheet.Paste
Range("F5").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; "
Range("F6").Select
ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; "
Sheets("Manuals").Select
Range("A33").Select
ActiveCell.FormulaR1C1 = "azertya BM 270/5 - 0.8"
Sheets("Database").Select
Range("F5").Select
ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; azertya BM 270/5 - 0.8"
Range("F6").Select
ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; azertya BM 270/5 - 0.8"
Sheets("Manuals").Select
Range("A5").Select
ActiveCell.FormulaR1C1 = "azertya 80/5"
Sheets("Database").Select
Range("F7:F8").Select
ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _
DisplayAsIcon:=False, NoHTMLFormatting:=True
Range("F8").Select
ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _
DisplayAsIcon:=False, NoHTMLFormatting:=True
Sheets("Manuals").Select
Range("F5").Select
Selection.Copy
Sheets("Database").Select
Range("D7").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("G5").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Database").Select
Range("D8").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("A8").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "azertya 100/5"
Sheets("Database").Select
Range("F7").Select
ActiveCell.FormulaR1C1 = "azertya 80/5 ; azertya 100/5"
Range("F8").Select
ActiveCell.FormulaR1C1 = "azertya 80/5 ; azertya 100/5"
Range("B38").Select
Sheets("Manuals").Select
Range("A33").Select
ActiveCell.FormulaR1C1 = "azertya BM 270/5 - 0.8"
Sheets("Database").Select
Range("F9:F10").Select
ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _
DisplayAsIcon:=False, NoHTMLFormatting:=True
Range("F10").Select
ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _
DisplayAsIcon:=False, NoHTMLFormatting:=True
Sheets("Manuals").Select
Range("F33").Select
Selection.Copy
Sheets("Database").Select
Range("D9").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("G33").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Database").Select
Range("D10").Select
ActiveSheet.Paste
Sheets("Manuals").Select
Range("H5").Select
End Sub
Quelqu'un.e pourrait-il ou elle retranscrire mon scénario en VBA ? En PJ, vous trouverez des screenshots de mes 2 feuilles Excel, "Manuals" and "Database". Les joindre directement pesait trop lourd visiblement.
En espérant qu'il vous paraît clair. Ne pas hésiter à me le dire.
A moins que d'autres fonctions excel permettent d'obtenir le résultat que je souhaite, sans VBA ?
Merci.
Bonsoir et bienvenue sur le Forum !
Un avis sur ton sujet :
Tu nous mets un code, non mis sous balises Code, non indenté, ce que je considère perso comme illisible. Tu le dis issu de l'enregistreur, ça on ne peut en douter à son allure, pas le moins du monde épurée !
L'épurer c'est commencer par faire disparaître tous les Select ou Activate, les CutCopyMode = False (sauf un à la fin, là où l'enregistreur n'en met justement pas !
Tu intitules ta macro Tri alors qu'elle ne comporte aucun tri ??
D'autre part, les images ne nous servent à rien, on travaille sur des fichiers Excel...
Enfin pour ce qui est de ton scénario, perso je ne le lirai pas, peut-être si tu le traduis mais pas sûr. Ce dont j'ai besoin lorsque j'interviens, c'est connaître la situation de départ, les objectifs et ce qu'on veut obtenir à l'arrivée, et un fichier modèle correspondant exactement à la demande, et illustrant si nécessaire le résultat à obtenir.
Cordialement.
Merci de cette réponse. J'ai essayé d'améliorer mon truc selon votre réponse. Seul souci, malgré son 5MO de poids, mon fichier Excel semble considéré comme trop lourd lors du téléversement. Même si je supprime un grand nombre de colonnes et de lignes. :
Scénario en FR :
'But : filtrer le tableau par marque et ensuite copier tous les numéros d'articles ainsi que les noms de produit associés dans la feuille 'Database'.
'Il s'agit de faire une boucle car ce comportement doit être répété pour toutes les langues du tableau 'Manuals' (qui contient normalement 22 langues).
1. La macro concernet, dans le tableau Manuals, les colonnes de D à AU et les lignes de 5 à 40.
2. On commence donc par filtrer les données (Données > Filtre), par déselectionner, dans la colonne "marque", "sélectionner tout".
3. On ne coche que "marquea" (par exemple) de façon à afficher uniquement les numéros de manuels de "marquea".
4. Ensuite (c'est peut-être là où commence ma macro (?) :
'Chaque langue a des données sur 2 colonnes, la colonne 'Installer' et la colonne 'User'.
Aller dans la cellule "D5"
Si la cellule est VIDE, ALORS aller dans la cellule suivante "E5".
Si la cellule "E5" est vide, ALORS aller dans la cellule "D6" etc jusqu'à trouver une cellule contenant un numéro d'article.
' Lorsqu'on trouve une cellule contenant un numéro d'article (le numéro d'article DOIT être composé de 10 numéros et commece par "002" '
' Copier le nom du produit, puis le numéro d'article'
ENSUITE copier, dans la colonne "Produit", le contenu de la cellule "A5" et la coller dans la feuille "database", dans la colonne "Description", dans la cellule "F3".
Go back to feuille "Manuals".
Et ENSUITE, copier, dans la colonne "Installer", le contenu de cellule "D5". Le coller dans la feuille "database", dans la colonne "Article-no", dans la cellule "D3".
Et ENSUITE, revenir sur la feuille "Manuals", cellule "E5".
Répéter les étapes ci-dessus.
Ensuite aller dans la cellule "D6"
Si elle est VIDE, aller dans la cellule "E6", puis dans la D7 si la E6 est vide, etc.
Si la cellule "D6" contient un numéro d'article, ALORS
'cas numéro 1'
ET SI le numéro d'article dans la cellule D6 = numéro d'article d'une cellule précédente.
'ALORS on copie uniquement le nom du produit correspondant car on a déjà copié le numéro d'article'
Ensuite copier, dans la colonne "Produit", le contenu de la cellule "A6". Aller dans la feuille "database", dans la colonne "Description", dans la cellule "F6".
Ajouter un ";" après le "nom de produit" copié et coller le deuxième "nom de produit".
Et ENSUITE, revenir dans la feuille "Manuals", cellule "E5".
'case 2 : cas normal, on veut copier-coller un numéro d'article + son nom de produit dans la feuille "Database"'
SI la cellule "D6" contient un numéro d'article, ALORS, depuis la colonne "Product", on copie le contenu de la cellule "A6" et on le colle, dans la feuille "Database",
dans la colonne "Description", dans la cellule "F3".
Revenir dans la feuille "Manuals".
Et ENSUITE, dans la colonne "Installer", copier le contenu de la cellule "D6" et le coller dans la feuille "Database", dans la colonne "Article-no", dans la cellule "D4".
Et ENSUITE, revenir à la feuille "Manuals", cellule "E6".
Boucle : le même processus, décrit depuis la ligne 23 doit être répété pour chaque langue et ensuite pour chaque marque.
Début de ma macro enregistrée en Wysiwyg:
Sub Tri()
'
' Tri Macro
'
Selection.AutoFilter
ActiveSheet.Range("$A$3:$AU$35").AutoFilter Field:=2, Criteria1:="Branda" Range("A17"). ActiveCell.FormulaR1C1 = "azertya B 200/5" Sheets("Database"). ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _ DisplayAsIcon:=False, NoHTMLFormatting:=True
Range("F3"). ActiveCell.FormulaR1C1 = "azertya B 200/5 ; " Sheets("Manuals"). Range("D17"). ion.Copy Sheets("Database"). Range("D3"). ActiveSheet.Paste
Sheets("Manuals"). Range("E17"). ion.Copy Sheets("Database"). Range("D4"). ActiveSheet.Paste
Range("F3"). ion.Copy Range("F4"). ActiveSheet.Paste
Sheets("Manuals"). Range("A22"). ActiveCell.FormulaR1C1 = "azertya B 270/5" Sheets("Database"). Range("F3").
ActiveCell.FormulaR1C1 = "azertya B 200/5 ; azertya B 270/5" Range("F4"). ActiveCell.FormulaR1C1 = "azertya B 200/5 ; azertya B 270/5"
Sheets("Manuals"). Range("A28"). ion.Copy Sheets("Database"). Range("F5"). ActiveSheet.Paste
Range("F5"). ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; " Range("D5").
Sheets("Manuals"). Range("D28"). ion.Copy Sheets("Database"). ActiveSheet.Paste
Sheets("Manuals"). Range("E28"). ion.Copy Sheets("Database"). Range("D6"). ActiveSheet.Paste
Range("F5"). ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; " Range("F6"). ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; "
Sheets("Manuals"). Range("A33"). ActiveCell.FormulaR1C1 = "azertya BM 270/5 - 0.8" Sheets("Database").
Range("F5"). ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; azertya BM 270/5 - 0.8"
Range("F6"). ActiveCell.FormulaR1C1 = "azertya BM 200/5 - 0.8 ; azertya BM 270/5 - 0.8"
Sheets("Manuals"). Range("A5"). ActiveCell.FormulaR1C1 = "azertya 80/5"
Sheets("Database"). Range("F7:F8"). ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _ DisplayAsIcon:=False, NoHTMLFormatting:=True
Range("F8"). ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _ DisplayAsIcon:=False, NoHTMLFormatting:=True
Sheets("Manuals"). Range("F5"). ion.Copy Sheets("Database"). Range("D7"). ActiveSheet.Paste
Sheets("Manuals"). Range("G5"). Selection.Copy Sheets("Database"). Range("D8"). ActiveSheet.Paste
Sheets("Manuals"). Range("A8"). ActiveCell.FormulaR1C1 = "azertya 100/5" Sheets("Database"). Range("F7"). ActiveCell.FormulaR1C1 = "azertya 80/5 ; azertya 100/5"
Range("F8"). ActiveCell.FormulaR1C1 = "azertya 80/5 ; azertya 100/5" Range("B38").
Sheets("Manuals"). Range("A33"). ActiveCell.FormulaR1C1 = "azertya BM 270/5 - 0.8" Sheets("Database"). Range("F9:F10"). ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _ DisplayAsIcon:=False, NoHTMLFormatting:=True
Range("F10"). ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _ DisplayAsIcon:=False, NoHTMLFormatting:=True
Sheets("Manuals"). Range("F33"). ion.Copy Sheets("Database"). Range("D9"). ActiveSheet.Paste
Sheets("Manuals"). Range("G33"). Application.CutCopyMode = False ion.Copy Sheets("Database"). Range("D10"). ActiveSheet.Paste
Sheets("Manuals"). Range("H5").
End Sub
Bonjour,
Bel effort déjà !
Mais bon ! ton scénario est quasiment inutilisable...
Pour poser clairement le problème, il convient :
1) de caractériser sommairement la nature de l'opération à réaliser, sa raison d'être et l'objectif visé,
Par exemple : transposer un tableau par produits en base de données par marques...
2) détailler la nature des données initiales et leur disposition et détailler l'organisation cible des même données,
3) à partir de là, on pourra définir les transformations à opérer pour passer de l'organisation source à l'organisation cible, et choisir les méthodes les mieux adaptées et les plus rapides pour le réaliser, sachant que :
le schéma le plus rapide sera généralement de :
a) prélever les données (sous la ou les formes les plus adéquates...)
b) les travailler afin de les réorganiser, hors Excel, de la façon qu'on souhaite
c) restituer le résultat sur la feuille Excel cible.
Soit pas exactement le schéma méthodologique que tu envisages !
4) pour rappel : sans fichier d'illustration et sur lequel on puisse travailler, on en restera à une discussion à caractère général, pas plus !
Cordialement.