Duplication fichier .xlsm, remplissage donnée auto

Bonjour à tous,

Je suis ici, car j'ai déjà pu y trouver pas mal de renseignements pour avancer dans mon projet mais j'ai encore pas mal interrogations.

Pour la petite introduction, cela fait maintenant 2 semaines que je m’intéresse au VBA, en effet je suis actuellement en apprentissage d'école d'ingénieur et je dois l'utiliser pour une mission en entreprise. J'ai donc encore énormément à apprendre !!

Bref, rentrons dans le vif du sujet, ma mission aujourd'hui est de créer un fichier Excel permettant à ma secrétaire de rentrer les heures badgées par les employés et de les comparer aux heures de travail données par rapport à des bons de travail. (Je vous vois venir, "Ouuuuuuh le vilain flicage !!!! " Bref, c'est pas moi qui décide hein !)

Ce fichier sera remplis chaque fin de semaine par ma secrétaire, afin d'avoir un suivi sur la durée.

Depuis ces données nous aurons accès à différents graphiques plus visuels pour chaque semaine et chaque Animateurs d'Equipes.

Ainsi qu'un fichier global incrémentant chaque semaines les résultats de l'année.

J'ai donc pensé à :

  • Un fichier par semaine regroupant, un onglet par Animateur ainsi qu'un onglet Global
  • Ma secrétaire remplira uniquement l'onglet Global et une macro activé à l'aide d'un bouton se chargera de remplir les autres onglets
  • Enfin un fichier Récapitulatif de l'année ira chercher directement les données dans chaque fichiers semaine pour incrémenter au besoin les données entrées dans chaque fichiers semaine.

Si certains sont motivés à m'accompagner dans ma mission, j'actualiserais régulièrement ce post avec les avancées des fichiers et du codage.

05/01/16 :

J'ai déjà commencé le codage. (on ne juge pas je suis nouveau ! Pour moi c'est déjà bien )

Je vais pour l'instant uniquement mettre le fichier qui correspondra au fichier par semaine, chaque chose en son temps.

Il est duplicable et quasi-fonctionnel. (les valeurs sont archi-fausse, et tous les graphiques ne sont pas présents mais ce n'est qu'un détail)

Mon problème :

Je duplique actuellement le fichier avec renommage automatique, suppression des fichiers si déjà existants.

Cependant, je voudrais que les fichiers créé, dispose du même code intégré que le premier. Et qu'il soit ainsi indépendant du premier, en effet aujourd'hui si je demande une duplication à partir du fichier Semaine 22, il ouvre le fichier Semaine 1 et lance la macro (qui marche correctement cependant)

(Cas d'utilisation : un employé change de service, ou quitte l'entreprise, intègre, etc .... On doit pouvoir modifier le fichier et tous les fichiers futurs sans affecter les premiers.)

Je recherche aujourd'hui une solution pour récupérer le fichier avec le code intégrer au fichier à chaque duplication.

Ainsi qu'une petite explication de ma fonction FichierExiste, c'est une fonction que j'ai trouvé sur internet, qui marche, mais je ne comprend pas le démarche .... Ce qui, vous vous en douté est relativement triste !

PS : Je suis également ouvert à toute proposition d'optimisation du code !!! Mes commandes sont faites avec mon peu de connaissances et sont sans doutes facilement optimisable avec de meilleurs méthodes

Voilà tout pour aujourd'hui, j'espère que cela intéressera certains d'entre vous ! Je vous remercie d'avance, je m'excuse également des fautes, si il y a je n'ai pas vraiment eu le temps de me relire.... Et je serais dispo, pour toute précisions, ou si je n'ai pas été assez clair sur un point dès demain matin !

Egalement pour la mise en forme du sujet, je ne sais pas trop ce que vous attendez : fichier + code, fichier uniquement ? Je vous met pour l'instant uniquement le fichier n'hésitez pas à me demander pour plus.

07/01/2016 :

Aujourd'hui le fichier duplication est, je pense, terminé, sauf petit réajustement, j'ai utilisé le code de Fred pour le remplissage des onglets. Extrêmement plus rapide que le mien ^^

Et utilisé son conseil d'enregistrer sous le fichier, avec le nom de la semaine suivante plutôt que de créer un nouveau fichier à chaque fois et le renommer. Bien plus rapide également.

