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.

screenshot sheet database screenshot sheet manuals
4desc-macro.txt (7.06 Ko)

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 ! ), écrire tes copier-coller sur une seule ligne chacun... On gagnera beaucoup de volume de code et ça deviendra nettement plus lisible, et on pourra remplacer tes copier-coller par des affectations de valeurs, plus efficaces.

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... en ce sens qu'il impose une interprétation sur la base d'une analyse qui, elle, est occultée. On ne sait donc pas où l'on va avec !

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.

Rechercher des sujets similaires à "copier certaines donnees conditions entre feuilles"