Retour à la ligne dans macro excel

Fermé
rocky123 Messages postés 1 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 29 février 2008 - 29 févr. 2008 à 11:11
 amigo - 5 mars 2008 à 20:14
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
A voir également:

20 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
3 mars 2008 à 10:34
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
29 févr. 2008 à 13:31
bonjour,

Ecrire ça :

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

;o)

polux
0
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 09:42
bonjour,

Avec quoi ouvres tu ton fichier texte ? wordpad ou bloc-notes ?
0
Avec bloc-notes
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 10:13
essaies avec wordpad ... je crois que c'est bloc-notes qui a un problème avec les retours à la ligne ... :os
0
Même problème avec Worpad, est-ce que je l'ai écrit à la bonne place?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
Merci beaucoup mais aucune des 2 solutions ne fonctionnent
0
Autres variantes

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

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

Si ça ne marche toujours pas alors mystère.
0
Est-ce que je peux t'envoyer mon fichier par mail pour que tu l'examine?
0
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
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
Quand je clic sur le lien il me met "fichier inaccessible". Verifie chez toi si ça marche, je re-ssayerai plus tard.
0
Voilà ça devrait fonctionner

http://www.cijoint.fr/cj200803/cij3856327736238.xls
0
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 17:33
j'ai obtenu la même chose sans rien modier ???

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

Sinon pas de problème.
0
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mars 2008 à 19:16
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
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
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
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
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
En fait je n'ai aucune notion de VisualBasic, si tu pouvais m'aider ça serait sympa.
0
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
EXCELLENT milles merci, dernière petite question pourquoi dans mon fichier .txt j'ai des carrés à la place des enter?
0
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
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
C'est dans Etapes par ex. alarme 1079
0
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