Découper fichier XLS en plusieurs fichiers selon critére

Déclare

Dim i as long

Déclare

Dim i as long

Merci Steelson ma correction est faite sur la variable "%" qui est maintenant en "&"

Quand ma colonne n'est pas une date l'enregistrement des fichiers subit quand même un renommage par date si la colonne contient que des chiffres

une idée pour qu'il prennent en compte le format date "yyyy-mm-dd" uniquement quand c'est une date ?

wb.SaveAs (MonRepertoire & "\" & racine & "_" & Format(cle1, "yyyy-mm-dd") & ".csv"), FileFormat:=xlCSV, local:=True

Quand ma colonne n'est pas une date l'enregistrement des fichiers subit quand même un renommage par date si la colonne contient que des chiffres

Excel ne fait pas la différence être nombre et dates puisque une date est enregistré dans excel comme étant un nombre !

Il faudrait que tu mettes un indicateur quelque part ou que tu retiennes 2 versions du fichier.

J'ai de beaucoup simplifié le code depuis ...

https://www.excel-pratique.com/fr/telechargements/utilitaires/dispatcher-compiler-excel-no466

Pour le csv, je regarde.

@Steelson outil vraiment très puissant par contre la compilation de plusieurs fichiers CSV génèrent ce genre de problème

151

Il vaut mieux adapter ceci pour les fichiers csv : https://forum.excel-pratique.com/viewtopic.php?p=872000#p872000

Il faut bien régler le séparateur du fichier csv : est-ce une tabulation, une virgule ou un point virgule ?

A mettre dans la macro.

Si plusieurs fichiers ont des séparateurs différents, il vaut mieux faire des regroupement séparés et ensuite consolider.

Si tu as un exemple avec 2 fichiers, je suis preneur de regarder ...

Merci pour ton retour les fichiers seront exclusivement en point virgule ";"

l'ajustement doit avoir lieu à quel niveau ?

je prépare deux fichiers immédiatement

J'ai répondu un peu vite ... il vaut mieux utiliser un autre programme proposé ci-dessus ... https://forum.excel-pratique.com/viewtopic.php?p=872000#p872000 à adapter car dans cet exemple il y avait un problème de conversion d'heure.

Il vaut mieux adapter ceci pour les fichiers csv : https://forum.excel-pratique.com/viewtopic.php?p=872000#p872000

Il faut bien régler le séparateur du fichier csv : est-ce une tabulation, une virgule ou un point virgule ?

A mettre dans la macro.

Si plusieurs fichiers ont des séparateurs différents, il vaut mieux faire des regroupement séparés et ensuite consolider.

Si tu as un exemple avec 2 fichiers, je suis preneur de regarder ...

voici deux fichiers

edit : mince je viens de voir ton message

31.csv (143.00 Octets)
42.csv (150.00 Octets)

ok, je regarde asap

ok, je regarde asap

Merci j'essaye de mon coté aussi avec il est vrai une préférence pour l'utilisation du même outil pour découper et reconcilier

Bon courage !

Pour découper ? tu veux découper en csv ?

Pour recompiler ...

Sub importCSV()
Dim Chemin, Rep As FileDialog, fichier$, T() As String, D, debut As Integer

Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
Rep.Show
If Rep.SelectedItems.Count = 0 Then Exit Sub
Chemin = Rep.SelectedItems(1) & "\"

raz
Range("A2").Select
debut = 2
fichier = Dir(Chemin & "*.csv")
Do While fichier <> ""
    Open Chemin & fichier For Input As #1
        ligne = 1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            T = Split(ContenuLigne, ";")
            nItems = UBound(T) + 1
            If ligne >= debut Then
                If ligne = debut Then ReDim D(1 To nItems, 1 To 1)
                If ligne > debut Then ReDim Preserve D(1 To nItems, 1 To ligne - debut + 1) ' Preserve ne permet de redimensionner que la dernière dimension d'un tableau avec conservation des données
                For i = 0 To UBound(T)
                    D(i + 1, ligne - debut + 1) = T(i)
                Next i
            End If
            ligne = ligne + 1
        Loop
    Close #1
    D = Application.Transpose(D)
    If ligne - debut = 1 Then
        Selection.Resize(1, UBound(D)) = D
    Else
        Selection.Resize(UBound(D), UBound(D, 2)) = D
    End If
    Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
    fichier = Dir
Loop

End Sub
Sub raz()
    Range("A1").CurrentRegion.Offset(1, 0).Clear
End Sub

encore perfectible, je regarderai demain pour inclure automatiquement l'en-tête !

Pour découper ? tu veux découper en csv ?

Pour recompiler ...

Sub importCSV()
Dim Chemin, Rep As FileDialog, fichier$, T() As String, D, debut As Integer

Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
Rep.Show
If Rep.SelectedItems.Count = 0 Then Exit Sub
Chemin = Rep.SelectedItems(1) & "\"

raz
Range("A2").Select
debut = 2
fichier = Dir(Chemin & "*.csv")
Do While fichier <> ""
    Open Chemin & fichier For Input As #1
        ligne = 1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            T = Split(ContenuLigne, ";")
            nItems = UBound(T) + 1
            If ligne >= debut Then
                If ligne = debut Then ReDim D(1 To nItems, 1 To 1)
                If ligne > debut Then ReDim Preserve D(1 To nItems, 1 To ligne - debut + 1) ' Preserve ne permet de redimensionner que la dernière dimension d'un tableau avec conservation des données
                For i = 0 To UBound(T)
                    D(i + 1, ligne - debut + 1) = T(i)
                Next i
            End If
            ligne = ligne + 1
        Loop
    Close #1
    D = Application.Transpose(D)
    If ligne - debut = 1 Then
        Selection.Resize(1, UBound(D)) = D
    Else
        Selection.Resize(UBound(D), UBound(D, 2)) = D
    End If
    Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
    fichier = Dir
Loop

End Sub
Sub raz()
    Range("A1").CurrentRegion.Offset(1, 0).Clear
End Sub

encore perfectible, je regarderai demain pour inclure automatiquement l'en-tête !

Merci c'est déjà pas mal

Oui découpage si possible en csv

au sujet de la compilation si j'ai 5 fichiers pour un total de 200 000 Lignes cela freeze pas mal il faut peut être que j'essaye avec une bécane beaucoup plus puissante peut être

au sujet de la compilation si j'ai 5 fichiers pour un total de 200 000 Lignes cela freeze pas mal il faut peut être que j'essaye avec une bécane beaucoup plus puissante peut être

Pourtant, 200.000 lignes ! Il te faut quand même une bonne RAM. Combien de temps cela a mis ?

au sujet de la compilation si j'ai 5 fichiers pour un total de 200 000 Lignes cela freeze pas mal il faut peut être que j'essaye avec une bécane beaucoup plus puissante peut être

Pourtant, 200.000 lignes ! Il te faut quand même une bonne RAM. Combien de temps cela a mis ?

Je viens de faire 691 000 lignes sur un serveur de 256 GB de ram sans aucun problème

découpage sous 371 fichiers

ensuite compilation des 371 fichiers pour mon test

Sauf…. des nombres stockés sous forme de date

Pour info j'ai pris un peu les réponses que tu as mis en place pour @joyce au niveau des dates est-ce la cause ?

ca545pture

Pour les dates, excel fait ce qu'il veut ! Quand le jour est inférieur ou égal à 12 il le prend comme le mois (notation US). Sinon il conserve la donnée sous forme de texte en respectant la notation la séquence jour/mois/année.

Ah si tout le monde avait adoptée une suite plus intéressante qui est année-mois-jour !

Il y a 2 façons de faire : soit reconstruire un date avec par exemple

CDbl(DateSerial("20" & Mid(CStr(Tableau(i)), 7, 2), Mid(CStr(Tableau(i)), 4, 2), Mid(CStr(Tableau(i)), 1, 2)))

soit inverser mois et jour

Mid(T(i), 4, 2) & "/" & Mid(T(i), 1, 2) & "/" & Mid(T(i), 7, 10)

. Je ne sais pas s'il y a une autre méthode, je me pose encore la question, cf réponse de Chris ici https://forum.excel-pratique.com/viewtopic.php?p=872136#p872136

Pour les nombres stockés sous forme de texte, il s'agit très souvent du signe des valeurs décimales : point ou virgule. Il faut alors parfois changer l'un en l'autre globalement un fois les valeurs chargées.

Oui découpage si possible en csv

Dans ce cas, la réponse est donnée ici :

https://forum.excel-pratique.com/viewtopic.php?p=870827#p870827

encore perfectible, je regarderai demain pour inclure automatiquement l'en-tête !

Voici sous forme d'une sub ...
Option Explicit
Sub importer()
Dim chemin$, Rep As FileDialog

    ' choix du répertoire
    Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
    Rep.Show
    If Rep.SelectedItems.Count = 0 Then Exit Sub
    chemin = Rep.SelectedItems(1) & "\"

    ' effacement et préparation
    Cells.Clear
    Range("A1").Select

    '         chemin, separateur (; par défaut), debut (1 par défaut), entetes (True par défaut)
    importCSV chemin

End Sub

Sub importCSV(chemin As String, Optional sep As String = ";", Optional debut As Integer = 1, Optional entetes As Boolean = True)
' sep est le séparateur , ou ; ou vbTab
' debut caractérise la première ligne du fichier csv à importer
' entetes indique s'il faut importer les en-têtes se trouvant sur la ligne début

Dim fichier$, T() As String, D, ligne&, i%, ContenuLigne$, nItems%

fichier = Dir(chemin & "*.csv")
Do While fichier <> ""
    Open chemin & fichier For Input As #1
        ligne = 1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            T = Split(ContenuLigne, sep)
            nItems = UBound(T) + 1
            If ligne >= debut Then
                If ligne = debut Then ReDim D(1 To nItems, 1 To 1)
                If ligne > debut Then ReDim Preserve D(1 To nItems, 1 To ligne - debut + 1) ' Preserve ne permet de redimensionner que la dernière dimension d'un tableau avec conservation des données
                For i = 0 To UBound(T)
                    ' si date : effectuer permutation jour et mois
                    D(i + 1, ligne - debut + 1) = T(i)
                Next i
            End If
            ligne = ligne + 1
        Loop
    Close #1
    D = Application.Transpose(D)
    If ligne - debut = 1 Then
        Selection.Resize(1, UBound(D)) = D ' cas d'une seule ligne dans le fichier csv
    Else
        Selection.Resize(UBound(D), UBound(D, 2)) = D
    End If
    Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
    fichier = Dir
    If entetes Then entetes = False: debut = debut + 1  ' on passe l'en-tête pour les fichiers suivants
Loop

End Sub

Pour les dates et les nombres, voir remarques ci-dessus

[/code]

Pour les dates et les nombres, voir remarques ci-dessus

[/quote]

Merci à toi le code est beaucoup plus fluide et le résultat est nickel

Au sujet des nombres il me suffit de convertir une fois le fichier global acquis rien de bien méchant

Pour ma part c'est un "problème" résolu

encore perfectible, je regarderai demain pour inclure automatiquement l'en-tête !

Voici sous forme d'une sub ...
Option Explicit
Sub importer()
Dim chemin$, Rep As FileDialog

    ' choix du répertoire
    Set Rep = Application.FileDialog(msoFileDialogFolderPicker)
    Application.FileDialog(msoFileDialogFolderPicker).Title = "Choix du répertoire des fichiers ..."
    Rep.Show
    If Rep.SelectedItems.Count = 0 Then Exit Sub
    chemin = Rep.SelectedItems(1) & "\"

    ' effacement et préparation
    Cells.Clear
    Range("A1").Select

    '         chemin, separateur (; par défaut), debut (1 par défaut), entetes (True par défaut)
    importCSV chemin

End Sub

Sub importCSV(chemin As String, Optional sep As String = ";", Optional debut As Integer = 1, Optional entetes As Boolean = True)
' sep est le séparateur , ou ; ou vbTab
' debut caractérise la première ligne du fichier csv à importer
' entetes indique s'il faut importer les en-têtes se trouvant sur la ligne début

Dim fichier$, T() As String, D, ligne&, i%, ContenuLigne$, nItems%

fichier = Dir(chemin & "*.csv")
Do While fichier <> ""
    Open chemin & fichier For Input As #1
        ligne = 1
        Do While Not EOF(1)
            Line Input #1, ContenuLigne
            T = Split(ContenuLigne, sep)
            nItems = UBound(T) + 1
            If ligne >= debut Then
                If ligne = debut Then ReDim D(1 To nItems, 1 To 1)
                If ligne > debut Then ReDim Preserve D(1 To nItems, 1 To ligne - debut + 1) ' Preserve ne permet de redimensionner que la dernière dimension d'un tableau avec conservation des données
                For i = 0 To UBound(T)
                    ' si date : effectuer permutation jour et mois
                    D(i + 1, ligne - debut + 1) = T(i)
                Next i
            End If
            ligne = ligne + 1
        Loop
    Close #1
    D = Application.Transpose(D)
    If ligne - debut = 1 Then
        Selection.Resize(1, UBound(D)) = D ' cas d'une seule ligne dans le fichier csv
    Else
        Selection.Resize(UBound(D), UBound(D, 2)) = D
    End If
    Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
    fichier = Dir
    If entetes Then entetes = False: debut = debut + 1  ' on passe l'en-tête pour les fichiers suivants
Loop

End Sub

Pour les dates et les nombres, voir remarques ci-dessus

Bonjour à tous

contente de voir des membres ayant une problématique proche de la mienne

j'ai une question pour Steelson

j'utilise ton outil avec succès il m'aide énormément pour compiler mes fichiers.

une fois que j'ai un fichier global j'effectue des corrections

mais ensuite je souhaite décompiler l'ensemble et si possible avec le même nombre de fichier

Ma question est de savoir si il est possible d'inclure au moment de la compilation le nom des fichiers dans une colonne en dernière colonne si possible cela me permet dans un premier temps de savoir à quel fichier appartient une ligne et ensuite à pouvoir dispatcher plus facilement

Merci pour ton aide

Bonjour, et

Voici ...

Rechercher des sujets similaires à "decouper fichier xls fichiers critere"