Valeur automatique d'après valeur autre fichier Excel

nicodak,

Je regarde ton fichier journalier que je peine un peu à déchiffrer, probablement parce que les liaisons ont fait place à des valeurs.

Donc l'objectif est de reporter sur le nouveau fichier :

- K3:K20 de PRODUCTION et J70:J87 de ADMIN

et sur ADMIN :

- K3:K20 de PROD.

Ensuite on efface, J70:J87 de ADMIN. Et c'est tout ce qu'il faut effacer ? Qu'en est-il de la partie REEL de PRODUCTION ?

Et sur le nouveau fichier, tu souhaites reprendre les valeurs ou ajouter les valeurs aux précédentes ?

Si le 21/08 : j'ai de 254 d'un produit et le 22/08 : 146 du même produit > Dois-je obtenir 400 sur le fichier analyse ?

Vous avez tout compris !

J'ai effectivement oublié de dire qu'il faut également supprimer les valeurs REEL sur l'onglet PRODUCTION.

Les valeurs reportées sur le nouveau classeur ne doivent pas s'ajouter, il devrait y avoir 2 colonnes par jour (PROD et RET)

Salut nicodak,

Je pense que j’ai réussi à atteindre l’objectif de départ avec en plus, si besoin, les éditions PDF. Le code tient sur un seul module avec une macro principale NouvelleJournee qui exécute les autres dont 3 macros opérationnelles :

EditionPDF("PRODUCTION"), EditionPDF("LIVRAISON") et Archivage (qui ouvre le 2nd classeur, …).

Avant de commencer, il faut que tu adaptes avec tes propres données ou que tu t’adaptes au code.

Pour l’instant, la macro considère que ce fichier est dans un dossier quelconque, qui doit contenir, outre notre fichier, un autre dossier nommé RECAP PROD dans lequel il y a le fichier "analyse-prod.xlsx". Ce sous-dossier est censé héberger les futures éditions de PDF. Attention, tout changement d’emplacement, de nom de dossier, de fichier ou d’onglet doit impérativement donner lieu à une modification correspondante dans le code (pour éviter un bug) !

Je pense qu’il y a encore des améliorations possibles à faire. Je ne connais pas l’utilisation concrète du fichier mais j’ai le sentiment que le tableau dans administration peut-être supprimé, notamment grâce à l’inclusion de colonnes VOL.SUPP et RETOURS dans PRODUCTION, après la colonne K ? Dans ce cas, la saisie réelle dans production (partie droite) serait copiée en fin de journée dans la colonne gauche pour devenir la production prévisionnelle pour le lendemain.

Par ailleurs, je ne suis toujours pas convaincu de l’utilité d’utiliser un nouveau classeur, sachant qu’il est possible de créer un nouvel onglet sur ce même fichier, mais bon...

Je t'envoie les fichiers et je t'envoie une variante avec transposition des données (que je préfère pour ma part).

8boulangerie.xlsm (49.13 Ko)

Les fichiers avec transposition. A chaque fois, ils vont de pair donc il faut garder ou supprimer les 2...

J'ai légèrement réagencé le fichier analyse pour faciliter les opérations. Il faut donc respecter la nouvelle disposition du tableau (dans chacun des cas).

Pour la transpo, il ne faut pas fusionner les dates, pour se laisser la possibilité de filtrer.

Et je n'ai pas ajouté de bouton, je te laisse le soin de l'ajouter ou tu veux.

A bientôt,

Hello 3GB ! Quand je vois les dizaines de lignes de code VBA j'ai un peu honte... Vous avez dû passer un temps fou pour créer tout cela ! Je vous remercie vraiment, je ne pensais pas recevoir autant d'aide.

Je pense qu’il y a encore des améliorations possibles à faire. Je ne connais pas l’utilisation concrète du fichier mais j’ai le sentiment que le tableau dans administration peut-être supprimé, notamment grâce à l’inclusion de colonnes VOL.SUPP et RETOURS dans PRODUCTION, après la colonne K ?

L'onglet PRODUCTION va être utilisé par les boulangers devant leur fournil sur un PC tactile PANASONIC prévu pour les garages, chantiers, etc... Je veux qu'ils aient uniquement les informations essentielles et rien d'autre qui pourraient les perturber dans leur compréhension du tableau. Ce sont de très bons boulangers mais avec un niveau bureautique proche de zéro. Alors autant leur simplifier la tâche.

