Retour à la ligne dans macro excel

rocky123 Messages postés 1 Statut Membre -  
 amigo -
Bonjour,
A l'aide de la macro ci-dessous je converti mon fichier .xls en .txt, le fichier .xls contient 5 colonnes (N°, Etapes, Macro, Fonction et Causes possibles). Dans Fonction et Causes possibles il y a un retour à la ligne auto, mais dans le fichier .txt le retour à la ligne ne se fait que dans Causes possibles.
Est-ce que quelqu'un pourrait me dire pourquoi le retour à la ligne ne se fait pas pour la colonne Fonction dans le fichier .txt. Je n'ai aucune notion de VisualBasic

Ma macro:

Sub Generation()

Dim Chemin As String
Dim NomFichier As String
Dim Num As String
Dim Etape As String
Dim Macro As String
Dim Fonction As String
Dim CausePossible As String
Dim AlarmeFin As String
Dim cpt As Integer

AlarmeFin = "1599"

Range("a4").Select

NomFichier = "C:\Program Files\Schneider Electric\Vijeo-Designer\Vijeo-Frame\Vijeo-Manager\Alarme_G39.txt"

Open NomFichier For Output As #1

Print #1, "::"

Do
If ActiveCell.Text = "" Then
Selection.Offset(1, 0).Range("a1").Select
GoTo fin
End If

Num = ActiveCell.Text
Selection.Offset(0, 1).Range("a1").Select
Etape = ActiveCell.Text
Selection.Offset(0, 1).Range("a1").Select
Macro = ActiveCell.Text
Selection.Offset(0, 1).Range("a1").Select
Fonction = ActiveCell.Text
Selection.Offset(0, 1).Range("a1").Select
CausePossible = ActiveCell.Text
Selection.Offset(1, -4).Range("a1").Select

Dim i As Integer
Dim j As Integer
Dim lgString As Integer
Dim nbLigne As Integer
Dim lgStringInterne As Integer
Dim posString As Integer
Dim Tableau(50) As String

nbLigne = 0
posString = 1

CausePossible = CausePossible + Chr(10)
lgString = Len(CausePossible)

For i = 1 To lgString
If Mid(CausePossible, i, 1) = Chr(10) Then
lgStringInterne = i - posString
Tableau(nbLigne) = Mid(CausePossible, posString, lgStringInterne)
nbLigne = nbLigne + 1
posString = i + 1
End If
Next

Print #1, "::"
Print #1, "ALARME N° " & Num
Print #1, "--------------"
Print #1, "ETAPE: " & Etape & " - " & Macro
Print #1, "FONCTION: " & Fonction
Print #1, ""
Print #1, "CAUSES POSSIBLES:"

If Tableau(0) <> "" Then
For j = 0 To (nbLigne - 1)
Print #1, "- " + Tableau(j)
Next
End If

fin:
cpt = cpt + 1

Loop Until ActiveCell = AlarmeFin Or cpt > 610

Close #1

Range("a4").Select

End Sub
Configuration: Windows XP
Internet Explorer 7.0

