Importation et mise en forme fichier texte (log) sur excel

CBristol

XLDnaute Nouveau
Bonjour,

Je fais des tests avec deux appareils différents écrivant leur série de mesures dans deux fichiers textes (.log) différents. J'ai besoin d'afficher les données dans un fichier Excel unique. Pour l'instant j'ouvre chaque fichier texte avec Excel (qui effectue la conversion) puis j'effectue un copier/coller.
Comme j'ai beaucoup d'expériences à faire, je souhaiterais automatiser un minimum les choses avec un fichier Excel contenant deux textbox dans lesquelles je mettrais le nom de chaque fichier. Avec un peu de VBA, la conversion et le copier/coller s'effectueraient tout seul.
Pour l'instant, en ne prenant qu'un fichier, j'ai trouvé ce code qui n'est pas mal mais la mise en page ne me convient pas du tout et j'avoue ne pas bien comprendre ce code.
J'ai mis mes différents fichiers en pièces jointes, les liens suivant correspondent à mes fichiers en .log qui ne pouvaient être joints à la discussion.
scale2.log
scale1.log
Quelqu'un aurait-il une solution?
Merci pour votre aide.
 

Pièces jointes

  • Importation fichier text actuel.xls
    50 KB · Affichages: 160
  • Ce que je voudrais obtenir.xlsx
    14.7 KB · Affichages: 142

MichD

XLDnaute Impliqué
Re : Importation et mise en forme fichier texte (log) sur excel

Bonjour,

Essaie ceci :


VB:
Sub ImporterFichiersTextes()

Dim A As Integer, Elt As Variant
Dim T As Variant, Arr As Variant
Dim Chemin As String, Sep As String
Dim WholeLine As String, FName As String
Dim NFeuille As String, B As Integer
Application.ScreenUpdating = False

'Chemin où sont les 2 fichiers
Chemin = "C:\Users\DM\Documents\"

'Nom des fichiers à importer
Arr = Array("scale1.log", "scale2.log")

'Séparateur du fichier texte
Sep = Chr(3)

'Nom de la feuille de calcul où
'tu veux importer les données
NFeuille = "Feuil1"

B = 0
For Each Elt In Arr
    With Worksheets(NFeuille)
        A = 1
        FName = Chemin & Elt
        Open FName For Input Access Read As #1
        While Not EOF(1)
            Line Input #1, WholeLine
            T = Split(WholeLine, Sep)
            .Range("A" & A).Offset(, B).Resize(, UBound(T) + 1) = T
            A = A + 1
        Wend
        aa = .Cells(1, B + 1).Address
        .Cells(1, B + 1).EntireColumn.Replace ">", ""
        Close #1
    End With
    B = B + 2
    Next
    Worksheets(NFeuille).Rows("1:3").Delete
    DoEvents
    Worksheets(NFeuille).Range("A:D").EntireColumn.AutoFit
End Sub
 

CBristol

XLDnaute Nouveau
Re : Importation et mise en forme fichier texte (log) sur excel

Bonjour,

ça marche presque!
Juste deux trois petits soucis...
Il y a un décalage entre les colonnes 1/2 et 3/4: les poids affichés correspondent au temps de la ligne du dessous. Et il y a un poids en cellule C1 au lieu d'un temps...peut être que le décalage vient d'ici!??
Aussi, je ne comprends pas l'affichage du temps, par exemple, pour le premier temps, la valeur dans la barre de formule est 10.38.03, celle dans la cellule 38.03,0 et si j'utilise une MsgBox, j'obtiens 0,4430902314814! Je voudrais avoir l'heure exacte dans ma MsgBox c'est à dire: 10:38:02,996.
Peux tu faire quelque chose?
En tout cas, merci pour ton aide.
 

MichD

XLDnaute Impliqué
Re : Importation et mise en forme fichier texte (log) sur excel

Essaie ceci :

A ) correction pour l'affichage des données "Temps"
B ) Je n'ai pas saisi l'autre question sur le décalage!


VB:
Sub ImporterFichiersTextes()
 