Par ailleurs, je ne suis toujours pas convaincu de l’utilité d’utiliser un nouveau classeur, sachant qu’il est possible de créer un nouvel onglet sur ce même fichier, mais bon...

Vous avez tout à fait raison et fini par me convaincre. Je vais créer un onglet ANALYSE dans le même classeur. Quitte à le cacher avec l'onglet ADMINISTRATION sur les PC tactiles de production. Vous avez insisté sur ce point et vous avez eu raison.

Je vais de ce pas essayer de comprendre le code VBA que vous avez créé et tenter de le modifier pour qu'il colle maintenant à la solution finalement retenue : les données sont extraites quotidiennement dans l'onglet ANALYSE dans le même classeur.

J'aurais probablement (très probablement) encore quelques questions. Merci encore pour votre précieuse aide 3GB.

De plus, et comme je ne savais plus comment avancer techniquement sur ce classeur, j'ai passé du temps à faire du "cosmétique"... Pensez-vous que cela change beaucoup de choses à votre code ?

Bon je replonge dedans...

2proliv-b-2020.xlsx (31.97 Ko)

Aucun souci, mais c'est vrai que j'y ai passé plus de temps que ce que j'avais imaginé.

Désolé d'avoir insisté mais certaines solutions, bien que tentantes, sont finalement plus complexes à mettre en oeuvre et à pérenniser que d'autres, pour un bénéfice égal, voire moindre.

L'onglet (voire les onglets si vous voulez ensuite avoir un récap plus affiné) peut en effet se masquer facilement.

Si vous voulez, je peux me charger de changer le code, ce sera plus facile maintenant.

En ce qui concerne les retouches que vous avez faites, je crois qu'elles seront perdues, car j'ai nommé des plages (K3:K20 > "TOTAL_PROD", ...) pour rendre les références dynamiques. Donc, il vaut mieux que vous repartiez de l'un de mes fichiers, de préférence le second, je dirais. Sinon, du vôtre, mais à condition de renommer à l'identique les plages qui nous intéressent.

Oui, je me doute bien que tout ne sera pas clair au premier coup d'oeil. Bon courage.

A bientôt,

J'ai changé les 'range' dans le code VBA, est-ce que cela suffit à adapter le code au "nouveau" classeur ?

'2 - OPERATIONS DE MISES A JOUR
'------------------------------------------

'Copie production sur classeur analyse
Reprise:
With WbAnalyse.Sheets(1)

    NbLig = WbJourn.Sheets("PRODUCTION").Range("TOTAL_PROD").Cells.Count 'nombre de lignes ˆ coller (nb produits)
    NvCol = .Cells(1, 1).CurrentRegion.Columns.Count + 1 'emplacement nouvelle colonne

    If NvCol > 3 Then 'si nouvelle colonne > 3
        .Range(Columns(NvCol - 2), Columns(NvCol - 1)).Copy Destination:=.Cells(1, NvCol) 'copie-colle les 2 colonnes prŽcŽdentes
    ElseIf NvCol > 1 Then 'sinon si nouvelle colonne vaut 2 ou 3
        .Columns(NvCol - 1).Copy Destination:=.Range(Cells(1, NvCol), Cells(1, NvCol + 1)) 'copie-colle colonne prŽcŽdente sur les 2 nvlles
        .Range(Cells(2, NvCol), Cells(2, NvCol + 1)).Value = Array("PROD", "RET") 'et renvoie PROD et RET en ligne 2
    Else: 'sinon si nvlle colonne = 1 > crŽe colonne 1
        .Cells(1, 1).Value = "DATES" 'saisie DATES en ligne 1
        .Cells(2, 1).Value = "PRODUITS" 'saisie PRODUITS en ligne 2
        WbJourn.Sheets("PRODUCTION").Range("LES_PRODUITS").Copy 'copie liste des produits
        .Range(Cells(3, 1), Cells(NbLig + 2, 1)).PasteSpecial Paste:=xlPasteValues 'colle en ligne 3
        GoTo Reprise 'retourne alors ˆ la ligne Reprise
    End If

    .Cells(1, NvCol).Value = Now 'renvoie date du jour
    .Range(Cells(1, NvCol), Cells(1, NvCol + 1)).MergeCells = True 'fusionne les 2 cellules de la date
    .Range(Cells(3, NvCol), Cells(NbLig + 2, NvCol + 1)).ClearContents 'efface contenu des cellules o on collera les infos (contrainte MAC)

    WbJourn.Sheets("PRODUCTION").Range("TOTAL_PROD").Copy 'Copie Sheets("PRODUCTION").Range("L3:L20")
    .Range(Cells(3, NvCol), Cells(NbLig + 2, NvCol)).PasteSpecial Paste:=xlPasteValues 'colle en PROD

