Excel conversion d'un répértoire txt en xls

Fermé
cletess Messages postés 38 Date d'inscription jeudi 10 janvier 2013 Statut Membre Dernière intervention 5 avril 2018 - 5 déc. 2014 à 16:06
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 - 11 déc. 2014 à 11:20
Bonjour à tous,

J'ai toute une série de fichier txt se trouvant dans un même répertoire que je désire transformer en fichier xls portant le même nom que le fichier txt d'origine.

En fouillant un peu dans les méandres d'internet, j'ai trouvé le code ci-dessous qui semble remplir parfaitement cette fonction (en ayant au préalable activé "Microsoft Script Runtime" dans les références VBA). Ce code fonctionne à merveille pour les fichiers txt avec TAB comme séparateur (Chr(9)). Les fichiers txt que je désire transformer sont de type "FixedWidth" avec des espaces comme séparateur. J'ai tenté de simplement changer le séparateur en Chr(32) pour la barre d'espace (voir code ascii) mais toutes les colonnes sont décalées maintenant.

Auriez-vous quelques idées pour contourner le problème ?


Merci beaucoup !



Option Explicit

Public Sub Test()
Dim fd As FileDialog
Dim repertoire As String

Set fd = Application.FileDialog(msoFileDialogFolderPicker) 'création d'une boite de dialogue choix de répertoire
fd.AllowMultiSelect = False 'on ne peut choisir qu'un seul repertoire

If fd.Show = -1 Then 'l'utilisateur à valider sa selection
repertoire = fd.SelectedItems(1) 'le repertoire choisi
TransformerTousLesFichiers repertoire
End If

End Sub

'Boucle sur tous les fichiers d'un répertoire
Private Sub TransformerTousLesFichiers(ByVal repertoire As String)
Dim fso As New FileSystemObject
Dim fichier As File

For Each fichier In fso.GetFolder(repertoire).Files 'pour chaque fichier du repertoire
If Right(fichier.Name, 4) = ".txt" Then 'si c'est un fichier texte
TransformerFichierTexteEnExcel fichier 'il effectue la transformation ci-dessous
End If
Next fichier

End Sub

'Ouvre un fichier texte, sépare chaque ligne par ses "tab" et le met dans un fichier excel qui porte le même nom
Private Sub TransformerFichierTexteEnExcel(ByRef fichier As File)
Dim wb As Workbook
Dim ws As Worksheet
Dim chemin As String
Dim nomFichier As String
Dim numFic As Integer
Dim i, iCol, iRow As Long
Dim ligneFichier As String
Dim ligneFichierSplit() As String
Dim separateur As String

chemin = fichier.ParentFolder.Path 'le chemin du fichier texte
nomFichier = fichier.Name 'le nom du fichier texte
nomFichier = Left(nomFichier, Len(nomFichier) - 4) & ".xls" 'qu'on transforme en fichier excel

Set wb = Application.Workbooks.Add 'on ouvre un nouveau classeur
wb.SaveAs chemin & "\" & nomFichier 'qu'on sauve sous le bon nom

Set ws = wb.Worksheets(1) 'la première feuille

numFic = FreeFile
separateur = Chr(9)
Open fichier.Path For Input As #numFic 'ouverture du fichier texte

iRow = 1

Do While Not EOF(numFic) 'tant que le fichier n'est pas parcouru en entier
iCol = 1

Line Input #numFic, ligneFichier 'on récupère la ligne suivante
ligneFichierSplit = Split(ligneFichier, separateur) 'on sépare la ligne dans un tableau

For i = LBound(ligneFichierSplit) To UBound(ligneFichierSplit) 'on copie le tableau
ws.Cells(iRow, iCol) = ligneFichierSplit(i)
iCol = iCol + 1
Next

iRow = iRow + 1
Loop

Close #numFic 'fermeture du fichier texte

wb.Save 'sauvegarde du fichier excel
wb.Close 'fermeture du fichier excel

End Sub

A voir également:

1 réponse

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
11 déc. 2014 à 11:20
Bonjour,

Le problème avec ta méthode est que chaque caractère espace va faire changer de colonne. Je vois deux solutions :
- soit tu es proche du but et te satisfais de la suppression a posteriori des espaces superflus :
Selection.Delete Shift:=xlToLeft

- soit tu repars de zéro en te basant par exemple sur le code généré automatiquement pour les largeurs fixes :
Workbooks.OpenText Filename:= _
        "C:\Users\User1\Desktop\CCM\a1.txt", Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(10 _
        , 1)), TrailingMinusNumbers:=True


A+
0