Dim A As Integer, Elt As Variant
 Dim T As Variant, Arr As Variant
 Dim Chemin As String, Sep As String
 Dim WholeLine As String, FName As String
 Dim NFeuille As String, B As Integer, DerLig As Long
 Application.ScreenUpdating = False

'Chemin où sont les 2 fichiers
 Chemin = "C:\Users\DM\Documents\"
 
'Nom des fichiers à importer
 Arr = Array("scale1.log", "scale2.log")
 
'Séparateur du fichier texte
 Sep = Chr(3)
 
'Nom de la feuille de calcul où
 'tu veux importer les données
 NFeuille = "Feuil1"
 
B = 0
 For Each Elt In Arr
     With Worksheets(NFeuille)
         A = 1
         FName = Chemin & Elt
         Open FName For Input Access Read As #1
         While Not EOF(1)
             Line Input #1, WholeLine
             T = Split(WholeLine, Sep)
             .Range("A" & A).Offset(, B).Resize(, UBound(T) + 1) = T
             A = A + 1
         Wend
         DerLig = .Cells(65536, B + 1).End(xlUp).Row
         With .Range(.Cells(1, B + 1), .Cells(DerLig, B + 1))
            .NumberFormat = "H:MM:SS.000"
            .Replace " ", ""
            .Replace ">", ""
          End With
        With .Range(.Cells(1, B + 2), .Cells(DerLig, B + 2))
            .NumberFormat = "# ##0.0""kg"""
            .Replace " ", ""
            .Replace Chr(10), ""
            .Replace "kg", ""
            .Replace ",", "."
          End With
         Close #1
     End With
     B = B + 2
     Next
     With Worksheets(NFeuille)
        .Rows("1:3").Delete
        .Range("A:D").EntireColumn.AutoFit
        .Rows.EntireRow.AutoFit
        .Range("A:D").EntireColumn.ColumnWidth = 15
        .Range("A1,C1") = "Temps"
        .Range("B1,D1") = "Poids"
        .Range("A1:D1").Font.Size = 16
        .Range("A1:D1").Font.Bold = True
        .Range("A1:D1").HorizontalAlignment = xlCenter
    End With
 End Sub
 
Dernière édition:

CBristol

XLDnaute Nouveau
Re : Importation et mise en forme fichier texte (log) sur excel

Le problème de décalage est tout simple. C'est juste que les colonnes des masses sont décalés d'une ligne par rapport à celles des temps. Enfin, au pire ça je peux le régler tout seul en réécrivant le tableau avec une ligne de décalage.
Pour l'affichage des données temps, c'est parfait mais la valeur renvoyée dans la MsgBox n'est pas la bonne. J'ai toujours 0,443090... au lieu de 10:38:02:996, c'est problématique puisque je me sers normalement de la valeur du temps pour effectuer ma conversion en seconde avec les commandes Mid(Sheets("Feuil1").Cells(2, 1), 1, 2) * 3600 + Mid(Sheets("Feuil1").Cells(2, 1), 4, 2) * 60 + Mid(Sheets("Feuil1").Cells(2, 1), 7, 2) + Mid(Sheets("Feuil1").Cells(2, 1), 10, 3) / 1000
Sais tu à quoi correspond la valeur renvoyée actuellement (0,44309...) ? Est ce possible de renvoyer la valeur affichée dans la cellule à la place?
 

MichD

XLDnaute Impliqué
Re : Importation et mise en forme fichier texte (log) sur excel

Ceci devrait correspondre à ce que tu désires pour les 2 fichiers que tu as publié.

Attention : Ces 2 fichiers ne sont pas identiques dans la forme, ce qui explique
ce que tu as observé. Pour le traitement des fichiers à venir, si tes fichiers sont
légèrement différents dans la forme, il ne faut pas accuser la macro et je n'ai pas
l'intention d'apporter autant de variantes que tu as de fichiers à traiter!


VB:
Sub ImporterFichiersTextes()
  
 Dim A As Integer, Elt As Variant
  Dim T As Variant, Arr As Variant
  Dim Chemin As String, Sep As String
  Dim WholeLine As String, FName As String
  Dim NFeuille As String, B As Integer, DerLig As Long
  Application.ScreenUpdating = False
 
