Créer une macro pour scinder un fichier Excel sur plusieurs fichiers

Bonjour Isabelle ... !

C'est pas que je fais la mauvaise tête, mais je n'ai pas compris le pourquoi de cette demande ...

Le principe est que l'on copie les données sur un modèle (c'est le fameux "second fichier" du https://forum.excel-pratique.com/viewtopic.php?f=2&t=140113 ), modèle que l'on enregistre ensuite sous un autre nom, le modèle est ensuite repris pour le critère suivant et ainsi de suite jusqu'à ce que le fichier originel (le "premier fichier") soit complètement éclaté.

Donc pour moi, le fichier originel doit être préservé dans son identité pour qu'on en reconnaisse bien la source, et on lui ajoute ensuite le critère de sélection des données dispatchées.

Sinon, la demande, c'est comme si tes enfants voulaient porter le nom de ... Trudeau par exemple !

je n'ai pas compris le pourquoi de cette demande ...

Bonjour Steelson ,

heu... je n'ai fait aucune demande,

j'ai seulement mentionné à bofala qu'il n'était pas facile de suivre 2 fils

car je viens tout juste de m'apercevoir qu'il y avait 2 fils

Pas de soucis Isabelle, j'ai vu que tu avais pris le sujet, c'est parfait. Je t'explique juste un peu plus le contexte de la demande de bofala ! On peut continuer de l'autre côté...

ok, pas de souci

J'aime bien les choses logiques et standards, et là on s'en écarte un peu.

Bonjour Steelson,

J'espère que tu te portes bien.

J'ai eu un petit souci concernant la macro et j'ai besoin de ton aide si c'est possible.

Quand je l'exécute, elle rajoute des données non existantes sur la colonne B (Jour) sur les 18 fichiers générés. Les dates sur le fichier de base commencent à partir du 13/03/2020, mais sur les fichiers générés (ça commence dès janvier, ce n'est pas du tout logique). Je veux que la macro se contente des données du fichier, pourquoi elle en rajoute et d'où ça sort ?

