Archivage de données changées quotidiennement
Bonjour,
Etant peu expérimenté sur Excel, je cherche une solution à un problème assez simple.
Je dispose dans mon fichier d'une feuille de calcul de base (Feuille1), dont certaines valeurs (quantités à fabriquer pour le jour j) sont changées quotidiennement. A partir des quantités à fabriquer rentrées pour le jour j, les ingrédients nécessaire à l'élaboration de la recette sont calculés sur ce même premier onglet, dans une colonne. Cela donne donc les ingrédients à utiliser le jour j.
Je souhaite réaliser une sauvegarde quotidienne automatisée de cette colonne "ingrédients" dans une autre feuille de calcul (Feuille2).
Je ne peux me contenter de copier la valeur des cellules de la Feuille1 qui m'intéressent dans la Feuille 2. Par exemple, si je copie les valeurs de ma Feuille1 datées du 27 Janvier dans ma colonne "27 Janvier" de la Feuille2, quand je changerai le lendemain les quantités à fabriquer dans Feuille1, les valeurs sauvées hier dans la Feuille2 colonne "27 Janvier" seront réactualisées et je n'aurai alors que les valeurs du jour, soit le 28 Janvier. Je souhaite en fait que soit conservée la colonne "27 Janvier" et les valeurs correspondantes, et que soit créée juste à droite une nouvelle colonne "28 Janvier".
Pouvez-vous m'aider ?
Merci beaucoup !
Cyril
ps : n'hésitez pas à me demander des détails supplémentaires si besoin.
Bonsoir,
Personnellement, je te proposerai bien de partir sur une solution VBA avec Userform.
En gros, au lieu de compléter directement sur ta 1ère feuille, il y aurait un bouton que lequel cliquer. Ca t'ouvrirai un UserForm dans lequel tu remplis les champs qui t'intéressent. Les valeurs de ces champs seront repris automatiquement sur la 1ère feuille (du jour) et ajoutés sur la feuille d'archives.
Le mieux serait de nous fournir un fichier test afin de pouvoir faire un essai.
Pourrais-tu nous en fournir un ?
Merci.
Salut Sharney,
Merci beaucoup pour ta réponse et ton intérêt pour mon problème. Oui, cela peut être une solution, je ne connais pas du tout le fonctionnement du VBA. Est-ce que cela nécessite d'installer une extension à Excel ?
Je te transmets en PJ un fichier test sur lequel tu pourras essayer avec le UserForm.
Tout est dans le premier onglet. En Jaune, ce sont toutes les cellules qui sont modifiés chaque jour et à partir desquelles sont calculées les cellules en Rouge, qui elles doivent être archivées dans le second onglet. Je n'ai pas mis toutes les recettes ni tous les ingrédients de mon fichier, ça sera un peu plus lourd pour le réel.
Tu peux agencer l'onglet archivage au plus facile pour toi, je referai tout sur mon fichier de toute manière.
Merci beaucoup pour ton aide en tous cas,
Cyril
Salut.
Alors, je viens de faire un tour sur le fichier. Il me semble bien complexe, non ?
Personnellement, j'ai un peu de mal à comprendre les interactions entre les différentes cellules et quelles sont les données que tu as besoin.
Si j'ai bien suivi le fonctionnement :
1) les valeurs dans Produit 1 / Produit 2 et en G6/H6/G14/H14/G23/H23 se mettent à jour automatiquement en fonction d'un autre fichier ;
2) de ces données, tu détermines pour chaque recette le nombre d'ingrédients nécessaires dans la colonne des totaux en I ;
3) tu réalises la somme par ingrédient consommé sur la journée dans la colonne O.
Et donc, ce qui t’intéresse est de créer une archive dans la feuil2 qui récupère la date du jour et les données en O.
Au vu de ton fichier, je ne vais pas utiliser d'userform mais juste un bouton qui va activer une macro qui réalisera cet ajout.
Si j'ai bien compris, voici ce que je te propose.
Bonjour Sharney,
J'ai testé ton essai. Cela fonctionne tout à fait, c'est exactement ce dont j'avais besoin pour les ingrédients! La seule modification à faire serait de les mettre en colonne (une colonne par jour), en laissant deux colonnes vides entre chaque jour (c'est pour gérer les stocks, donc pour une date donnée, il y aura aussi stock au jour j, et entrée au jour j, la somme des ingrédients étant la sortie du jour j). U grand merci pour cette première réponse.
Concernant la complexité du fichier, je vais essayer de clarifier :
_ les valeurs Produit 1 et Produit 2 sont rentrées chaque jour sur la feuille 1 (la source sur le fichier test n'est pas valable, la saisie se fait manuellement chaque jour).
_ Les cellules G6/H6/G14/H14/G23/H23 sont des copies en valeur des produits 1 et 2 (parfois additionnés, comme pour la recette 1)
_ les points 2) et 3) sont justes.
J'aimerai également pouvoir activer la sauvegarde des recettes de la même manière que pour les ingrédients, dans une nouvelle feuille, exactement sur le même principe que pour les ingrédients.
Ce qui serait super maintenant, serait que tu m'expliques brièvement comment avoir accès à la macro que tu as créée, ce que signifie le code que tu as écrit, et comment tu crées le bouton pour activer l'archivage. Je pourrai ainsi essayer de modifier le code pour les ingrédients pour changer la forme de la sauvegarde (comme expliqué plus haut) et créer une seconde macro pour les recettes.
En tous cas, un grand merci pour ce que tu as déjà fait, cela va beaucoup simplifier mon travail quand j'aurai compris comment le refaire de mes propres mains!
Bonsoir,
Alors déjà de rien. Si cela correspond exactement à tes attentes, c'est super. Je viens de modifier la façon d'archiver les données pour créer des colonnes.
En gros, quand tu cliques sur le bouton Archiver données du jour, cela active une macro appelée Archiv
Tout ceci, fonctionne avec des formules de type VBA. Pour les retrouver, il faut que tu regardes en haut : Développeur et tu cliques sur Visual Basic. N'hésite pas à aller voir le cours ici pour plus de compléments. Il est bien fournit.
La formule de la macro utilisée est :
Sub Archiv()
'
Sheets("feuil2").Activate 'Sélectionne la feuille sur laquelle réaliser l'archive
Dim col As Integer 'déclare col comme étant une valeur fixe
col = Rows(1).Find("*", , , , , xlPrevious).Column + 3 'col = derniere colonne avec une information + 3
Cells(1, col).Value = Date 'renseigne la date du jour sur 1ère ligne dans la colonne déterminée plus haut
Cells(2, col).Value = Feuil1.Range("o2").Value 'renseigne la valeur écrite en o2 dans 2e ligne et colonne déterminée plus haut
Cells(3, col).Value = Feuil1.Range("o3").Value 'même principe pour les 4 suivants
Cells(4, col).Value = Feuil1.Range("o4").Value
Cells(5, col).Value = Feuil1.Range("o5").Value
Cells(6, col).Value = Feuil1.Range("o6").Value
End SubTout ce qui est en vert et commence par une apostrophe sont des commentaires que je t'ai fait afin de comprendre le but de chacune des lignes. Normalement je pense avoir été clair mais si tu as des questions, il ne faut pas hésiter.
Par contre, je ne sais pas si ça a un intérêt pour toi de créer deux boutons pour l'archivage. Si toutes tes valeurs sont remplies en même temps, tu peux très bien demander à la macro d'archiver les données des recettes sur une autre feuille dans la même macro : ça évite de faire un doublon.
Cordialement.
Merci pour tes commentaires et explications, c'est tout à fait compréhensible.
J'ai voulu en créer une moi-même en utilisant les lignes de code pour l'archivage des recettes. En fait, les recettes ne sont pas changées régulièrement, contrairement aux ingrédients pour lesquelles les valeurs bougent tous les jours, d'où l'intérêt de créer une macro spécifique (ou sinon, il faudrait introduire une condition qui n'archive la recette du jour que si elle diffère de la veille, mais je n'en suis pas encore là).
Donc j'ai repris ton code sur les lignes suivantes, en modifiant l'intervalle entre chaque nouvelle colonne créée à 1.
Pour l'écriture de la date ensuite, il n'y a pas de problème. Par contre, cela pose un pbm pour la suite, il me dit débogage... Je ne comprends pas très pourquoi cela ne fonctionne pas quand je lui renvoie à la feuille "Recettes". Voici le code que j'ai écrit :
Sub Archiv_PDouceur1()
'
' Archiv_PDouceur1 Macro
'
Sheets("Archives Recettes").Activate 'Sélectionne la feuille sur laquelle réaliser l'archive
Dim col As Integer 'déclare col comme étant une valeur fixe
col = Rows(1).Find("*", , , , , xlPrevious).Column + 1 'col = derniere colonne avec une information + 1
Cells(1, col).Value = Date 'renseigne la date du jour sur 1ère ligne dans la colonne déterminée plus haut
Cells(2, col).Value = Recettes.Range("E7").Value
Cells(3, col).Value = Recettes.Range("E8").Value
Cells(4, col).Value = Recettes.Range("E9").Value
Cells(5, col).Value = Recettes.Range("E10").Value
End Sub
Peux-tu m'éclairer sur cette question toute simple ? En fait, il faudrait que tu m'expliques comment fonctionnne la fonction FIND et ses arguments, cela serait sûrement le plus simple. J'ai parcouru rapidement le cours VBA, c'est bien fait effectivement, je vais m'y pencher un peu plus je pense.
Salut,
Alors pour commencer, concernant la méthode d'utilisation de Find, je te conseille de chercher sur Google, tu trouveras des tutoriels et des explications complètes sur différents sites (dont l'aide Excel). Personnellement,pour ton code, j'ai utilisé un code trouver sur un site, j'aurai du mal à t'expliquer chacun des arguments (c'est la première fois que j'utilise Find).
Concernant le bug, je me demande s'il serait pas au niveau du nom de tes feuilles. Il faut savoir que Feuil1 & Feuil2 sont les noms de base que l'on retrouve sur les onglets mais ce sont aussi les noms (dans les propriétés) de ces mêmes feuilles. Du coup, il y a deux solutions :
- Modifier les propriétés de chacune de tes feuilles afin de leur donner un nom que tu pourras utiliser (par contre je pense qu'il ne sera pas d'accord pour utiliser des espaces
) - Remplacer les Recettes par la formule Sheets("Recettes")
Normalement, je pense que ça devrait fonctionner.
J'espère ne pas avoir zappé de questions. Si tu en as d'autres, n'hésite pas, je répondrai dès que possible.
Bonjour Sharney,
Je vais regarder sur google ce que je trouve sur FIND.
Effectivement, le bug venait des feuilles, cela fonctionne bien maintenant. Je vais avancer sur mon fichier, j'espère que je vais pouvoir faire tout ce que je veux avec cette super macro que tu m'as pondue.
Un grand merci pour ton aide et ta réactivité en tous cas,
Cyril
Mais de rien Cyril,
Je reste disponible si tu as la moindre question. Mais il semble que tu as compris le principe, du coup le plus dur est fait.
Bonne journée,
Sha'
Bonjour Sharney,
Pour l'archivage des recettes, cela fonctionne parfaitement. Je souhaiterai maintenant avancer sur le fichier, sur la question de la gestion des stocks. La feuille "Stock F & L" correspondant aux stocks a 3 variables par date :
_ Entrée (rentrée à la main chaque jour en fonction de la livraison des Fruits et Légumes)
_ Sortie (correspondant aux ingrédients utilisés pour le jour j)
_ Stock du jour j = stock du jour j-1 + Entrée (jour j) - Sorties (jour j).
J'ai créé un bouton pour activer la macro, qui renvoie à la macro "Archiv_Stock".
J'ai un peu modifié les arguments avant la fonction FIND en suivant tes conseils.
Je te laisse regarder voir où il y a un problème.
Merci beaucoup,
Cyril
Salut,
Je crois que j'ai trouvé ce qui ne va pas :
col = Sheets("Stock F & L").Column("4").Find("*", , , , , xlPrevious).Column + 3En gros tu lui demandes de regarder la feuille Stock F & L, dans la colonne 4, chercher la dernière cellule avec une info et donner le numéro de colonne.
En remplaçant le Column par Rows, tu prendras une référence de colonne vide dans la ligne 4.
J'ai essayé ce que tu m'as dit :
En remplaçant la première occurrence de "Column" par Rows dans la ligne de code que tu as mis dans ton dernier message, l'exécution de la macro ne renvoie aucune erreur, mais rien n'apparaît dans le tableau de stocks. J'ai pourtant vérifié, il existe bien des valeurs dans la feuille "Recettes". Qu'en penses-tu ?
Merci !
Cyril
Alors, je viens d'essayer et me concernant ça renvoie bien les valeurs, mais pas au bon endroit.
En effet, avec la formule la cellule référence qu'Excel prend est N4, donc colonne N.
Les données sont copiées 3 colonnes au-dessus, en Q5, Q6 & Q7. Pas toi ?
A te lire.
Salut,
Effectivement, cela fonctionne aussi pour moi comme tu dis.
C'est tout simplement parce que j'avais déjà créé les titres des colonnes en avance... Si je veux que la fonction FIND fonctionne, il faut que je crée les titres des colonnes au fur et à mesure.
Je continue d'avancer, merci !
Cyril
Salut Sharney,
J'ai un peu modifié ce que j'ai fait pour créer les colonnes petit à petit, cela fonctionne bien.
_ j'ai un problème de syntaxe pour mettre la date dans la cellule (3, col + 1). Comment fais-tu ?
Cells(3, col + 1).Value = TODAY()
J'ai maintenant voulu faire une boucle for pour remplir tous les ingrédients. Là, j'ai deux problèmes :
_ comment remplacer la cellule "T2" à partir de laquelle la cellule à remplir dans la colonne "Sorties" doit se référer pour l'intégrer dans le processus de boucle for? J'ai voulu mettre "T(i-3)" mais cela ne fonctionne pas.
Cells(i, col + 1).Value = Sheets("Recettes").Range("T2").Value
_ Pour le dernier problème, je ne comprends pas à quoi cela est du.
Je te retransmets un fichier en PJ!
Merci, encore une fois!
Cyril
Salut,
- Alors, je crois que Excel ne comprend pas quand tu écris Cells(3, col + 1).
L'astuce va être de créer d'autres variables, par exemple tu définis col2 = col + 1
Petite astuce, plutôt que TODAY(), moi j'écris DATE. Ça fonctionne tout aussi bien
- Ensuite, concernant Range("T2"), Excel ne comprend pas non plus ce que tu as tapé.
Essaie en mettant Range("T" & i-3)
J'ai un doute concernant mon dernier code, n'hésite pas à tester, on va voir ce que ça donnera.
Cordialement
Salut Sharney,
J'ai essayé, cela fonctionne !!
Merci beaucoup pour ton aide en tous cas, cela va simplifier pas mal de choses.
Cyril
Salut,
Pas de soucis.
Suis content si cela t'aide.
A+.