'Chemin où sont les 2 fichiers
 Chemin = "C:\Users\DM\Documents\"
  
 'Nom des fichiers à importer
 Arr = Array("scale1.log", "scale2.log")
  
 'Séparateur du fichier texte
 Sep = Chr(3)
  
 'Nom de la feuille de calcul où
 'tu veux importer les données
 NFeuille = "Feuil1"
  
 B = 0
  For Each Elt In Arr
      With Worksheets(NFeuille)
          A = 1
          FName = Chemin & Elt
          Open FName For Input Access Read As #1
          While Not EOF(1)
              Line Input #1, WholeLine
              T = Split(WholeLine, Sep)
              .Range("A" & A).Offset(, B).Resize(, UBound(T) + 1) = T
              A = A + 1
          Wend
          Stop
          DerLig = .Cells(65536, B + 1).End(xlUp).Row
          With .Range(.Cells(1, B + 1), .Cells(DerLig, B + 1))
             .NumberFormat = "H:MM:SS.000"
             .Replace " ", ""
             .Replace ">", ""
             .Item(4, 1).Delete (xlUp)
           End With
         With .Range(.Cells(1, B + 2), .Cells(DerLig, B + 2))
             .NumberFormat = "# ##0.0""kg"""
             .Replace " ", ""
             .Replace Chr(10), ""
             .Replace "kg", ""
             .Replace ",", "."
             If B + 2 = 4 Then .Item(4, 1).Value = 0
           End With
          Close #1
      End With
      B = B + 2
      Next
      With Worksheets(NFeuille)
         .Rows("1:3").Delete
         .Range("A1").EntireRow.Insert
         .Range("A:D").EntireColumn.AutoFit
         .Rows.EntireRow.AutoFit
         .Range("A:D").EntireColumn.ColumnWidth = 15
         .Range("A1,C1") = "Temps"
         .Range("B1,D1") = "Poids"
         .Range("A1:D1").Font.Size = 16
         .Range("A1:D1").Font.Bold = True
         .Range("A1:D1").HorizontalAlignment = xlCenter
     End With
  End Sub
 

CBristol

XLDnaute Nouveau
Re : Importation et mise en forme fichier texte (log) sur excel

En effet, le problème de décalage est réglé! Par contre c'est bizarre, le code s'arrête deux fois entre les lignes Wend et Stop. Je dois à chaque fois ré-exécuter manuellement pour que le code se finisse.
Quelle est la différence d'écriture entre les deux fichiers?
J'ai toujours le problème de la valeur renvoyée. J'ai regardé et ça doit venir du fait que tu utilises un format heure pour toutes les colonnes impaires. En effet quand je rentre une valeur manuellement dans ces colonnes, elles s'affiche normalement. Après si je change les paramètres de ma cellule pour la mettre en format "Standard", j'ai la valeur "4,09..." qui s'affiche dans ma cellule.
Comprends tu pourquoi ça fait cela?
En tout cas merci beaucoup pour ton aide!
 

MichD

XLDnaute Impliqué
Re : Importation et mise en forme fichier texte (log) sur excel

supprime la ligne "Stop" c'était seulement pour voir ce que la procédure affichait en cours d'exécution.

Une heure quelconque que tu affiches au format : H:MM:SS,000
représente une valeur numérique pour Excel. Comme une journée pour Excel
a la valeur d'UNE UNITÉ (1). Tout ce qu'il y a entre une fraction de seconde et
23:59:59,9999999 représente une fraction de 1.

Si tu entres une donnée quelconque et le format est H:MM:SS,000 , tu dois respecter
le format de la cellule lors de la saisie ou modifier le format de cellule pour "Standard".

La différence entre les 2 fichiers :

L'un débute par le caractère ASCII 3 (une espèce de petit L) tandis que dans l'autre ce premier caractère est absent.
Pour une automatisation réussie, ce caractère devrait être présent ou absent dans tous les fichiers.

Moi, je m'arrête ici. Tu devrais être capable d'assumer la suite...
 
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 677
Messages
2 090 821
Membres
104 677
dernier inscrit
soufiane12