Je m'attaque donc au fichier annuel/mensuel (peu importe, la base est la même seul le choix des semaines change), je pense utiliser la même base de code que celle utilisé par fred pour remplir les onglets en l'adaptant au remplissage d'un onglet depuis plusieurs classeurs.

Je l'avais déjà commencé, mais n'avais pas du tout à la manière de Fred, je vais donc adapter son code à cette problématique.

Je viens de terminer la base du fichier, toujours avec l'utilisation du tableau de Fred.

Le fichier est pour l'instant basique, et non-adaptable au besoin de l'utilisateur mais fait ce qu'on lui demande.

Pour transférer les données des fichiers par semaine à un unique fichier "Annuel", le code met 12 secondes pour les 15 premières semaine ce qui est relativement correct. Je vous fait parvenir le fichier pour avis. Merci

Il me faut maintenant le sécuriser, utilisant un principe d'incrémentation, j'hésite à la manière de sécuriser le processus afin de ne pas avoir d'erreur du à une sur-incrémentation.

Incrémenter directement dans le tableau (je ne sais même pas si c'est possible, mais je vais rechercher), et ne remplir le fichier global qu'ensuite (ce qui obligerait à reparcourir tout les fichier à chaque actualisation, un peu moins d'1 minute par opération)

Ou sécuriser l'incrémentation à l'aide de variable afin de toujours savoir ce qui a ou qui n'a pas été remplis (comment ? ... )

Des conseils ?

Cordialement,

Corentin

21semaine1.xlsm (89.80 Ko)
23fichier-global.xlsm (89.32 Ko)

Bonsoir et bienvenu

j'aurais plusieurs remarques

1) plutot que de faire un nouveau fichier pour une nouvelle semaine, je ferais plutot un fichier "enregistrer sous" en supprimant les données de la semaine ainsi tes macros serait toujours dans le fichier .

2) ne jamais utiliser de chemin écrit en dur... car si le pc plante, la secrétaire change, tu passes d'un OS a un autre,........ le chemin ne sera plus bon mais comme tous les fichiers seront dans le même dossier utiliser plutôt l'instruction

activeworkbook.path 

pour obtenir le chemin du fichier actuel pour enregistrer le suivant

pour ce qui est de ta fonction fichierexiste, je ne suis pas un pro de cela mais je crois que c'est lié plus au VBS qu'au VBA, (utilisation d'instruction du système windows) mais cela fonctionne très bien en VBA peut-etre que quelqu'un pourra t'expliquer mieux que cela

une autre façon de faire serait :

If Dir("C:\Users\boulbesc\Desktop\VBA\2016\Detail_semaine\Semaine0" & N_semaine & ".xlsm") <> "" Then
     Msgbox "Fichier présent !"
Else
     Msgbox "Fichier non présent !"
End if

fred

Bonjour et merci beaucoup de votre réponse Fred,

1) plutot que de faire un nouveau fichier pour une nouvelle semaine, je ferais plutot un fichier "enregistrer sous" en supprimant les données de la semaine ainsi tes macros serait toujours dans le fichier .

J'y ai pensé pendant l'écriture de mon sujet en effet, je vais essayer de le mettre en place rapidement et actualiserais le fichier.

2) ne jamais utiliser de chemin écrit en dur... car si le pc plante, la secrétaire change, tu passes d'un OS a un autre,........ le chemin ne sera plus bon mais comme tous les fichiers seront dans le même dossier utiliser plutôt l'instruction

activeworkbook.path 

Merci pour cette petite ligne je vais voir comment la mettre en place.

une autre façon de faire serait :

If Dir("C:\Users\boulbesc\Desktop\VBA\2016\Detail_semaine\Semaine0" & N_semaine & ".xlsm") <> "" Then
     Msgbox "Fichier présent !"
Else
     Msgbox "Fichier non présent !"
End if

Ça me plait !

PS : avez-vous regardé ma méthode, pour transférer les données d'un onglet vers les autres ? Qu'en pensez-vous ? Une méthode pourrait-elle être plus efficace ?

Merci pour tout cela je reviens dès que j'ai finis,

Corentin

Bonjour

je viens de regarder ton code rapidement... je ne suis pas très familier avec le vlookup, mais bcp de choses ralentisse l'execution de ton code les select et les changement de feuille....

du plus tu ne travail pas de maniere correcte, il faut prendre l'habitude de déclarer tes variables... pour t'obliger a le faire il faut mettre en debut de module : option explicit

si j'ai bien compris je t'ai refais une macro utilisant une variable tableau,