Voilà les 2 fichiers pour exécuter (fichier qui contient les bonnes données et où exécuter la macro c'est : SUIVI_ETAORG-1)

Merci beaucouuuuup !

Je ne peux pas faire fonctionne, tu n'as pas mis le modèle !

Ne renvoie pas tout le 7z, mais juste le modèle.

NON, je ne travaille pas sur autant de colonnes, déjà dit !

Je veux que la macro se contente des données du fichier, pourquoi elle en rajoute et d'où ça sort ?

Cela fonctionne correctement ...

Le résultat

capture d ecran 549

Ton fichier épuré

quand tu auras intégré ceci tu pourras revenir poser des questions complémentaires https://forum.excel-pratique.com/viewtopic.php?p=859066#p859066

Je veux que la macro se contente des données du fichier, pourquoi elle en rajoute et d'où ça sort ?

Cela fonctionne correctement ...

Le résultatCapture d’écran (549).png

Ton fichier épuré

Je n'ai pas du tout le même résultat. ça me rajoute des dates à partir de janvier...

Tu as bien exécuté la macro sur le fichier envoyé SUIVI_ETAORG-1 ??

Merci,

capture

J'ai exécuté la macro sur SUIVI_ETAORG_20200427_V1.xlsm que je t'ai retourné après suppression des colonnes et lignes INUTILES

L'autre fichier est un xlsx qui ne comporte pas de macro.

Tu es sûr de ne pas faire de mélange de fichiers avec d'anciennes versions. D'où l'absolue nécessité à mon sens de ne pas bricoler les noms des fichiers pour bien savoir de où cela vient. Et de ne travailler qu'avec le fichier comportant la macro.

J'ai testé sur les bonnes versions des fichiers, et ça me rajoute toujours des mois sur la colonne B (Jour)

Je t'envoie les fichiers avec Model pour tester si tu veux (ouvre stp les 2 fichiers sans Model et exécute la macro sur le fichier SUIVI et regarde la colonne B sur un exemple de fichiers générés si tu as des mois (janvier, février,..) :

(y) (y)

ouvre stp les 2 fichiers sans Model et exécute la macro sur le fichier SUIVI

1-

déjà je comprends que tu te sers de la macro sur un fichier (xlsm) pour exécuter sur l'autre (xlsx)

dans ce cas, on pourrait simplifier le fichier xlsm supportant la macro

2-

mais le problème vient du fait que dans ton second fichier, en colonne B, ce ne sont pas des dates, mais du texte

ce n'est pas le cas du fichier qui comporte la macro

pour t'en rendre compte sélectionne les colonnes B et applique le format date longue, et ensuite standard ... tu verras que rien ne bouge ce qui signifie que ce second fichier n'est pas "valable"

comment est-il construit ?

tu ferais mieux de résoudre le problème des colonnes inutiles sur le premier ! mais même sans cela, si tu l'appliques avec la modif que j'avais ajoutée pour ne pas prendre en compte ces colonnes à tire-larigot sur le fichier avec macro xlsm les dates sont alors correctement interprétées

J'ai adapté la macro pour contourner le bricolage de fichier que tu fais !

Option Explicit
Public critere%

Sub dispatcher()
Dim Tbl As Variant, data As Variant, i As Long
Dim dico1 As Object, cle1 As Variant, result1 As Variant
Dim wb As Excel.Workbook
Dim MonRepertoire, Repertoire As FileDialog, racine As String
Dim colonne$

    critere = 1 ' colonne A

    racine = Split(ThisWorkbook.Name, ".")(0)

    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire de stockage des fichiers générés"
    Repertoire.Show
    If Repertoire.SelectedItems.Count = 0 Then Exit Sub
    MonRepertoire = Repertoire.SelectedItems(1)

    Dim c As Range
    Set c = Rows(1).Find("Colonne*")
    If Not c Is Nothing Then
        data = Range(Cells(1, 1), Cells(Range("A1").End(xlDown).Row, Rows(1).Find("Colonne*").Column))
    Else
        data = Cells(1, 1).CurrentRegion
    End If

    Set dico1 = CreateObject("Scripting.Dictionary")
    For i = LBound(data) + 1 To UBound(data) ' hors en-tête
        dico1(data(i, critere)) = ""
        data(i, 2) = CDate(data(i, 2)) * 1
    Next

    Application.ScreenUpdating = False
    For Each cle1 In dico1.Keys
        result1 = filtreArray(data, critere, cle1)
        Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & "Model.xlsx")
        wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(UBound(result1, 1), UBound(result1, 2)) = result1
        wb.Sheets(1).Columns("B:B").NumberFormat = "m/d/yyyy"
        If Not cle1 Like "750*" Then
            wb.SaveAs (MonRepertoire & "\" & racine & "_" & cle1 & ".xlsx")
        Else
            wb.SaveAs (MonRepertoire & "\" & racine & "_" & Cells(2, 7) & ".xlsx")
        End If
        wb.Close
        Set wb = Nothing
    Next
    Application.ScreenUpdating = True

    MsgBox "Terminé, fichiers sauvegardés sous """ & MonRepertoire & "\" & """ !"
End Sub

quand je pense avoir donné la réponse dans l'heure qui a suivi ta demande et que tout le reste c'est pour tenter de controuner les bricolages ! il faut être plus rigoureux ...

J'ai adapté la macro pour contourner le bricolage de fichier que tu fais !

Option Explicit
Public critere%

Sub dispatcher()
Dim Tbl As Variant, data As Variant, i As Long
Dim dico1 As Object, cle1 As Variant, result1 As Variant
Dim wb As Excel.Workbook
Dim MonRepertoire, Repertoire As FileDialog, racine As String
Dim colonne$

    critere = 1 ' colonne A

    racine = Split(ThisWorkbook.Name, ".")(0)

    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire de stockage des fichiers générés"
    Repertoire.Show
    If Repertoire.SelectedItems.Count = 0 Then Exit Sub
    MonRepertoire = Repertoire.SelectedItems(1)

    Dim c As Range
    Set c = Rows(1).Find("Colonne*")
    If Not c Is Nothing Then
        data = Range(Cells(1, 1), Cells(Range("A1").End(xlDown).Row, Rows(1).Find("Colonne*").Column))
    Else
        data = Cells(1, 1).CurrentRegion
    End If

    Set dico1 = CreateObject("Scripting.Dictionary")
    For i = LBound(data) + 1 To UBound(data) ' hors en-tête
        dico1(data(i, critere)) = ""
        data(i, 2) = CDate(data(i, 2)) * 1
    Next

    Application.ScreenUpdating = False
    For Each cle1 In dico1.Keys
        result1 = filtreArray(data, critere, cle1)
        Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & "Model.xlsx")
        wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(UBound(result1, 1), UBound(result1, 2)) = result1
        wb.Sheets(1).Columns("B:B").NumberFormat = "m/d/yyyy"
        If Not cle1 Like "750*" Then
            wb.SaveAs (MonRepertoire & "\" & racine & "_" & cle1 & ".xlsx")
        Else
            wb.SaveAs (MonRepertoire & "\" & racine & "_" & Cells(2, 7) & ".xlsx")
        End If
        wb.Close
        Set wb = Nothing
    Next
    Application.ScreenUpdating = True

    MsgBox "Terminé, fichiers sauvegardés sous """ & MonRepertoire & "\" & """ !"
End Sub

SUIVI_ETAORG_20200429_V1.xlsm

quand je pense avoir donné la réponse dans l'heure qui a suivi ta demande et que tout le reste c'est pour tenter de controuner les bricolages ! il faut être plus rigoureux ...

Bonjour Steelson,

Merci beaucoup pour cette proposition, la macro ne me rajoute plus des mois, c'est un bon signe. Sauf qu'elle regroupe les dates existantes par mois (mars, avril, mai), moi je veux seulement garder les dates comme elles y sont sur le fichier de base, sans regroupement sans rien.

Peux-tu me renvoyer le fichier de données .xlsx et le modèle ?

Nota : la macro n'a jamais rajouté des mois ! C'est ton format texte qui a fait qu'excel inversait le mois et le jour quand le jour était inférieur à 12 (et qu'il prenait pour un mois). Donc le 01/04/2020 en texte comme tu l'avais mis dans ton fichier était interprété comme le 4 janvier parce que ton fichier avait été mal fait à partir du fichier à colonnes multiples.

Peux-tu me renvoyer le fichier de données .xlsx et le modèle ?

Nota : la macro n'a jamais rajouté des mois ! C'est ton format texte qui a fait qu'excel inversait le mois et le jour quand le jour était inférieur à 12 (et qu'il prenait pour un mois). Donc le 01/04/2020 en texte comme tu l'avais mis dans ton fichier était interprété comme le 4 janvier parce que ton fichier avait été mal fait à partir du fichier à colonnes multiples.

Les voilà. Merci,

Va falloir un jour réduire les fichiers car il ne sera bientôt plus possible de les transférer s'ils font plus de 1Mo.

Un extrait aurait sans doute été suffisant.

Je regarde le problème.

Steelson,

Regarde la colonne B du fichier de la macro "Jour ", c'est là d'où vient le problème je pense. C'est lui qui regroupe les dates.

Merci,

Rechercher des sujets similaires à "creer macro scinder fichier fichiers"