Création de date dans le titre d'1 copie d'une feuille excel

Bonjour à la communauté,

J'ai besoin d'un grand coup de main.

Le contexte:

Il s'agit d'une feuille excel que je voudrais copier dans un autre fichier avec un titre qui contient une date qui soit créée à chaque fois que j'active la macro de copy, de façon à différencier les feuilles dans le fichier copie au fur et mesure qu'elles sont créés. Dans notre exemple le nom de la feuille serait : Master data_Référentiel remises (yyyy,m,d)

Voici la macro que j'ai essayé de créer, mais je bloque sur la mise en place de la date dans le titre.

'Copier la feuille MD dans le fichier Master Data
Sub CopyMDVersClasseur()
Sheets("MD LECASUD").Copy
Chemin = "D:\Remises\Master data_Référentiel remises (yyyy,m,d).xlsx"
ActiveWorkbook.SaveAs Chemin
End Sub

Merci de votre aide.

Merci d'avance

4 réponses

Résumé de la discussion

Le besoin est de copier une feuille dans un autre fichier et de nommer ce fichier avec une date afin de distinguer les copies au fil des exécutions. La solution consiste à formater la date (ou l’horodatage) pour éviter les caractères non autorisés, puis à construire le chemin du fichier, par exemple en utilisant des chaînes comme maDate = Format(Date, "yyyymmdd") et Chemin = "D:\Remises\Master data_Référentiel remises" & maDate & ".xlsx". Pour une précision temporelle accrue, on peut ajouter l’heure via MaDateAvecHeure = Format(Now, "yyyymmddhhmmss") et l’employer dans Chemin. Enfin, la feuille est copiée puis le classeur est sauvegardé avec ActiveWorkbook.SaveAs Chemin.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    Tu peux récupérer la date du jour grâce à Date. Y ajouter l'heure (précision à la seconde) grâce à Now.
    Comme tu va les utiliser dans un nom de fichier, on va éviter les caractères spéciaux en formatant ces deux fonctions.

    Dim maDate As String, MaDateAvecHeure As String, Chemin As String
    
    maDate = Format(Date, "yyyymmdd")
    MaDateAvecHeure = Format(Now, "yyyymmddhhmmss")
    Chemin = "D:\Remises\Master data_Référentiel remises" & maDate & ".xlsx"
    'ou
    ' Chemin = "D:\Remises\Master data_Référentiel remises" & MaDateAvecHeure & ".xlsx"

    1
    1. merci Franck, pour l'aide, ça fonctionne.

      Cependant j'ai un message qui s'affiche à chaque fois:

      "Les fonctionnalités suivantes ne peuvent pas êtres enregistrées dans des classeurs sans macros:

      . Projet VB

      Pour enregistrer un fichier avec ces fonctionnalités, cliquer sur Non, puis sélectionnez un type de fichier prenant en charge les macros dans la liste Type de fichier.
      Pour continuer à enregistrer en tant que classeur sans macro, cliquez sur Oui."


      Comment faire qu'il n'a paresse pas et que le fichier aille se ranger dans son fichier gentillement sans poser de question ?
      0
      1. Modérateur
        Salut,

        Si tu as une macro dans tes fichiers (et là c'est le cas car on fait une copie du classeur contenant la macro), il convient de les enregistrer en .xlsm au lieu de .xlsx.

        Mais bon, ce n'est pas la bonne solution car tu va reproduire x fois une macro, dans x classeurs, alors que cela ne t'es d'aucune utilité.

        Solution 1
        Ce que tu peux faire, c'est te créer un classeur vierge, ne contenant que la macro.
        Par contre, il te faudra légèrement modifier cette dernière pour qu'elle :
        1- vérifies si le classeur "source" de tes données est ouvert,
        2- s'il est fermé, qu'elle l'ouvre.

        Solution 2
        La mieux adaptée à ton cas...
        Placer ta macro dans le classeur Perso.xls.
        Pour se faire, suit ce tuto : http://www.info-3000.com/vbvba/oumacrostockee.php chapitre : Dans le classeur de macros personnelles PERSO.XLS (Classeur masqué par défaut)
        0
      2. merci Franck.

        J'ai de nouveau une colle.

        je souhaiterai rationaliser la liste suivante au niveau des dates, je pense qu'il faudrait faire plusieurs boucle afin de valider le sku1, puis le sku 2 , puis le types de remises, puis le taux pour enfin élimner les dates qui se suivent afin d'avoir qu'une seule ligne par exemple pour la premieres ligne 111111 123 A 0,034 30/12/2013 19/01/2014

        l'exemple ci dessous
        SKU 1 SKU 2 Remises TAUX Périodes
        111111 123 A 0,034 30/12/2013 31/12/2013
        111111 123 A 0,034 01/01/2014 05/01/2014
        111111 123 A 0,034 06/01/2014 12/01/2014
        111111 123 A 0,034 13/01/2014 19/01/2014
        111111 123 A 0,000 01/02/2014 02/02/2014
        111111 123 B 2,000 30/12/2013 31/12/2013
        111111 123 B 2,000 01/01/2014 05/01/2014
        111111 123 B 2,000 06/01/2014 12/01/2014
        111111 123 B 2,000 13/01/2014 19/01/2014
        111111 123 B 2,000 20/01/2014 26/01/2014
        111111 123 B 2,000 01/02/2014 02/02/2014
        111111 123 D 0,000 30/12/2013 31/12/2013
        111111 123 D 0,000 01/01/2014 05/01/2014
        111111 123 D 0,000 06/01/2014 12/01/2014
        111111 123 D 0,000 13/01/2014 19/01/2014
        111111 123 D 0,000 20/01/2014 26/01/2014
        111111 123 D 0,000 01/02/2014 02/02/2014
        222222 321 A 0,101 06/01/2014 12/01/2014
        222222 321 A 0,101 20/01/2014 26/01/2014
        222222 321 A 0,101 27/01/2014 31/01/2014
        222222 321 B 2,000 06/01/2014 12/01/2014
        222222 321 B 2,000 20/01/2014 26/01/2014
        222222 321 B 2,000 27/01/2014 31/01/2014
        222222 321 C 8,320 06/01/2014 12/01/2014
        222222 321 C 8,320 20/01/2014 26/01/2014
        222222 321 C 8,320 27/01/2014 31/01/2014
        333333 444 A 0,297 20/01/2014 26/01/2014

        merci d'avance
        0
      3. Modérateur
        Bonjour,

        Soyons clairs...
        Tu veux sur une seule ligne la date de début et la date de fin si les colonnes SKU1 SKU2 Remises et Taux sont identiques?
        Si oui, de qu'elles colonnes parle t'on ? A B C et D? dates en E et F?
        tu veux ta "récap" dans la même feuille? une autre?
        0
      4. @pijakuOui tout a fait
        0
      5. @tilo75A ski 1 B sku 2 C remises D taux E date début F date fin

        Le remplacement Sur la même page et ou une autre si pas trop compliqué à faire.

        Merci bcp
        0
    2. Modérateur
      essaye ce code :

      Sub Regroupe()
      Dim Dico As Object, Donnees(), Temp(), T_Out()
      Dim i As Long, ind As Long
      Dim DepartTemp As Date, FinTemp As Date
      
      Set Dico = CreateObject("Scripting.Dictionary")
      ind = 0
      Donnees = Range("A2:F" & Range("A" & Rows.Count).End(xlUp).Row)
      
      For i = LBound(Donnees) To UBound(Donnees)
          If Not Dico.exists(Donnees(i, 1) & "¤" & Donnees(i, 2) & "¤" & Donnees(i, 3) & "¤" & Donnees(i, 4)) Then
              Dico(Donnees(i, 1) & "¤" & Donnees(i, 2) & "¤" & Donnees(i, 3) & "¤" & Donnees(i, 4)) = ""
              ind = ind + 1
              ReDim Preserve T_Out(1 To 6, 1 To ind)
              T_Out(5, ind) = Donnees(i, 5)
              T_Out(6, ind) = Donnees(i, 6)
          Else
              If Donnees(i, 1) & Donnees(i, 2) & Donnees(i, 3) & Donnees(i, 4) = Donnees(i - 1, 1) & Donnees(i - 1, 2) & Donnees(i - 1, 3) & Donnees(i - 1, 4) Then
                  DepartTemp = Donnees(i - 1, 5)
                  FinTemp = Donnees(i - 1, 6)
                  If Donnees(i, 5) < DepartTemp Then T_Out(5, ind) = Donnees(i, 5)
                  If Donnees(i, 6) > FinTemp Then T_Out(6, ind) = Donnees(i, 6)
              End If
          End If
      Next i
      
      Temp = Dico.Keys
      
      For i = LBound(Temp) To UBound(Temp)
          T_Out(1, i + 1) = Split(Temp(i), "¤")(0)
          T_Out(2, i + 1) = Split(Temp(i), "¤")(1)
          T_Out(3, i + 1) = Split(Temp(i), "¤")(2)
          T_Out(4, i + 1) = Split(Temp(i), "¤")(3)
      Next i
      
      With Sheets("MID MODIF")
          .Range("A2").Resize(UBound(T_Out, 2), UBound(T_Out, 1)) = Application.Transpose(T_Out)
      End With
      End Sub 
       
      0
      1. Salut Franck ,

        Désolé de se retour tardif, merci de ton aide en tout cas. Les macros sont super évoluées, je connaissait pas.
        Malheureusement le code ne fonctionne pas.
        Il semblerait que ça consolide quelques valeurs au début, mais les lignes qui deviennent du coup inutiles ne disparaissent pas.
        Egalement j'ai l'impression qu'il ne prend pas en compte les petits intervalles (Soit supérieur à un jour entre deux dates).
        Comment faire pour t'envoyer le fichier. Peut être que ça pourrait facilité ce que j'essai de te dire.
        Merci d'avance,
        Laurent
        0
      2. en cherchant sur les forum j'ai trouve cijoint.com pour déposer le fichier.
        le lien est le suivant : https://www.cjoint.com/?3LnkNcLVbvI
        le document s'appel rangement modif MD
        0
      3. Modérateur
        Salut,

        Tes données ne sont pas triées.....

        3538280054743	613823	A	1,000	01/01/2014
        3538280052756 613812 B 1,000 01/01/2014
        3538280052756 613812 B 1,000 06/01/2014
        3538280052756 613812 B 1,000 13/01/2014
        3538280052756 613812 B 1,000 20/01/2014
        3538280052756 613812 B 1,000 27/01/2014
        3538280052756 613812 B 1,000 03/02/2014
        3538280052756 613812 B 1,000 10/02/2014
        3538280054743 613823 B 1,000 01/01/2014
        3538280054743 613823 B 1,000 06/01/2014
        3538280054743 613823 B 1,000 13/01/2014
        3538280054743 613823 B 2,000 20/01/2014
        3538280054743 613823 B 2,000 27/01/2014
        3538280054743 613823 B 2,000 03/02/2014
        3538280054743 613823 B 2,000 10/02/2014
        3538280054743 613823 A 1,000 06/01/2014
        3538280054743 613823 A 1,000 13/01/2014
        3538280054743 613823 A 1,000 20/01/2014
        3538280054743 613823 A 1,000 27/01/2014

        0
      4. Trop fort le gars... l'oeil de lynx. désolé,
        J'ai refait le tri. et effectivement ça marche mieux. Cependant, entre deux lignes dans certains cas, y a un trou de deux jours. la macro fait pas la différence, elle va jusqu'à la fin. J'ai mis en couleur dans le fichier cette fois si.
        Egalement comment faire pour faire disparaître les lignes qui deviennent inutiles?
        nouveau lien : https://www.cjoint.com/?3LnmiyrJHsd nom: Rangement MD Modif V1
        Merci
        0
      5. Modérateur
        Cependant, entre deux lignes dans certains cas, y a un trou de deux jours. la macro fait pas la différence, elle va jusqu'à la fin.
        Euh ça n'était pas précisé....
        Attention aux demandes qui évoluent, certains moments il n'est plus possible de faire en sorte que le code soit adaptable.
        Bon ici, ça à l'air de rouler.
        Dis moi...

        Sub Regroupe()
        Dim Dico As Object, Donnees(), Temp(), T_Out()
        Dim i As Long, ind As Long
        Dim DepartTemp As Date, FinTemp As Date
        
        Set Dico = CreateObject("Scripting.Dictionary")
        ind = 0
        Donnees = Range("A2:F" & Range("A" & Rows.Count).End(xlUp).Row)
        
        For i = LBound(Donnees) To UBound(Donnees)
            If Not Dico.exists(Donnees(i, 1) & "¤" & Donnees(i, 2) & "¤" & Donnees(i, 3) & "¤" & Donnees(i, 4)) Then
                Dico(Donnees(i, 1) & "¤" & Donnees(i, 2) & "¤" & Donnees(i, 3) & "¤" & Donnees(i, 4)) = ""
                ind = ind + 1
                ReDim Preserve T_Out(1 To 6, 1 To ind)
                T_Out(5, ind) = Donnees(i, 5)
                T_Out(6, ind) = Donnees(i, 6)
            Else
                If Donnees(i, 1) & Donnees(i, 2) & Donnees(i, 3) & Donnees(i, 4) = Donnees(i - 1, 1) & Donnees(i - 1, 2) & Donnees(i - 1, 3) & Donnees(i - 1, 4) Then
                    DepartTemp = Donnees(i - 1, 5)
                    FinTemp = Donnees(i - 1, 6)
                    If Donnees(i, 5) > FinTemp + 1 Then
                        ind = ind + 1
                        ReDim Preserve T_Out(1 To 6, 1 To ind)
                        T_Out(1, ind) = "BIP"
                        T_Out(5, ind) = Donnees(i, 5)
                        T_Out(6, ind) = Donnees(i, 6)
                    Else
                        If Donnees(i, 5) < DepartTemp Then T_Out(5, ind) = Donnees(i, 5)
                        If Donnees(i, 6) > FinTemp Then T_Out(6, ind) = Donnees(i, 6)
                    End If
                End If
            End If
        Next i
        
        Temp = Dico.Keys
        ind = 1
        
        For i = LBound(Temp) To UBound(Temp)
            Do While T_Out(1, ind) = "BIP"
                T_Out(1, ind) = Split(Temp(i - 1), "¤")(0)
                T_Out(2, ind) = Split(Temp(i - 1), "¤")(1)
                T_Out(3, ind) = Split(Temp(i - 1), "¤")(2)
                T_Out(4, ind) = Split(Temp(i - 1), "¤")(3)
                ind = ind + 1
            Loop
            T_Out(1, ind) = Split(Temp(i), "¤")(0)
            T_Out(2, ind) = Split(Temp(i), "¤")(1)
            T_Out(3, ind) = Split(Temp(i), "¤")(2)
            T_Out(4, ind) = Split(Temp(i), "¤")(3)
            ind = ind + 1
        Next i
        
        With Sheets("MODIF MD")
            If .Range("A" & Rows.Count).End(xlUp).Row > 1 Then .Range("A2:H" & Range("A" & Rows.Count).End(xlUp).Row).Delete
            .Columns("A:A").NumberFormat = "@"
            .Range("A2").Resize(UBound(T_Out, 2), UBound(T_Out, 1)) = Application.Transpose(T_Out)
        End With
        End Sub
        0
    3. Modérateur
      Avant de continuer et faire le regroupement par périodes, peux tu me dire si le résultat de cette macro (cf feuille Intermediaire) est bon? ou pas...
      https://www.cjoint.com/c/CLsk4MLrzqG
      0
      1. y a probleme au niveau du tri, y une reference qui apparait a la fin hors elle devrait etre avec l'avant dernier groupe de ref
        y a une erreur déja identifiée dans la macro au niveau de 'balayage des colonnes de l'onglet conso
        TbIntermediaire(4, l) = TbOngletConso(6, k) 'valeurs modifiées, au lieu du 6 c'est i
        au niveau des dates il y a inversion en entre le jour et le mois pour toutes les valeurs qui ont comme mois janvier
        0
      2. OUI C CLAIR :)) merci ça à l'air bon
        0
      3. Modérateur
        plus qu'à regrouper par périodes.....
        0