temps d'execution de ma macro moins de 135ms contre la tienne plus de 7.6 secondes sur ma machine, c'est a dire 50 fois plus lent...

a+

fred

9semaine01.xlsm (87.22 Ko)

Bon ...

Alors, je vais étudier votre code et pleurer.

Ceci dit c'est très gentils de votre part !

Edit :

J'ai modifié mon fichier, avec l'option "Fichier enregistrer sous" que vous m'aviez recommandée, ActiveWorkbook.Path, ainsi que votre code d'actualisation des onglets.

Cela à déjà bien accélérer le code l'option enregistrer sous en effet !

Qu'en pensez-vous ?

Edit : Je précise que j'actualise régulièrement le premier post, n'hésitez pas à le consulter pas mal de nouvelle avancée ! (et encore plus de question...)

19semaine1.xlsm (91.86 Ko)

Petit UP pour de nouveaux avis ?

Corentin

Bonsoir

je n'arrive a pas comprendre ce que tu recherches a faire....

voyons voir si j'ai compris ton raisonnement :

tu veux préparer en début d'année tous les fichiers pour les 52 semaines

dans le cas ou une modification des employés en faites a la semaine X, il faut refaire les fichiers de la semaine X a la semaine 52.

est-ce cela ???

pour se qui est de la sécurisation j'ai perso rien compris.....

et enfin dernière question dans ton fichier global annuel que vas tu chercher dans les fichiers semaine pour les coller où dans le fichier global et faire quoi comme traitement ???

fred

Rebonjour !

tu veux préparer en début d'année tous les fichiers pour les 52 semaines

dans le cas ou une modification des employés en faites a la semaine X, il faut refaire les fichiers de la semaine X a la semaine 52.

est-ce cela ???

Oui, tout les fichiers seront préparés à l'avance. Évidemment sans horaires, uniquement des 0.

Ma secrétaire, prendra alors les fichiers par semaine et remplira uniquement l'onglet Global. La première macro lui permettra de remplir les autres onglets. Chose qui se fait parfaitement avec votre code.

Ensuite la deuxième macro lui permettra, si un jour des modifications d'employés arrivent, de modifier tous les fichiers suivant sans altérer les premiers.

pour se qui est de la sécurisation j'ai perso rien compris.....

Tout simplement aujourd'hui, dans le fichier annuel, si je clique plusieurs fois sur le bouton "actualiser", j'incrementerais à chaque fois les valeurs de toutes les feuilles "Semaine" dans mon fichier "Annuel"

Ce qui faussera évidement les valeurs.

Il me faut trouver un moyen pour rendre le fichier le plus simple d'utilisation possible sans laisser la possibilité d'erreur.

et enfin dernière question dans ton fichier global annuel que vas tu chercher dans les fichiers semaine pour les coller où dans le fichier global et faire quoi comme traitement ???

Euh pas compris désolé ^^

Merci beaucoup du temps que vous y passez !!

Bonjour CorentinB, fred2406,

Avant toute chose Bienvenu dans le monde de la programmation VBA

Je viens de suivre le fil que tu entretiens avec fred2406...

Je te souhaite bon courage !

Juste quelques suggestions quand tu encodes tes routines (procédures ou fonctions)

  1. Mets toujours au moins une lettre majuscule dans tes noms de variables pourquoi ?
    par ce que par exemple lorsque tu encodes
    If feuille_inc.Name <> "Global" Then remplir_SH feuille_inc, tb

    (trouvé quelque part dans le code de ton appli) si jamais tu oublies un L à feuille_inc tu auras du mal à t'en apercevoir à la relecture et surtout VBA va planter ! alors que si tu utilises par exemple feuille_Inc dans la déclaration à chaque que tu écris cette variable elle sera "majusculisée automatiquement" par l'EDI, si ce n'est pas le cas cela veut dire que tu as mal "ortografié" personnellement j'ai horreur des "underscore" (le trait du 8 )
  2. Utilise des variables explicites (pas seulement au sens VBA comme te le suggérais fred2406) mais aussi au sens humain au lieu de
    Nom = ActiveWorkbook.Name utilise nomActu (pour NOM du classeur Actuellement actif) ou encore nomActif
  3. Indente systématiquement tes routines dès l'entrée dans un nouveau processus/bloc
    (à mon avis)
    Sub IfExistKill_10(N_Semaine)
    If Dir(ActiveWorkbook.Path & "\Semaine" & N_Semaine & ".xlsm") <> "" Then  
    Kill ActiveWorkbook.Path & "\Semaine" & N_Semaine & ".xlsm"  
    End If
    End Sub

    très difficile à lire !
    Sub IfExistKill_10(N_Semaine)
    If Dir(ActiveWorkbook.Path & "\Semaine" & N_Semaine & ".xlsm") <> "" Then
        Kill ActiveWorkbook.Path & "\Semaine" & N_Semaine & ".xlsm"
    End If
    End Sub

    un peu plus facile à lire !
    Sub IfExistKill_10(N_Semaine)
        If Dir(ActiveWorkbook.Path & "\Semaine" & N_Semaine & ".xlsm") <> "" Then
            Kill ActiveWorkbook.Path & "\Semaine" & N_Semaine & ".xlsm"
        End If
    End Sub

    presque plus besoin de lire ! et cela et d'autant plus vrai au fur et à mesure que les boucles ou les tests s'imbriquent