'Copie retours sur classeur analyse
    WbJourn.Sheets("ADMINISTRATION").Range("RETOURS").Copy 'Sheets("ADMINISTRATION").Range("I20:I37")
    .Range(Cells(3, NvCol + 1), Cells(NbLig + 2, NvCol + 1)).PasteSpecial Paste:=xlPasteValues 'colle en RET

'FERMETURE AVEC SAUVEGARDE D'ANALYSE
    WbAnalyse.Close savechanges:=True
    https://forum.excel-pratique.com/post/repondre/145487#
End With
    'ActiveWindow.Visible = True 'Pour afficher la fenetre active

'Copie production sur admin
With WbJourn
    .Sheets("PRODUCTION").Range("TOTAL_PROD").Copy 'Sheets("PRODUCTION").Range("L3:L20")
    .Sheets("ADMINISTRATION").Range("VOL_PROD").PasteSpecial Paste:=xlPasteValues 'Sheets("ADMINISTRATION").Range("G20:G37")

'Effacement contenus RETOURS, VOLUME SUPP, PRODUCTION BIHORAIRE
    .Sheets("ADMINISTRATION").Range("VOL_SUPP:RETOURS").ClearContents 'Sheets("ADMINISTRATION").Range("G20:I37")
    .Sheets("PRODUCTION").Range("PROD_REEL").ClearContents 'Sheets("PRODUCTION").Range("I3:K20")
End With

End Sub

Pour simplifier le tout, je ne souhaite pas d'édition de PDF, cela ne sera pas utile puisque les données intéressantes sont maintenant extraites et copiées dans l'onglet ANALYSE. Il ne reste donc "plus que" :

1. extraction des données de production réelle de l'onglet PRODUCTION vers l'onglet ANALYSE qui remplacent également les données de volume de production de l'onglet ADMINISTRATION.

2. extraction des données de volume retour de l'onglet ADMINISTRATION vers l'onglet ANALYSE puis leur suppression de l'onglet ADMINISTRATION

3. suppression des données de production réelle de l'onglet PRODUCTION

Concernant ce bout de code .Sheets("ADMINISTRATION").Range("VOL_SUPP:RETOURS").ClearContents 'Sheets("ADMINISTRATION").Range("G20:I37") qui supprime les données de volume de production supplémentaires et volume de retours sur l'onglet ADMINISTRATION, le Range("G20:I37") supprime également H20:H37 n'est-ce pas ? Parce que ces cellules semblent vides mais il y a en fait une formule (écrite en blanc sur fond blanc) qui sert à déclencher ou pas la soustraction du volume retour au volume de production.

4proliv-b-2020.xlsx (31.92 Ko)

Qu'en pensez-vous ?

Salut nicodak,

Non, en fait le code appelle des plage de cellules (celles à manipuler en l'occurrence) par leur nom, que j'ai moi-même défini sur Excel. Ça permet de rendre le code dynamique. Sans ça, supposons qu'un jour quelqu'un fasse une insertion de ligne, un L3:L20 deviendrait un L4:L21 et ça provoquerait un bug, ne reconnaitrait pas la range sous son adresse statique. VBA ne s'adapte pas comme excel malheureusement donc il faut essayer de limiter les sources d'erreurs.

Justement, j'avais pas mal avancé de mon côté et ai vu votre fichier totalement restructuré (je le trouve plus beau ainsi d'ailleurs), mais sans la conservation des noms de plage. Donc je suis reparti de votre fichier pour les définir à nouveau et insérer ce que j'avais fait.

Au cas où, il faut se rendre sur gestionnaire de noms pour consulter les noms et leur emplacement correspondant. Il vaut mieux faire du couper-coller avec les plages définies. Le nom suit la plage. Il faut être vigilant lors de l'ajout d'une cellule à la plage, c'est-à-dire insérer une cellule ou une ligne à l'intérieur plutôt qu'aux extrémités.

Sinon, je pense que pour ma part, tout est bon. Les changements ont permis d'alléger le code et de le rendre plus lisible.

J'ai compris pour les PDF mais je n'ai pas effacé les lignes car on sait jamais, ça pourrait servir. J'ai donc mis les lignes en commentaire (au cas où, grâce à une simple apostrophe > donne tout ce qui est en vert).

J'ai également ajouté des lignes pour enlever et remettre les protections de feuille.

Je suis désolé, je n'avais pas vu qu'il y avait des formules et je me demandais pourquoi il y avait des commentaires à cet endroit. J'ai donc rectifié de manière à préserver la colonne (qui était en effet effacée).

Voici le fichier et n'hésitez pas si vous avez des questions. Et surtout, faites des tests pour voir ce qui n'irait pas.

Bonne soirée,

4boulangerie2.xlsm (57.18 Ko)

Merci beaucoup 3GB !

Par contre lorsque je lance la macro il y a un message d'erreur :

Erreur d''exécution '1004'

Erreur définie par l'application ou par l'objet

Qui renvoie à cette ligne dans le code (malgré tout dans l'onglet ANALYSE des lignes sont crées mais elles sont vides)

.Range(Cells(NvLig, 1), Cells(NvLig + 1, 1)).Value = CDate(Format(Now, "DD/MM/YYYY")) 'NE PAS FUSIONNER !!!

Je t'en prie !

Et bien, ça commence à la 1ere ligne, c'est cool.

Juste avant, il y a cette ligne :

With Sheets("ANALYSE").Range("RECAP")

Donc, il est probable que tu aies renommé l'onglet ou le tableau, ou que tu aies testé à partir d'un fichier qui ne contienne pas le tableau sur ANALYSE.

J'ai téléchargé votre fichier, l'ai ouvert dans Excell, exécuté la macro et PAN ! le message d'erreur... J'ai touché à rien, j'vous jure !!

Une piste : lorsque je vais dans le gestionnaire de nom et que je clique sur modifier RECAP et que je ne touche à rien et clique seulement sur OK il y a un message d'erreur :

La syntaxe de ce nom est incorrect

Je vais regarder alors. J'utilise un Mac ce qui provoque plein de bugs que je ne rencontre pas sur Windows et inversement.

Est-ce que vos feuilles PRODUCTION ET LIVRAISON sont protégées ? Pouvez-vous essayer en remplaçant Format par worksheetfunction.text si ça ne marche pas sans la protection ?

Comme je vous ai dit, j'ai prévu des lignes dans la macro NouvelleJournee pour déprotéger et protéger. Il suffit d'enlever l'apostrophe qui se trouve devant.

C'est la protection qui bloque

Ah non en fait...

Ca y est, c'est bon. La macro fonctionne quand elle est exécutée de l'onglet ANALYSE mais pas d'un autre. Et lors de chacun de mes tests, je me trouvais sur cet onglet.

J'ai rajouté une petite ligne et ça marche de mon côté.

On passe à la version 3 !

4boulangerie3.xlsm (56.29 Ko)

J'ai essayé en remplaçant Format par worksheetfunction.text mais le problème persiste.

J'ai ôté les protections aussi mais sans succès.

Je ne veux pas prendre trop de votre temps, profitez de votre weekend

La macro se lance bien est le message de réussite s'affiche mais les valeurs de production sont toutes à 0 ainsi que les valeurs de déclenchement (puisque elles dépendent des valeurs de production) Le tableau d'analyse se remplit bien par contre.

Est-ce que la séquence n'est pas à l'envers dans le code ?

'Copie production sur administration
    Range("TOTAL_PROD").Copy
    Range("VOL_PROD").PasteSpecial Paste:=xlPasteValues

'Effacement contenus des zones de saisie : RETOURS, VOLUME SUPP, PRODUCTION BIHORAIRE
    Range("VOL_SUPP").ClearContents 'possibilitŽ sur 1 ligne (range("X","Y","Z").clearcontents)
    Range("RETOURS").ClearContents
    Range("PROD_REEL").ClearContents
Rechercher des sujets similaires à "valeur automatique fichier"