20 réponses

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    à mon avis pour que les les retours à la ligne fonctionnent avec un éditeur, utilise :
    "vbCrLf" c'est le code implicite des fichiers textes.
    1
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    bonjour,

    Ecrire ça :

    Print #1, "FONCTION: " & Fonction & VbCr 'ou Chr(10)

    ;o)

    polux
    0
    1. rocky123
       
      Merci de m'avoir répondu c'est très sympa, je ne suis pas sûr de l'avoir écrit au bon endroit: J'ai remplacé la ligne
      Print #1, "FONCTION: " & Fonction par Print #1, "FONCTION: " & Fonction & VbCr et aussi Print #1, "FONCTION: " & Fonction & Chr(10) mais aucun retour à la ligne ne s'est effectué dans mon fichier .txt
      0
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    bonjour,

    Avec quoi ouvres tu ton fichier texte ? wordpad ou bloc-notes ?
    0
    1. rocky123
       
      Avec bloc-notes
      0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    essaies avec wordpad ... je crois que c'est bloc-notes qui a un problème avec les retours à la ligne ... :os
    0
    1. rocky123
       
      Même problème avec Worpad, est-ce que je l'ai écrit à la bonne place?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. amigo
     
    Bonjour,

    Essaie d'ecrire
    Print #1, "FONCTION: " ; Fonction
    Remplaces le signe (&) par le signe (;) et sans rien ajouter en fin de ligne.
    ça devrait aller.

    Salut.
    0
  7. rocky123
     
    Merci beaucoup mais aucune des 2 solutions ne fonctionnent
    0
  8. amigo
     
    Autres variantes

    Print #1, "FONCTION: " ; Fonction ; ""

    sinon
    Print #1, "FONCTION: " ; Fonction ;
    print#1,""

    Si ça ne marche toujours pas alors mystère.
    0
    1. rocky123
       
      Est-ce que je peux t'envoyer mon fichier par mail pour que tu l'examine?
      0
  9. amigo
     
    Si tu n'as pas touvé l'erreur, dépose ton fichier sur ce site et colle le lien dans ton prochain post.

    www.cijoint.fr/

    A+
    0
    1. rocky123
       
      Merci de me consacrer un peu de ton temps amigo, voici le lien où tu trouveras mon fichier .xls

      http://www.cijoint.fr/cjlink.php?file=cj200803/cij10810495986225.xls.
      0
  10. amigo
     
    Quand je clic sur le lien il me met "fichier inaccessible". Verifie chez toi si ça marche, je re-ssayerai plus tard.
    0
    1. rocky123
       
      Voilà ça devrait fonctionner

      http://www.cijoint.fr/cj200803/cij3856327736238.xls
      0
  11. amigo
     
    J'ai le fichier

    j'ai juste modifié la declaration de tes variables.
    voila un extrait de fichier qui est généré, dis moi si ça correspond a ce que tu veux.

    ::
    ::
    ALARME N° 1001
    --------------
    ETAPE: X0.0 - Initialisation
    FONCTION: Attente

    CAUSES POSSIBLES:
    - Défaut sur variateur ATV71 élévateur U401
    - Porte coffret intermédiaire B720(I162) ouvertes
    - Table n'est pas en arrière (B488)
    ::
    ALARME N° 1002
    --------------
    ETAPE: X0.1 - Initialisation
    FONCTION: M/D rail

    CAUSES POSSIBLES:
    - Défaut variateur ou carte d’axe
    - Défaut carte d’axe
    - Défaut détecteur pt0 du rail

    etc...
    A+
    0
  12. Polux31 Messages postés 7219 Statut Membre 1 204
     
    j'ai obtenu la même chose sans rien modier ???

    je ne vois pas où est le problème ?
    0
  13. amigo
     
    J'ai juste regroupé les instructions Dim qui trainaient au millieu du code, c'est plus propre.

    Sinon pas de problème.
    0
    1. rocky123
       
      En fait je transfère le fichier .txt dans un affichage industriel et je n'ai droit qu'à 77 caractères, si on dépasse ce nombre on ne voit la suite de la phrase. Si dans la colonne fonction j'écris une phrase plus longue (retour à la ligne auto dans excel), le retour à la ligne ne se fait pas dans .txt
      0
  14. Polux31 Messages postés 7219 Statut Membre 1 204
     
    ah ok c'est un autre problème ça ... il faut dans ce cas tester la longueur de la chaine et si la longueur est supérieure à 77 alors on ajoute une ligne dans le fichier .txt ...
    0
  15. amigo
     
    Ok j'ai compris, il ne faut pas que la longueur de la ligne excède 77 caractères.

    J'ai ajouté ces variales:
    Dim StrFonction As String
    Dim LngFonction As Integer
    Dim k As Integer
    Const MAXLNG = 77

    Si la longueur maxi est trop longue encore, ajuste la constante MAXLNG, par ex. Const MAXLNG = 70
    Il se peut que la coupure se fasse au milieu d'un mot.

    Voila ta macro en entier, tu as juste à copier coller . Renomme la macro originale Sub Generation_orig() en attendant.
    Remets le nom du fichier original, le l'ai changé pour le test. NomFichier = .....
    A+

    Sub Generation()
    
    Dim Chemin As String
    Dim NomFichier As String
    Dim Num As String
    Dim Etape As String
    Dim Macro As String
    Dim Fonction As String
    Dim CausePossible As String
    Dim AlarmeFin As String
    Dim cpt As Integer
    
    
    Dim i As Integer
    Dim j As Integer
    Dim lgString As Integer
    Dim nbLigne As Integer
    Dim lgStringInterne As Integer
    Dim posString As Integer
    Dim Tableau(50) As String
    
    Dim StrFonction As String
    Dim LngFonction As Integer
    Dim k As Integer
    Const MAXLNG = 77
    
    AlarmeFin = "1599"
    
    Range("a4").Select
        
    
        NomFichier = "d:\perso\temp\essai.txt"
        
        Open NomFichier For Output As #1
        
        Print #1, "::"
        
    Do
        If ActiveCell.Text = "" Then
            Selection.Offset(1, 0).Range("a1").Select
            GoTo fin
        End If
        
        Num = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        Etape = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        Macro = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        Fonction = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        CausePossible = ActiveCell.Text
        Selection.Offset(1, -4).Range("a1").Select
        
        
        nbLigne = 0
        posString = 1
        
        CausePossible = CausePossible + Chr(10)
        lgString = Len(CausePossible)
    
        For i = 1 To lgString
            If Mid(CausePossible, i, 1) = Chr(10) Then
                lgStringInterne = i - posString
                Tableau(nbLigne) = Mid(CausePossible, posString, lgStringInterne)
                nbLigne = nbLigne + 1
                posString = i + 1
            End If
        Next
    
            Print #1, "::"
            Print #1, "ALARME N° " & Num
            Print #1, "--------------"
            Print #1, "ETAPE:      " & Etape & "  -  " & Macro
            
            LngFonction = Len(Fonction)
            Print #1, "FONCTION:   " & Left(Fonction, MAXLNG)
            If LngFonction > 77 Then
               For k = 78 To LngFonction Step MAXLNG
                 StrFonction = Mid(Fonction, i, MAXLNG)
                 Print #1, StrFonction
               Next k
            End If
            
            Print #1, ""
            Print #1, "CAUSES POSSIBLES:"
            
            If Tableau(0) <> "" Then
                For j = 0 To (nbLigne - 1)
                    Print #1, "- " + Tableau(j)
                Next
            End If
            
    fin:
        cpt = cpt + 1
    
    Loop Until ActiveCell = AlarmeFin Or cpt > 610
    
        Close #1
        
    Range("a4").Select
    
    End Sub
    
    0
  16. amigo
     
    Oups, petite erreur,

    remplaces
    StrFonction = Mid(Fonction, i, MAXLNG)
    par
    StrFonction = Mid(Fonction, k, MAXLNG)

    et
    If LngFonction > 77 Then
    par
    If LngFonction > MAXLNG Then

    et
    For k = 78 To LngFonction Step MAXLNG
    par
    For k = MAXLNG+1 To LngFonction Step MAXLNG

            LngFonction = Len(Fonction)
            Print #1, "FONCTION:   " & Left(Fonction, MAXLNG)
            If LngFonction > MAXLNG Then
               For k = MAXLNG+1 To LngFonction Step MAXLNG
                 StrFonction = Mid(Fonction, k, MAXLNG)
                 Print #1, StrFonction
               Next k
            End If
    
    0
    1. rocky123
       
      Salut Amigo, franchement merci beaucoup pour ton aide heureusement qu'il y a des gens comme toi dans ce monde, ça fonctionne très bien mais comme tu l'as dis les mots sont coupés, parfois on passe à la ligne et la première lettre est séparée, même avec l'ajustement de la variable j'aurai toujours des mots séparés à n'importe quel endroit. Est-il possible de choisir la longueur de ma cellule excel en fonction de mon écran (retour à la ligne auto) et que dans mon fichier .txt il y aie les même retour à la ligne?
      0
  17. amigo
     
    Bonjour,

    Je ne crois pas qu'on puisse fixer une longueur de ligne de texte dans une cellule avec retour à la ligne auto.

    On peut supprimer cette option et forcer les retours à la ligne manuellement evec Alt+Entrer et faire un traitement en recherchant le Chr(10) qui est inséré a chaque retour à la ligne. Je crois que tu as déja utilé cette technique un peu plus haut dans ta macro.

    On peut aussi laisser le retour à la ligne automatique et faire un traitement de la chaine de texte de manière à chercher le caractère Espace juste àpres la coupure, en limitant la longueur maxi à 65 caractères pour pouvoir ajouter une dizaine de caractères sans dépasser la longueur maxi imposé par ton système.

    Si tu as besoin de conseils pour programmer ça , fais moi signe.

    A+
    0
    1. rocky123
       
      En fait je n'ai aucune notion de VisualBasic, si tu pouvais m'aider ça serait sympa.
      0
  18. amigo
     
    Bonjour,

    J'ai modifié le code de manière à ce que la coupure se fasse au niveau d'un espace compris enter le 65ème et le 77ème caractère: (Const MAXLNG = 65 et Const ABSLNG = 77)
    Modifie les noms des fichiers.
    J'ai remarqué aussi qu'entre FONCTION: et CAUSES POSSIBLES: il y avait un saut de ligne
    Si c'est pas necéssaire il faut supprimer cette ligne:
    
            Print #1, ""
            Print #1, "CAUSES POSSIBLES:"
    


    Voici la macro complète modifiée
    Salut.

    Sub Generation()
    
    Dim Chemin As String
    Dim NomFichier As String
    Dim Num As String
    Dim Etape As String
    Dim Macro As String
    Dim Fonction As String
    Dim CausePossible As String
    Dim AlarmeFin As String
    Dim cpt As Integer
    
    
    Dim i As Integer
    Dim j As Integer
    Dim lgString As Integer
    Dim nbLigne As Integer
    Dim lgStringInterne As Integer
    Dim posString As Integer
    Dim Tableau(50) As String
    
    Dim StrFonction As String
    Dim LngFonction As Integer
    Dim k As Integer
    Dim po, pf As Integer
    Const MAXLNG = 65
    Const ABSLNG = 77
    
    
    AlarmeFin = "1599"
    
    Range("a4").Select
        
    
        NomFichier = "d:\perso\temp\essai.txt"
        
        Open NomFichier For Output As #1
        
        Print #1, "::"
        
    Do
        If ActiveCell.Text = "" Then
            Selection.Offset(1, 0).Range("a1").Select
            GoTo fin
        End If
        
        Num = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        Etape = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        Macro = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        Fonction = ActiveCell.Text
        Selection.Offset(0, 1).Range("a1").Select
        CausePossible = ActiveCell.Text
        Selection.Offset(1, -4).Range("a1").Select
        
        
        nbLigne = 0
        posString = 1
        
        CausePossible = CausePossible + Chr(10)
        lgString = Len(CausePossible)
    
        For i = 1 To lgString
            If Mid(CausePossible, i, 1) = Chr(10) Then
                lgStringInterne = i - posString
                Tableau(nbLigne) = Mid(CausePossible, posString, lgStringInterne)
                nbLigne = nbLigne + 1
                posString = i + 1
            End If
        Next
    
            Print #1, "::"
            Print #1, "ALARME N° " & Num
            Print #1, "--------------"
            Print #1, "ETAPE:      " & Etape & "  -  " & Macro
            
    
    Fonction = "FONCTION:   " + Trim(Fonction)
    LngFonction = Len(Fonction)
    For k = 1 To LngFonction
    If Asc(Mid(Fonction, k, 1)) < 32 Then Mid(Fonction, k, 1) = " "
    Next
    If LngFonction <= MAXLNG Then
       Print #1, Fonction
    Else
       po = 1
       While po < LngFonction
         pf = po + MAXLNG
         If pf < LngFonction Then
            cf = Asc(Mid(Fonction, pf, 1))
            If cf > 32 Then pf = InStr(pf, Fonction, " ")
            If ((pf = 0) Or (pf > po + ABSLNG)) Then pf = po + ABSLNG
          End If
          StrFonction = Mid(Fonction, po, pf - po + 1)
          If StrFonction <> "" Then Print #1, StrFonction
          po = pf + 1
       Wend
    End If
            
            Print #1, ""
            Print #1, "CAUSES POSSIBLES:"
            
            If Tableau(0) <> "" Then
                For j = 0 To (nbLigne - 1)
                    Print #1, "- " + Tableau(j)
                Next
            End If
            
    fin:
        cpt = cpt + 1
    
    Loop Until ActiveCell = AlarmeFin Or cpt > 610
    
        Close #1
        
    Range("a4").Select
    
    End Sub
    
    0
    1. rocky123
       
      EXCELLENT milles merci, dernière petite question pourquoi dans mon fichier .txt j'ai des carrés à la place des enter?
      0
  19. amigo
     
    Quel logiciel est ce que tu prends tour ouvrir tes fichiers TXT?
    J'ai essayé avec Word, BlocNote, WordPad et un simple editeur de texte que j'ai téléchagé et je ne vois rien.

    A+
    0
  20. amigo
     
    J'y pense, c'est peut etre la police de caractère qui fait ça. Sur quelle ligne de texte tu vois des carrés?
    ALARME
    ETAPE:
    FONCTION:
    CAUSES POSSIBLES:
    0
    1. rocky123
       
      C'est dans Etapes par ex. alarme 1079
      0
  21. amigo
     
    OK, j'ai vu
    Ce sont des retour à la ligne manuels que tu as entrés avec Alt Enter.

    ALARME 1044 : X3.15 et X3.16 dans la meme cellule -->2 retour ligne -->2 carrés blancs
    ALARME 1152 : X0.14 X0.17 X0.22 X0.24 -> -->3 retour ligne -->3 carrés blancs

    etc...

    Si tu veux, on peut remplacer le petit carré blanc par un point (.), ou tout autre caractère

    Tu remplaces
            Print #1, "--------------"
            Print #1, "ETAPE:      " & Etape & "  -  " & Macro
    


    par
            Print #1, "--------------"
            
        lgString = Len(Etape)
        For i = 1 To lgString
            If Mid(Etape, i, 1) = Chr(10) Then
               Mid(Etape, i, 1) = "." '<---------Mets le caractère que tu veux entre les guillemets
            End If
        Next
         lgString = Len(Macro)
        For i = 1 To lgString
            If Mid(Macro, i, 1) = Chr(10) Then
               Mid(Macro, i, 1) = "." '<---------Mets le caractère que tu veux entre les guillemets
            End If
        Next
           
            Print #1, "ETAPE:      " & Etape & "  -  " & Macro
    


    Salut.
    0