Création de fichiers .csv à partir de fichier .txt

Ereudet Messages postés 24 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

Je viens de m'inscrire sur le forum donc si je ne fais pas les choses dans l'ordre ou si je ne suis pas au bon endroit, dites le moi :)

Je reçois le 02 de chaque mois 45 fichiers .txt contenant chacun des informations (relevés d'index de compteur EDF de la fin du mois N-1). A partir de ces fichiers .txt, je dois créer des fichiers .csv (1 fichier .csv pour chaque fichier .txt, donc 45 fichiers .csv à créer) que je transfère ensuite vers un ftp pour que ces fichiers .csv soient intégrés dans une base de donnée.

J'ai donc besoin de savoir comment je peux faire une macro qui va créer autant de fichier .csv que j'ai de fichier .txt, et comment récupérer les données qui m’intéressent dans les fichiers .txt pour les envoyer vers les .csv. Si en plus la macro peut envoyer les fichiers obtenus vers un ftp, j'aurai tout gagné ! :)

Actuellement, j'ai une macro qui va récupérer les données dont j'ai besoin dans les 45 fichiers .txt et qui les envoie dans une feuille de mon classeur Excel (mais toutes les données récupérées vont vers une unique feuille : chaque fichier .txt alimente une ligne de la feuille Excel). Comme j'ai besoin de fichiers .csv distincts, il faut que je modifie ma macro pour qu'elle crée un fichier .csv pour chaque fichier .txt.

Merci de votre aide !! :)

1 réponse

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonsoir, le plus facile serait peut-être d'adapter le code de ta macro.
    0
    1. Ereudet Messages postés 24 Statut Membre
       
      Oui, c'est ce que je souhaite faire, mais je ne sais pas quelles lignes de code je dois ajouter pour que les données récupérées sur les fichiers .txt soient envoyées vers des fichiers .csv distincts, que la macro doit créer, et non pas vers une feuille du fichier excel. Une idée SVP ?
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ereudet Messages postés 24 Statut Membre
       
      penses-tu que nous avons assez d'informations pour t'aider à modifier ton code?
      0
    3. Ereudet Messages postés 24 Statut Membre
       
      Je pensais que vous alliez me proposer un bloc à insérer dans ma macro, donc indépendante de la macro, mais vu que c'est si gentiment demandé, voici la macro ;), merci d'avance pour ton aide ! :

      Sub DonneesEchéance()
      Dim FichierAOuvrir
      Dim i As Integer
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      Set F1 = Sheets("Liste")
      Set F2 = Sheets("RecupDesDonnees")

      F1.Select
      ChDrive Cells(2, 1)
      Chemin = Cells(2, 2) & "\"
      ReDim FichierAOuvrir([C10000].End(xlUp).Row - 1) As String
      ReDim VDate([C10000].End(xlUp).Row - 1) As String
      ReDim NomFich([C10000].End(xlUp).Row - 1) As String
      ReDim N°Fich([C10000].End(xlUp).Row - 1) As String
      ReDim Dest([C10000].End(xlUp).Row - 1) As String
      ReDim CodeVol([C10000].End(xlUp).Row - 1) As String

      NbFichiers = [C10000].End(xlUp).Row - 1
      For i = 1 To NbFichiers
      If Cells(i + 1, 3) = "" Then GoTo Recup
      FichierAOuvrir(i) = Cells(i + 1, 3)
      Next i

      Recup:
      F2.Select
      For i = 1 To NbFichiers
      Workbooks.OpenText Filename:= _
      Chemin & FichierAOuvrir(i), Origin:= _
      xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
      , ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False _
      , Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _
      (3, 1), Array(4, 1), Array(5, 1)), TrailingMinusNumbers:=True
      VDate(i) = [c1]
      NomFich(i) = [c2]
      N°Fich(i) = [c3]
      Dest(i) = [c4]
      CodeVol(i) = [C11]

      ActiveWorkbook.Close
      Next i

      F2.Activate

      For i = 1 To NbFichiers
      'PremLigne = [A65535].End(xlUp).Row + 1
      Cells(i + 1, 3) = VDate(i)
      Cells(i + 1, 4) = NomFich(i)
      Cells(i + 1, 5) = N°Fich(i)
      Cells(i + 1, 6) = Dest(i)
      Cells(i + 1, 7) = CodeVol(i)

      Next i
      End Sub

      Sub ToutEffacer()
      Application.ScreenUpdating = False
      If [A65535].End(xlUp).Row = 1 Then Exit Sub
      Dim Msg, Titre, Reponse
      Msg = "Etes-vous sûr de vouloir tout effacer?"
      Style = vbYesNo + vbCritical + vbDefaultButton2
      Title = "Effacement des données"
      Reponse = MsgBox(Msg, Style, Titre)
      If Reponse = vbYes Then
      Range(Cells(2, 1), Cells([A65535].End(xlUp).Row, [IV1].End(xlToLeft).Column)).Select
      Selection.ClearContents
      End If
      Range("A2").Select
      End Sub
      0
    4. Ereudet Messages postés 24 Statut Membre
       
      Je ne sais pas s'il fallait faire un copié collé directement de la macro ou si je pouvais joindre un fichier .txt, donc je fais comme je peux. Si ce n'est pas la bonne méthode, vous pouvez me le dire simplement :)
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ereudet Messages postés 24 Statut Membre
       
      moi, j'essaierais ceci, à ajouter juste avant
      ActiveWorkbook.Close
      :
      fichiercsv = Left(FichierAOuvrir(i), Len(FichierAOuvrir(i)) - 4) & ".csv"
      Call ActiveWorkbook.SaveAs(Chemin & fichiercsv, xlCSVMSDOS, , , , False, , xlLocalSessionChanges)

      pour le transfert ftp, une méthode est de créer un fichier de commande ftp, et d'ensuite appeller ftp avec ce fichier de commande. voici un exemple.
      0