Ecriture de fichiers texte avec VBA

Bonjour à tous

Je suis en train de développer un outil sur Excel. L'idée : écrire des fichiers textes (1 par ligne de ma feuille Excel) selon les données de cette feuille

Au niveau du code, j'ai compris et mis en place une macro qui fait cela

En revanche, mon texte est assez grand (c'est un programme de machine outil), tel que : "N10" & vbNewLine & FeuilleDonnées.range("L6") etc... très long
Ma question est la suivante : comment rendre la saisie de texte plus simple ? Je n'ai pas d'idée et suis un peu perdu là dessus

9programme-cn.xlsm (35.42 Ko)

Nom de ma macro : CréerEtEnregistrerDansDossier

(ma macro est réglée de sorte que les fichiers créés le soient dans un répertoire précis, donc elle ne marchera pas chez vous à moins de modifier le chemin d'accès)

N'hésitez pas à poser des questions si la mienne n'est pas claire

Merci d'avance ;)

Petite précision : ordi du boulot donc Excel 2016

bonjour,

tu peux utiliser le caractère de continuation _ pour rendre ton code plus visible (une instruction sur plusieurs ligne)

tu peux mettre vbnewline dans une variable, par exemple vnl et utiliser vnl dans l'écriture de ton texte.

        Texte = "%1000" & vnl & "$ INITIALISATION" & vnl & _
        "N10 G17" & vnl & "N20 G40" & vnl & "N30 G80" & _
        vnl & "N40 G0 M9 G92 S4000 G52 X-100 Y-100 Z300" & _
        vnl & vnl & "$POINTAGE 1" & vnl & "N100 T1 D1" & _
        vnl & "N110 M6" & vnl & "N111 M8" & vnl & _
        "N120 G97 S" & FeuilleDonnées.Range("L6").Value & _
        " M3 " & vnl & "N130 G0 Z2" & vnl & "N140 X" & x1 & _
        " Y" & y1 & vnl & "N150 Z 0.2" & vnl & "N160 G1 Z" & z1 & _
        " F" & FeuilleDonnées.Cells(9, 13).Value & vnl

merci, cela m'aidera surement à y voir plus clair plutôt que sur une ligne continue comme actuellement

Bonjour à tous,

Mais tes textes sont vraiment constants ?
On ne saisit pas en vba des textes qui varient souvent.

Même s'ils le sont, tu aurais intérêt à les saisir dans une cellule qui est facilement éditable et lisible, et que le code y récupère le texte.
Ca serait beaucoup plus simple pour toi.
eric

Ah mais alors ça, ça serait incroyable, mais j'ai aucune idée de comment faire

Si t'as une piste jsuis preneur 😉

Bonjour,

j'ai vu ensuite que tu avais des variables dans le texte.
J'ai dû inventer des mots clé, à toi de les changer s'ils sont susceptibles d'apparaitre dans un texte.

Ref: pour indiquer une référence de cellule. Syntaxe : nom_feuille.ref_cellule
Remarque : pas de point (.) dans le nom de la feuille !!!

Var: pour indiquer une variable interne au code. Tes variables appartiennent maintenant à un tableau t_var() de 1 à 3.
Syntaxe : Var:x x étant l'indice du tableau t_var() à utiliser
Pas possible de conserver des noms individuels à moins de compléter le code qui convertirait le nom avec l'indice dans le tableau...
Il y a d'autres variables initialisées dans ton code mais non utilisées dans le texte. Augmenter la taille de t_var() selon le besoin.

Je t'ai créé une fonction tradTxt() pour traduire ta saisie avec ref: et var:
Et un sub exemple test() que tu vois l'utilisation.
A toi d'utiliser la fonction tradTxt() dans ton code.
Tu lui passes la cellule de saisie de ton texte (tu peux en avoir plusieurs), elle te retourne le texte à sauvegarder dans ton fichier.

Ctrl+Entrée pour aller à la ligne dans une cellule. Je converti également ce code en vbNewline
Ne me servant pas de ton code, j'ai mis x, y et z en dur avec 11, 22 et 33

Ca devrait être plus confortable...
eric

5programme-cn.xlsm (42.66 Ko)

PS: je viens de voir que j'ai oublié les & que tu souhaites sans doute en concaténation.
Demain ou jeudi
Fait vite fait. Je remplace les " & " par des espaces. Plus la peine de les intégrer dans les chaines précédentes ou suivantes.
Par contre je ne sais pas si tu dois garder les " (?)

Tout d'abord, merci pour tes réponses
Ensuite, dans la structure de mon code principal, il y a une boucle. Pour chaque ligne = 1 programme texte créé
Le problème actuelle étant : comment implémenter ta fonction dans le code principal
J'imagine qu'il faut que je l'inclus dans la boucle principale : à chaque ligne, il reprend la structure du texte principal et viens piocher les valeurs des variables dans les cellules de cette même ligne
En tout cas c'est comme cela que je vois les choses, je ne sais pas ce que tu en penses

Deuxième question : dans ta fonction test, il y a la ligne suivante : txt = tradTxt(Feuil2.[A2]). Quelle est la syntaxe pour prendre plusieurs cellule ?

Je débute en VBA, je n'ai pas encore toutes les subtilités de langage ;)

En tout cas merci à toi, cela m'aide beaucoup

Bonjour,

dans ton code, au lieu d'écrire Texte = "%1000" & vbNewLine & "$ INITIALISATION" & vbNewLine & ...
tu écris Texte = tradTxt(Feuil2.[A2]) , comme dans l'exemple du test

Deuxième question : dans ta fonction test, il y a la ligne suivante : txt = tradTxt(Feuil2.[A2]). Quelle est la syntaxe pour prendre plusieurs cellule ?

la fonction ne traite qu'une seule cellule.
Si ton texte pour 1 fichier est découpé, il faut appeler autant de fois la fonction et concaténer l'ensemble dans Texte = ...
Si c'est que tu as plusieurs fichiers à faire c'est ta boucle qui s'en occupe.
Sinon explique plus en détail...
eric

Merci pour ton travail, j'ai réussi à implémenter la fonction (j'avais fait la même chose hier, ça ne marchait pas. Aujourd'hui ça marche, j'avais dû faire une erreur).

Je fais évoluer mes idées en fonction de ce qui m'est proposé. Je vais voir pour faire tourner la macro de cette manière, peut être que j'essayerai autre chose (découper le programme texte en plusieurs cellules, par thème, puis tout concaténer ensuite)

Si je vais dans cette direction, j'imagine que je dois créer qqch comme

Texte 1 = TradTxt(feuil2.[A2])

Texte 2 = TradTxt(feuil2.[B2])
...

Texte = Texte 1 + Texte 2 + ... Texte N

Merci à toi en tout cas

J'ai essayé quelques manip, notamment de rajouter des variables t_var

cela fonctionne seulement pour trois variables t_var(1), (2), (3)

lorsque je dépasse 3, la fonction TradTxt se bloque à cette ligne de code : txt2(i) = t_var(txt2(i))

J'ai l'impression que je dois modifier la valeur de i. Dans ton code, i va de 0 à Ubound txt2 (permet de prendre la taille de la matrice txt2 si j'ai bien compris)

et c'est là que je bloque

merci à toi en avance ;)

re

Bonjour si je me réfère a ton code de départ j'aurais separer les données variables des donnée fixes

donc j'aurais ecrit ton code comme ca

Sub CréerEtEnregistrerTexteDansDossier()
    Dim FeuilleDonnées As Worksheet
    Dim Texte$, Nom, Âge%, CheminDossier$, CheminFichier$, DernièreLigne&, Ligne&, Largeur&
    Dim G&, x1, y1, z1, Q&

    ' Spécifiez la feuille de calcul contenant les données
    Set FeuilleDonnées = ThisWorkbook.Sheets("Données")

    ' Spécifiez le chemin du dossier dans le même répertoire que le fichier Excel
    CheminDossier = ThisWorkbook.Path    '& "\Programme_BAV\"

    ' Vérifiez si le dossier existe et créez-le s'il n'existe pas
    If Not Dir(CheminDossier, vbDirectory) <> "" Then
        MkDir CheminDossier
    End If

    ' Trouvez la dernière ligne avec des données dans la colonne A
    DernièreLigne = FeuilleDonnées.Cells(FeuilleDonnées.Rows.Count, "A").End(xlUp).Row

    ' Parcourez les lignes de la feuille de calcul
    For Ligne = 2 To DernièreLigne    ' Commencez à la ligne 2 si la première ligne est une en-tête
        ' Récupérez les données de chaque ligne
        If Not IsEmpty(FeuilleDonnées.Cells(Ligne, 1)) Then
            Nom = FeuilleDonnées.Cells(Ligne, 1).Value    ' Par exemple, la cellule de la colonne A
            G = FeuilleDonnées.Cells(Ligne, 2).Value    ' La cellule de la colonne B
            Largeur = FeuilleDonnées.Cells(Ligne, 3).Value    ' La cellule de la colonne B
            x1 = FeuilleDonnées.Cells(Ligne, 7).Value    'la cellule de la colonne D
            y1 = FeuilleDonnées.Cells(Ligne, 9).Value    'cote en Y
            z1 = FeuilleDonnées.Cells(Ligne, 11).Value

            ' Ajoutez d'autres variables de données si nécessaire

            ' Créez le texte en utilisant les données
            'Texte = "Bonjour, je m'appelle " & Nom & " et j'ai " & Âge & " ans."
            Texte = "%1000|$ INITIALISATION|N10 G17|N20 G40|N30 G80|N40 G0 M9 G92 S4000 G52 X-100 Y-100 Z300|"
            Texte = Texte & "||$POINTAGE 1|N100 T1 D1|N110 M6|N111 M8|N120 G97 S"

            Texte = Texte & FeuilleDonnées.Range("L6").Value

            Texte = Texte & " M3 |N130 G0 Z2|N140 X"
            Texte = Texte & x1
            Texte = Texte & " Y" & y1

            Texte = Texte & "|N150 Z 0.2|N160 G1 Z"

            Texte = Texte & z1

            Texte = Texte & " F" & FeuilleDonnées.Cells(9, 13).Value & vbNewLine

            Texte = Replace(Texte, "|", vbNewLine)

            ' Spécifiez le chemin complet du fichier texte dans le dossier en incluant la valeur de la colonne A
            CheminFichier = CheminDossier & "\Programme_" & Nom & ".txt"

            'ecriture du fichier
            Q = FreeFile: Open CheminFichier For Output As #Q: Print #Q, Texte: Close #Q

        End If
    Next Ligne

    ' Affichez un message pour indiquer que les fichiers ont été enregistrés
    MsgBox "Les fichiers texte ont été enregistrés dans le dossier " & CheminDossier, vbInformation, "Fichiers Enregistrés"
End Sub

patricktoulon

Bonjour à tous,

il faut modifier le dimensionnement du tableau des variables.
C'est la 1ère ligne en haut : Dim t_var(1 To 3) . Remplace le 3 par ce que tu veux. Tu peux aller au-delà du besoin immédiat

Si je vais dans cette direction, j'imagine que je dois créer qqch comme

Oui, tout à fait
Ou même directement Texte = TradTxt(feuil2.[A2]) & TradTxt(feuil2.[A3]) & TradTxt(feuil2.[A5])
Je pensais bien que tu évoluerais vers qq chose comme ça, les possibilités s'élargissant donnent de la souplesse.
Créer des blocs utilisables pour plusieurs fichiers et piocher selon le besoin.
eric

Rechercher des sujets similaires à "ecriture fichiers texte vba"