IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Générer plusieurs fichiers à partir d'un modèle [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut Générer plusieurs fichiers à partir d'un modèle
    Bonjour le forum!!

    J'ai trouvé quelques pistes de solution, mais la logique me manque pour préparer une macro fonctionnelle pour ce que je désire faire.

    Problèmatique : Nous utilisons des fichiers de suivi hebdomadaire pour la planification de travaux (qui comportent plusieurs onglets). Nous avons donc un fichier par semaine, qui sont créés en début d'année (total de 53 fichier incluant un fichier modele). Parcontre, chaque fois qu'une modification doit être apportée au format ou aux conditions (peu importe le changement), on doit modifier le fichier modèle et regénérer le fichier de chaque semaine restant dans l'année (on ne modifie pas ceux qui sont passés).
    Dans chaque fichier, sur le premier onglet, la date du lundi correspondant à la semaine est inscrit manuellement (les autres journées se calculent). Le nom du fichier correspond au numéro de semaine et à la date du lundi associé (ex: S25.2013-06-24.xlsm)

    Objectif : J'aimerais pouvoir générer les fichiers de l'année automatiquement en inscrivant la date du premier fichier à générer dans mon fichier modèle (sur le premier onglet) et ensuite appuyer sur un bouton pour qu'il me créer un fichier pour chaque semaine suivante (donc modifier la date, enregistrer sous, remodifier la date, enregistrer sous, etc). J'ai un onglet où les dates des lundis à utiliser associés aux noms de fichier à utiliser sont inscrites.

    Donc voila... Je sais que c'est probablment vague, mais je ne sais vraiment pas par où commencer...
    Auriez-vous une piste à me proposer?
    Merci à l'avance!!!
    Geneviève

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Bonjour,

    Dans la macro suivante, le classeur modèle s'appelle "Modele.xlsm", à adapter. La macro crée tous les classeurs à partir de la date inscrite dans le premier onglet de "Modele.xlsm".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub CommandButton1_Click()
        Dim Dat As Date, Wbk As Workbook, Dat2 As Date
        Set Wbk = Workbooks.Open(ThisWorkbook.Path & "\Modele.xlsm")
        Dat = CDate(Sheets(1).Name)
        For i = 0 To 54
            Dat2 = Dat + (7 * i)
            If Year(Dat) = Year(Dat2) Then
                Wbk.Sheets(1).Name = Format(Dat2, "yyyy-mm-dd")
                Wbk.SaveCopyAs ThisWorkbook.Path & "\S" & i + 1 & "." & Format(Dat2, "yyyy-mm-dd") & ".xlsm"
            Else
                Exit For
            End If
        Next i
        Wbk.Close False
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bonjour!

    Tout d'abord, merci pour cette réponse! Parcontre, elle doit être adaptée un peu autrement.

    Cette partie est résolue
    1. La date ne doit pas être récupérée par le nom du permier onglet, mais bien dans une cellule du premier onglet (une cellule fusionnée en B5)
    2. La nouvelle date doit donc être inscrite dans cette même cellule (B5) et non dans le nom du premier onglet


    Aussi, deux petits problèmes:
    1. Peu importe la date de départ, le numéro de la semaine du premier fichier est 1, je me retrouve donc avec S1.2013-04-22 au lieu de S17.2013-04-22
    2. Pour les semaines en bas de 10, le nom du fichier est S1, S2, S3... et doit être S01, S02, S03...


    Donc voila!
    Je vais avoir besoin d'aide à coup sur pour adapter tout ça!

    Encore merci de votre aide!!

    À la limite, le S1, S2, S3 nous pourrons faire avec (ça demandera des changements, mais c'est faisable).

    Parcontre, il faut absolument que le numro de semaine SXX corresponde à la date. Impossible d'avoir S1.2013-04-22.

    Avez-vous une piste pour moi?
    Merci encore!!

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Bonjour,

    A condition que la date soit renseignée en B5 du fichier Modele :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CommandButton1_Click()
        Dim Dat As Date, Wbk As Workbook, Dat2 As Date
        Set Wbk = Workbooks.Open(ThisWorkbook.Path & "\Modele.xlsm")
        Dat = Sheets(1).[B5]
        For i = 0 To 54
            Dat2 = Dat + (7 * i)
            Wbk.Sheets(1).Name = Format(Dat2, "yyyy-mm-dd")
            Wbk.SaveCopyAs ThisWorkbook.Path & "\S" & Format(i, "00") + 1 & "." & Format(Dat2, "yyyy-mm-dd") & ".xlsm"
            End If
        Next i
        Wbk.Close False
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Malheureusement, cela ne fonctionne pas bien.
    Si ma date en B5 du fichier modèle est 2013-11-11 (à titre d'exemple), les fichiers créés débutent à S1.2013-11-11 et vont jusqu'à S55.2014-11-24 (donc la macro crée automatiquement une année entière).

    • Je souhaite que les fichiers créés arrêtent à la dernière semaine de l'année en cours (ce que mon code fait actuellement).
    • Le numéro de semaine débutent encore par S1 au lieu de renvoyer le bon numéro de semaine associé à la date en B5.


    Voici où j'en suis avec mon code. Cela permet de récupérer et d'inscrire la date dans la cellule B5.
    Reste à trouver comment inscrire le numéro de semaine correspondant (ex 2013-11-11 devrait être S46.2013-11-11).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub CommandButton1_Click()
        Dim Dat As Date, Wbk As Workbook, Dat2 As Date
        Set Wbk = Workbooks.Open(ThisWorkbook.Path & "\SXX.2013-MM-AA.xlsm")
        Dat = Sheets(1).[B5]
        If MsgBox("Vous allez générer les fichier à partir du " & Dat, vbYesNo, "Création des fichiers de planification") = vbYes Then
     
        For i = 0 To 54
        Dat2 = Dat + (7 * i)
            If Year(Dat) = Year(Dat2) Then
                Sheets("Planifications").Range("B5:G5") = Format(Dat2, "yyyy-mm-dd")
                Wbk.SaveCopyAs ThisWorkbook.Path & "\S" & i + 1 & "." & Format(Dat2, "yyyy-mm-dd") & ".xlsm"
            Else
                Exit For
            End If
     
     
        Next i
        Wbk.Close False
    End If
    End Sub
    Merci de prendre le temps de travailler à mon problème!!

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Il y a 3 sortes de numéro de semaine. Laquelle utilises-tu ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Je ne sais pas quoi te répondre
    Pour les 52 semaines dans l'année nous débuton le dimanche. Donc le lundi 7 janvier 2013 était la semaine 1 de l'année 2013. Il faut donc continuer dans ce sens.

    Est-ce que ce serait plus s'imple d'avoir un onglet avec toutes les dates des lundi et d'y placer le numéro de semaine à côté pour aller récupéter ça dans le titre du fichier?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Est-ce que ce serait plus s'imple d'avoir un onglet avec toutes les dates des lundi et d'y placer le numéro de semaine à côté pour aller récupéter ça dans le titre du fichier?
    Non, il y avait un bug dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub CommandButton1_Click()
        Dim Dat As Date, Wbk As Workbook, Dat2 As Date
        Set Wbk = Workbooks.Open(ThisWorkbook.Path & "\Modele.xlsm")
        Dat = Sheets(1).[B5]
        For i = 0 To 54
            Dat2 = Dat + (7 * i)
            If Year(Dat2) = Year(Dat) Then
                Wbk.Sheets(1).Name = Format(Dat2, "yyyy-mm-dd")
                Wbk.SaveCopyAs ThisWorkbook.Path & "\S" & Format(i + 1, "00") & "." & Format(Dat2, "yyyy-mm-dd") & ".xlsm"
            End If
        Next i
        Wbk.Close False
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bonjour!

    Malheureusement le problème est toujours le même....
    Les fichiers créés arrêtent bien à l'année en cours, mais le premier fichier créé porte toujours le numéro de semaine S1, peut importe la date.

    Que je début à 2013-01-07 ou à 2013-11-11, j'ai les fichiers suivants :
    S1.2013-01-07.xlsx
    S1.2013-11-11.xlsx

    Ce qui ne fonctionne pas...

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Regarde l'image :
    Images attachées Images attachées  
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bonjour!
    Ça fonctionne dans la mesure où on commence au 2013-01-07.

    Mais je dois pouvoir générer à partir de n'importe quelle date (je fais des modifications au modèle en cours d'année et le but de cette macro est de pouvoir générer les fichiers des semaines restantes dans l'année à partir d'une date X et non juste à partir de la première semaine de l'année).

    Cet exemple simule des modifications faite en début novembre. Je dois donc pouvoir générer les 8 semaines restantes de l'année.

    Avec la macro telle qu'elle est, voici ce que j'obtiens :



    Le premier fichier commence toujours par S01 au lieu de S avec le bon numéro de semaine!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2008
    Messages : 106
    Points : 58
    Points
    58
    Par défaut
    Bon j'ai finalement résolu le tout en plaçant une feuille de référence dans mon modèle (ici Sheets(9)) qui renvoie le numéro de semaine associé à la date en B5 sur la première feuille par une recherche verticale sur une liste.

    Voici donc le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub CommandButton1_Click()
        Dim Dat As Date, Wbk As Workbook, Dat2 As Date
        Set Wbk = Workbooks.Open(ThisWorkbook.Path & "\SXX.2013-MM-AA.xlsm") ' mon fichier modèle
        Dat = Sheets(1).[B5]
    If MsgBox("Vous allez générer les fichier à partir du " & Dat, vbYesNo, "Création des fichiers de planification") = vbYes Then
     
        For i = 0 To 54
            Dat2 = Dat + (7 * i)
            If Year(Dat2) = Year(Dat) Then
                Sheets(1).[B5] = Format(Dat2, "yyyy-mm-dd")
                Wbk.SaveCopyAs ThisWorkbook.Path & "\" & Sheets(9).[F1] & "." & Format(Dat2, "yyyy-mm-dd") & ".xlsm"
            End If
        Next i
        Wbk.Close False
    Else: Wbk.Close False
     
    End If
    End Sub
    Qui me donne comme résultat:


    Mission accomplie!
    Merci beaucoup pour le support!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/05/2015, 18h14
  2. Ouvrir plusieurs fichiers à partir d'un répertoire
    Par Iria77 dans le forum Général Python
    Réponses: 7
    Dernier message: 12/09/2006, 11h43
  3. Comment faire pour générer un fichier à partir d'une BD MySQL
    Par dessinateurttuyen dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/07/2006, 20h39
  4. Générer plusieurs fichiers à partir d'un fichier excel
    Par yas2006 dans le forum Documents
    Réponses: 3
    Dernier message: 02/06/2006, 17h54
  5. Générer des fichiers à partir d'un état
    Par laurent35 dans le forum Access
    Réponses: 3
    Dernier message: 02/05/2006, 02h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo