Transfert de données d'une feuille à une autre

0

Bonjour,

Je voudrais faire le transfert de données d'une feuille de calcul à une autre. Je veux transférer les données de mes colonnes Palette et Poids comme indiqué dans le fichier joint vers une deuxième feuille qui prendrais l'identifiant de la palette ainsi que le poids additionné des palettes s'il y a lieu comme dans l'exemple joint que j'ai fait manuellement.

https://www.cjoint.com/c/LGAoaqUymEy

Merci pour votre aide

Bruno

    Posté le 26 juillet 2022, 16:02
    par Bruno
    Répondre
    0

    Bonjour Bruno,

    https://www.cjoint.com/c/LGBbef63DB0

    * regarde d'abord "Feuil2"

    * regarde ensuite "Feuil1"

    * fais Ctrl e

    * vérifie les résultats

    si besoin, tu peux demander une adaptation.
    à te lire pour avoir ton avis.

    rhodo

    rhodo Posté le 27 juillet 2022, 02:01
    par rhodo
    0

    Bonjour rhodo,

    Donc si je comprends bien en faisant Ctrl e le transfert de tous ce qui est inscrit dans les colonnes palettes et poids se transfert sur la page 2 avec le calcul des poids pour les identifiant correspondant. Cela fonctionnera pour toutes les lignes du fichier ?                          Si c'est le cas cela serait parfait pour mes besoins actuels.

    Si des données s'ajoutent en cours de route, il n'y a qu'à faire à nouveau Ctrl e pour mettre à jour la feuille 2 ?

    Est ce bien compliqué à mettre en place ?

    Merci pour cette réponse rapide.

    Bruno

    Posté le 27 juillet 2022, 14:04
    par Bruno
    0

    Bonsoir Bruno,

    j'ai dû m'absenter longtemps, et je viens de lire ton post.

    Ctrl e est le raccourci clavier qui lance la macro CPP() ; il faut être sur Feuil1 pour lancer cette macro, sinon ça ne fait rien ; à partir de Feuil1, ça fait ce double travail, en deux temps :

    1) d'abord, ça copie les #Palette de la colonne G en Feuil2, colonne A ; cela de telle façon que ce soit une liste sans doublons.

    2) ensuite, pour chaque #Palette de Feuil2!A, ça met juste à droite, en colonne B, le Cumul des Poids selon les données de Feuil1!H.

    ça fait ce double travail pour toutes les lignes de Feuil1, même si tu ajouteras d'autres lignes en dessous ; dans le classeur exemple, c'est : ajout de lignes sous la ligne 19.

    en fait, c'est selon la colonne G : la 1ère ligne est la ligne n° 2 car la 1ère donnée est en G2 : "Z-1" ; la dernière ligne est celle de la dernière donnée de la colonne G : ici, c'est donc la ligne n° 18 car la dernière donnée est en G18 : "Z-3".

    à propos des Poids de la colonne H qui sont utilisés pour faire les cumuls par palette : seuls sont pris en compte les poids situés juste à droite d'un #Palette ; ici, c'est :

    * 150 en H2 ; car à droite de Z-1 en G2.
    * 85,6 en H6 ; car à droite de Z-1 en G6.
    * 211,5 en H10 ; car à droite de Z-2 en G10.
    * 337,2 en H18 ; car à droite de Z-3 en G18.

    pour la palette Z-1, tu peux vérifier que 150 + 85,6 = 235,6 ; c'est bien ce cumul qui est en Feuil2!B2.

    -------------------------------------------------------------------------------

    tu as écrit : « Si des données s'ajoutent en cours de route, il n'y a qu'à faire à nouveau Ctrl e pour mettre à jour la feuille 2 ? »

    exact. :)

    -------------------------------------------------------------------------------

    tu as écrit : « Est-ce bien compliqué à mettre en place ? »

    non ; il suffit de ces 3 choses :

    1) le fichier Excel doit être un .xlsm pour pouvoir contenir du code VBA (donc des macros) ; rappel : un fichier .xlsx ne peut pas contenir de code VBA ; si au départ ton vrai fichier est un .xlsx, tu dois obligatoirement le convertir en .xlsm ; pour cela : appuie sur la touche F12 ➯ fenêtre "Enregistrer sous" ; en bas, sous "Nom de fichier :", il y a "Type :" ; dans la liste, choisis le 2ème item "Classeur Excel (prenant en charge les macros)" ; dessous, clique sur le bouton "Enregistrer" ; le classeur de la fenêtre Excel est maintenant celui du nouveau fichier .xlsm ; le fichier original .xlsx est toujours sur ton disque dur ; tu pourras plus tard le supprimer ; mais comme c'est ta 1ère manip, vérifie d'abord que tout est ok dans le .xlsm.

    2) fais Alt F11 pour aller sur la fenêtre "Microsoft Visual Basic pour Applications" ; fais Alt i m pour insérer un nouveau module ; ce sera un module standard, tel que Module1, dont la page vierge (blanche) est à droite ; c'est  qu'il faut copier / coller mon code VBA ; il s'agit donc ici du code VBA de la macro CPP() ; j'ai choisi ce nom car, comme indiqué en commentaire, c'est : Cumul Poids par Palette.

    3) fais Alt F11 pour retourner sur la fenêtre Excel ; au niveau d'une feuille de calcul, fais Alt F8 ➯ fenêtre "Macro" ; dans la liste des macros, la macro CPP doit être sélectionnée (ligne sur fond bleu) ; à droite, clique sur le bouton "Options..." ; dans la petite case, mets la lettre e puis clique sur le bouton "OK" ; c'est ça qui crée le raccourci clavier Ctrl e ; tu es de retour sur la fenêtre "Macro" ; ferme cette fenêtre : clic sur la croix du coin haut droit ; tu es de retour sur la feuille de calcul.

    là, c'est tout bon : tu peux utiliser Ctrl e comme tu l'as déjà fait avec mon fichier exemple ; mais d'abord :

    sauvegarde le classeur pour éviter d'avoir à refaire toutes les manips précédentes !

    rhodo

    Posté le 27 juillet 2022, 23:27
    0

    Bonjour Bruno,

    Lis d'abord mon post précédent : celui d'hier à 23:27.

    J'ajoute ici le commentaire de mon code VBA.

    --------------------------------------------------------------------------------

    Option Explicit : oblige à déclarer toutes les variables.

    Sub CPP() .. End Sub : macro CPP() ; CPP = Cumul Poids par Palette

    If ActiveSheet.Name <> "Feuil1" Then Exit Sub : si on n'est pas sur "Feuil1", on quitte la sub.

    Dim n& : idem que Dim n As Long ; déclaration d'une variable n, de type Long.

    Rows.Count : nombre de lignes d'une feuille de calcul ; avec un fichier .xlsm, c'est 1048576 ; cette instruction dans un ancien fichier .xls donnerait 65535.

    n = Cells(Rows.Count, 7).End(3).Row : idem que n = Cells(Rows.Count, "G").End(xlUp).Row
    c'est donc le « calcul » de la dernière ligne utilisée, selon la colonne G, à partir du bas et en remontant vers le haut ; dans le fichier exemple : n = 18.

    If n = 1 Then Exit Sub : si n = 1, ça signifie qu'on est sur l'en-tête de colonne G1 "#Palette" ➯ il n'y a aucune donnée en dessous ➯ y'a rien à faire ➯ on quitte la sub.

    Dim cel As Range, d, i& : déclaration de 3 autres variables ; cel est un objet de type Range ; d est déclaré sans type ➯ c'est par défaut le type Variant ; i est de type Long.

    Set d = CreateObject("Scripting.Dictionary") : d va servir pour utiliser le dictionnaire (c'est une technique pour éviter automatiquement les doublons).

    For i = 2 To n .. Next i : boucle i de 2 à n ; ici de 2 à 18.

    With Cells(i, 7) .. End With : avec la cellule de la ligne i et de la colonne G.

    If .Value <> "" Then d(.Value) = "" : si la cellule contient une donnée (par exemple "Z-1") on s'en sert comme ajout d'une clé dans le dictionnaire ; cet essai d'ajout est ignoré si la clé existe déjà dans le dico ➯ c'est ça qui évite les doublons ➯ dans le fichier exemple, ça évite d'avoir 2× "Z-1" ➯ en sortie de la boucle i, le dico contiendra uniquement ces 3 clés : "Z-1" ; "Z-2" ; "Z-3".

    Application.ScreenUpdating = 0 : désactivation de la mise à jour de l'écran ➯ la sub s'exécute plus rapidement.

    With Worksheets("Feuil2") .. End With : avec la feuille "Feuil2"

    .[A2:B29].ClearContents : effacer la plage A2:B29 des résultats (en "Feuil2").

    d.Count : contient le nombre de clés du dictionnaire ; ici, c'est 3 clés.

    .[A2].Resize(d.Count) = Application.Transpose(d.Keys) : on écrit le dico à partir de A2, et en colonne (en "Feuil2") ; c'est ça qui termine la 1ère étape ; la suite est pour la 2ème étape.

    For i = 2 To n .. Next i : boucle i de 2 à n ; comme n n'a pas changé : ici, c'est encore de 2 à 18 ; on est obligé de faire une autre boucle car il fallait d'abord la liste des #Palette sans doublons ; ne cherche pas à réunir les 2 boucles en une seule : laisse comme c'est !

    If Cells(i, 7) <> "" Then .. End If : si la cellule de la ligne i colonne G contient une donnée (par exemple "Z-1") alors...

    Set cel = .Columns(1).Find(Cells(i, 7), , -4163, 1, 1) : idem que :
    Set cel = .Columns("A").Find(Cells(i, "G"), , xlValues, xlWhole, xlByRows) :
    on cherche la donnée en "Feuil2" colonne A.

    If Not cel Is Nothing Then .. End If : si on a trouvé la donnée, la référence de la cellule est dans la variable cel.

    cel.Row retourne le n° de ligne de la donnée trouvée.

    .Cells(cel.Row, 2) = .Cells(cel.Row, 2) + Cells(i, 8) : pour la cellule de la ligne cel.Row, colonne B (en "Feuil2") : on y ajoute la donnée de la cellule de la ligne i colonne H : c'est ça qui fait le cumul des poids par palette.

    .Select : on sélectionne "Feuil2" pour montrer les résultats.

    --------------------------------------------------------------------------------

    ATTENTION

    en "Feuil2", ligne 30, il y a : en A30 : "Total" ; en B30 : =SOMME(B2:B29) ; ma macro est conçue en supposant qu'il n'y aura jamais plus de 28 palettes (de A2 à A29), sinon les résultats de la macro vont "écraser" cette ligne 30 !

    si c'est bien le cas qu'il n'y aura jamais plus de 28 palettes, alors c'est ok : tu peux laisser comme c'est ; sinon, y'a 2 solutions (voir ci-dessous)perso, je préfèrerais la solution B) car elle évite qu'il y ait de nombreuses lignes vides.

    A) si le maximum de palettes sera en fait, par exemple, 34 palettes, ajouter 6 lignes au-dessus de la ligne 30 ➯ de A2 à A35, ça fait bien une place pour 34 palettes ; la ligne du total sera alors la ligne 36 ; formule en B36 : =SOMME(B2:B35) (cet ajustement a été fait automatiquement suite à l'ajout des 6 lignes ➯ c'est inutile de modifier la formule).

    B) faire une autre version du fichier sans la ligne 30 du total et sans les lignes vides 2 à 29.

    c'est la macro CPP() qui écrira le total juste sous la dernière palette.

    avec les données du fichier exemple, juste sous la ligne 4 qui contient "Z-3" et 337,2 il y aura en ligne 5 : "Total" et 784,3 (écrit « en dur », sans formule).

    rhodo

    rhodo Posté le 28 juillet 2022, 09:25
    par rhodo
    0

    Bonjour,

    J'achoppe sur l'étape 3. J'ai fait comme indiqué en 2 pour inscrire CPP(), mais il semble qu'il me manque quelque chose parce que lorsque j'arrive à l'étape 3, je ne trouve rien comme Macro dans cette fenêtre. Je ne comprends pas. https://www.cjoint.com/c/LGCtxBqGuqy

    Pour ce qui est du nombre de palette que nous aurons à l'avenir cela ne devrait pas dépasser le 28 palettes, ce qui était exceptionnel. C'est pourquoi j'ai fait une liste comprenant 28 lignes, mais je crois que je vais aller à 30 pour être bien au-delà de ce qui est nécessaire habituellement.

    Merci beaucoup pour ton temps et les explications.

    Posté le 28 juillet 2022, 21:25
    par Bruno
    0

    Bonjour Bruno,

    voici le nouveau fichier :

    https://www.cjoint.com/c/LGDbf1EULZ0

    A) sur la 2ème feuille "Poids palette", j'ai ajouté 2 lignes au-dessus de la ligne 30 ➯ de A2 à A31, ça fait bien une place pour 30 palettes ➯ la ligne du total est alors la ligne 32 ; formule en B32 : =SOMME(B2:B31) (cet ajustement a été fait automatiquement suite à l'ajout des 2 lignes ➯ je n'ai pas eu besoin de modifier la formule) ; par contre, dans le code VBA, l'effacement de la plage des résultats est devenu : .[A2:B31].ClearContents

    B) va sur la 1ère feuille "Commande" ; fais Ctrl e ; puis vérifie les résultats ; c'est les mêmes qu'avant, sauf que cette fois, le total des poids est bien en ligne 32.

    -------------------------------------------------------------------

    1) pour ton tout 1er post du 26 juillet : j'aurais déjà dû te dire que ce n'est vraiment pas pratique du tout d'avoir fourni en lien une simple image .png au lieu d'un fichier Excel exemple ! ça m'a obligé à recopier toutes les données !  :(

    2) pour ton post précédent du 28 juillet : là non plus, ce n'est pas pratique d'avoir fourni une simple image .png ! j'ai quand même pu voir que le nom de ton vrai fichier est :

    "Commande Attaches Reliable.xlsm"

    3) j'ai aussi vu que le nom de la 1ère feuille est "Commande" ; pour la 2ème feuille, j'ai mis le nom "Poids palette" ; mais comme sur ton image .png la largeur de la fenêtre Projet est trop étroite, peut-être qu'il y a un "s" au bout ? ça serait alors "Poids palettes" ; si oui, tu devras ajuster le nom de cette 2ème feuille dans le code VBA :

    With Worksheets("Poids palettes")

    4) sur ton image .png j'ai vu aussi que tu as correctement inséré un module standard : c'est bien Module1 ; mais à droite, sur la page de ce module, il ne fallait pas mettre seulement la ligne "CPP()" ! c'est tout mon code VBA qu'il aurait fallu copier / coller !

    comme j'ai modifié le code VBA selon les nouvelles infos de ton image .png, le plus simple est que sur la page de Module1 de ton vrai fichier, tu fasses un copier / coller de tout mon nouveau code VBA ; tu dois arriver à ceci :

    https://www.cjoint.com/c/LGDcnekhH30

    ensuite, fais Alt F11 pour retourner sur la fenêtre Excel ; puis n'oublie pas d'ajouter le raccourci clavier Ctrl e comme je te l'avais déjà indiqué auparavant dans un post précédent.

    si ça ne marche pas dans ton vrai fichier, c'est que le nom de la 2ème feuille doit être "Poids palettes" (avec un "s" au bout) ; dans ce cas, relis le point 3) ci-dessus.

    rhodo

    rhodo Posté le 29 juillet 2022, 04:26
    par rhodo
    0

    Bonjour Bruno,

    Lis d'abord mon post précédent, du 29 juillet à 04:26.

    il y a un nouveau fichier Excel et des explications complémentaires.

    je pense que cette fois, tu pourras faire en sorte que ça marche
    dans ton vrai fichier.  :)

    --------------------------------------------------------------------------------------------------------

    je t'ai aussi répondu sur ton autre sujet : "Surligner deux lignes différemment
    avec des conditions différentes".

    je t'ai proposé une solution avec une MFC qui ne change pas la couleur
    de remplissage d'une ligne si tu mets 0 en colonne A.

    bien sûr, ça met correctement les 2 autres couleurs de fond bleu et vert.

    rhodo

    rhodo Posté le 30 juillet 2022, 06:29
    par rhodo
    0

    Bonjour Rhodo.

    Désolé pour le délai de retour. j'étais parti en vacances pour une semaine. Je suis de retour aujourd'hui le 08 aout.

    J'ai fait le modification indiquées, mais le résultat n'est pas bon. Je n'ai pas les bonnes lignes et les bonnes colonnes qui apparaissent dans ma feuille de poids. Cette fois ci, je joint le fichier complet avec l'erreur que j'ai constaté. Comme je ne suis pas assez familier avec ce type de formule et le code VBA, je ne sais trop quoi corriger pour que le tout soit tel que voulu.https://www.cjoint.com/c/LHiukMq0T3y 

    Merci beaucoup

    Bruno

    Posté le 8 août 2022, 22:13
    par Bruno
    0

    Bonsoir Bruno,

    j'viens d'voir ton post d'hier à 22:13 ; j'espère que t'as passé d'bonnes vacances !  ;)

    pour ton nouveau fichier : c'est normal que ça ne veut pas marcher vu que la structure de la feuille "Commande" est différente !

    * il y a une colonne de plus : la colonne F (qui est vide) ; elle avait une largeur 0 ; j'ai mis une largeur 0,75 (➯ c'est maintenant la même largeur que celle de la colonne D) ; cette colonne F supplémentaire explique que la dernière colonne est maintenant la colonne i (au lieu de H avant) ; et maintenant : la colonne "#Palette" est la colonne H ; la colonne "Poids total" est la colonne i.

    * la 1ère ligne de données était avant la ligne 2 ; c'est maintenant la ligne 4 ; car au-dessus, il y a maintenant 3 lignes au lieu d'une seule ligne.

    j'ai dû adapter le code VBA en conséquence ; voici la nouvelle version du fichier :

    https://www.cjoint.com/c/LHjs6H0kCn0

    --------------------------------------------------------------------------------------------------------------

    1) à l'ouverture du fichier, tu es sur la 2ème feuille "Poids palette".

    * il y a 32 lignes ; la ligne des en-têtes est la ligne 1 ; la ligne "Total" est la ligne 32.

    * les lignes 2 à 31 sont les lignes de données ; il y a donc de la place pour 30 palettes ; note bien que toutes ces 30 lignes de données sont vides.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    2) va sur la 1ère feuille "Commande" ; attention : j'y ai fait quelques changements :

    * en A8 : 0 ; la couleur de remplissage n'est pas devenue verte, car j'ai changé la condition de la 2ème règle de MFC : =$A4>0 ; ainsi, ça te permet de saisir 0 ou laisser 0 sans que ça change la couleur de fond de la ligne ; d'après ce que tu avais écrit sur ton autre sujet "Surligner deux lignes différemment avec des conditions différentes", il me semble bien que c'est quelque chose à laquelle tu tenais beaucoup !  ;)

    * en A9 : Complet : ça, c'est juste pour te montrer que la ligne est bien sur fond bleu ; c'est tout à fait normal, vu que je n'ai pas changé la 1ère règle de MFC.

    * en A12 : 150 ; en H12 : Z-2 ; en i12 : 32,1 ; ça, c'est pour qu'il y ait tout de même un cas de #Palette répété ; ainsi, tu pourras voir en 2ème feuille que la macro aura bien supprimé les doublons ; et le cumul des poids pour la palette Z-2 sera bien de : 128,4 + 32,1 = 160,5.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    fais Ctrl e ➯ travail effectué !  :)  sur la 2ème feuille "Poids palette", note bien qu'en colonne A, il y a "Z-2une seule fois seulement : il est en A3 ; et en B3, il y a bien le bon cumul de poids : 160,5 ; en B32, la formule =SOMME(B2:B31) retourne bien le bon Total global : le Total des cumuls de poids est bien : 556,05 ; je te laisse lire le nouveau code VBA pour voir toutes les différences avec l'ancien code VBA ; bon courage !  ;)

    --------------------------------------------------------------------------------------------------------------

    sauf si tu as autre chose à demander, il me semble bien que cet exo est terminé !  :)  donc c'est tout bon : tu peux repartir en vacances au bord de la mer, pour te dorer au soleil, te promener sur le sable fin de la plage, et nager dans les vagues !  :D  (c'est sûr que c'est mieux que les palettes !)

    rhodo

    rhodo Posté le 9 août 2022, 21:46
    par rhodo
    • Bonjour Rhodo, Un immense merci pour l'aide apporté sur ce sujet. À voir ce qu'il en est concernant les codes VBA, je serais encore à me gratter la tête pour savoir par où commencer. Oui effectivement pour ce fichier c'est terminé. Pour ce qui est de la suite que je veux intégrer, je suis à même de finaliser les détails. – Bruno 10 août 2022, 14:28

    Si vous n'êtes pas inscrit sur le site, vous pouvez poster librement (en tant qu'invité).
    Pour cela, indiquez un pseudonyme (nom d'utilisateur) et une adresse email :