Je te souhaite bon courage !


andrea73 a écrit :

presque plus besoin de lire ! et cela et est d'autant plus vrai au fur et à mesure que les boucles ou les tests s'imbriquent

Bonjour Andréa,

je te remercie pour tous ces petits conseils ! J'essaierai de m'y tenir au maximum, même si personnellement je trouve les underscore assez pratique

Mais le truc des majuscules me plait bien au contraire !

Pour revenir sur le sujet, je dois avouer que j'ai vraiment besoin de conseils sur la technique à utiliser.

En effet, comme je disais il me faut absolument empêcher les doublons dans ces fichiers.

Je pensais à plusieurs chose :

La première, garder nos 52 fichiers déjà créés et remettre à 0 le fichier annuel et repartir de la semaine 1. (Moyen le plus sur mais trop long)

La deuxième , garder nos 52 fichiers déjà créés, et empêcher d'incrémenter plusieurs fois la même feuille. (Quel procédé ?)

Bonjour pour renommer des fichiers en nombre c'est assez simple.

on peut utiliser les fonction movefile qui permet de deplacer un fichier et le renommer en même temps... mais si le dossier de depart et de destination est le meme cela ne fait que renommer le fichier

voici un exemple d'utilisation à adapter donc ...

Sub renome_fichier()
Dim oFSO As Object
Dim rep As String

Set oFSO = CreateObject("Scripting.FileSystemObject")
'recupération du chemin seul
rep = Mid([A1], InStr([A1], "[") + 1)
rep = Left(rep, Len(rep) - 1) & "\"
'parcourir tout le tableau
For i = 4 To [A65536].End(xlUp).Row
'Deplacemnt avec  renommage
oFSO.Movefile (rep & Range("A" & i).Value), (rep & Range("C" & i).Value)
Next i

End Sub

Fred

Rebonjour à vous,

Merci pour ce petit bout de code Fred !

Je pense avoir fini mon fichier, ouais parce que c'est jamais fini ces p'tite bête là on trouve toujours des moyens de le faire planter et faut modifier quelques lignes ...

Je vous le présente ainsi, je n'ai malheureusement pas encore eu le temps de tout commenter ! J'éditerais dès demain pour tout commenter.

Je suis preneur de tout avis, dans la mise en forme, technique utilisé (d'autre plus fiable, plus rapide etc ...), manière de coder, etc ...

Toute remarque est bonne à prendre

Merci d'avance,

Cordialement,

Corentin

PS : pour que tout fonctionne ==> Créer un dossier de nom quelconque, mettre fichier "Global_annuel" dedans, créer un dossier "Detail_semaine" dans le dossier quelconque et y mettre le fichier "Semaine1". Et si je suis pas trop mauvais tout fonctionnera

14semaine1.xlsm (141.05 Ko)
7global-annuel.xlsm (142.90 Ko)

Rebonjour !

Dernière problématique et après j'en ai terminé !

Je verrouille et déverrouille ma feuille depuis la macro, problème actuellement lorsque je tape mon code celui-ci est affiché à l'écran.

Quelqu'un aurait-il une solution à proposé afin que ce dernier soit affiché en astérisque ?

Voir fichier ci-joint,

Cordialement,

Corentin

Edit : Modification du fichier, message précédant idem

12global-annuel.xlsm (142.90 Ko)
Rechercher des sujets similaires à "duplication fichier xlsm remplissage donnee auto"