Enregistrer le contenu d'une cellule dans un fichier .txt

[Résolu/Fermé]
Signaler
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
-
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
-
Bonjour,

Je cherche par le biais d'un macro :
- à copier ou extraire le contenu d'une cellule (la cellule contient une formule, il faut copier le résultat et non la formule si c'est possible, sinon je passerai par un copier/coller la valeur)
- et "le coller" ou "l'exporter" dans un fichier .txt déjà existant.

J'ai plusieurs cellules dans le même fichier sur lesquelles je dois appliquer cette action C2;C3;C4;C5;C6;G2;G3;G4;G5;...
et chaque cellule à bien un fichier .txt de destination différent.
S'il y a une astuce pour ne pas devoir faire un code par cellule, ça serait génial.

Merci d'avance.
Cordialement.
Ben.





6 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour,

Il te faut créer un tableau avec tes adresses à exporter et un tableau avec les chemins des fichiers correspondants et ensuite tu parcours tes tableaux :
Public Sub test()
Dim tba, tbc, idx
tba = Split("C2;C3;C4;C5;C6;G2;G3;G4;G5",";")
tbc = Split("C:\f2.txt;C:\f3.txt;C:\f4.txt;C:\f5.txt;C:\f6.txt;C:\g2.txt;C:\g3.txt;C:\g4.txt;C:\g5.txt", ";")
For idx = 0 To UBound(tba)
Open tbc(idx) For Append As #1 ' chemin
Print #1, Range(tba(idx)).Value
Close #1
Next idx
End Sub

Toujours zen
La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer. Antoine de Saint-Exupéry
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Bonjour,
je viens seulement de voir ta réponse... :-(
je ne comprend pas ce que tu veux dire en avec:
"Il te faut créer un tableau avec tes adresses à exporter et un tableau avec les chemins des fichiers correspondants et ensuite tu parcours tes tableaux"

J'ai appliqué la macro que tu proposes, il y a 2 petit problème :
- la macro copie la formule et non la valeur
- il faudrait qu'a chaque fois que j'applique la macro, ça remplace le contenu dans le fichier txt, car actuellement ça s'ajoute à la suite...
merci d'avance.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour,

Je vois que tous les problèmes ne sont pas urgents à la minute....

- la macro copie la formule et non la valeur
Si tu peux le prouver, cela sera une belle découverte car jusqu'à maintenant je n'ai jamais vu une formule fonctionner dans un fichier texte : donne moi un exemple.

- il faudrait qu'a chaque fois que j'applique la macro, ça remplace le contenu dans le fichier txt
Comme ton fichier existait je pensais que tu voulais garder l'historique. Tu remplaces cette ligne tout simplement :
    Open tbc(idx) For Output As #1 '  chemin


Toujours zen
La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer. Antoine de Saint-Exupéry
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Super, ça fonctionne.

Pour un peu plus de simplicité, j'aimerai faire la même chose avec plusieurs cellules.
séparé par un retour à la ligne dans le txt

J'ai essayé de remplacer C2;C3;C4;C5;C6 par C2:C6, mais ca ne fonctionne pas.

Une idée, aussi lumineuse que les autres ?

Merci de ton aide.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506 >
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018

Bonjour,

Ton idée ne peux pas fonctionner effectivement mais avec un peu de changement :
Public Sub test()
Dim tba, tbc, idx as integer, elm as range
const rep = "C:\ton chemin complet"
tba = Split("C2:C6;C3;C4;C5;C6;G2;G3;G4;G5",";")
tbc = Split("\f2.txt;\f3.txt;\f4.txt;\f5.txt;\f6.txt;\g2.txt;\g3.txt;\g4.txt;\g5.txt", ";")
For idx = 0 To UBound(tba)
    Open rep & tbc(idx) For Append As #1 '  chemin
    for each elm in Range(tba(idx))
        Print #1, format(elm.Value,"0.000")
    next elm
    Close #1
Next idx
End Sub
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Bonjour,
Merci de ton aide, ca marche impeccable ! un projet bientôt terminé, et une démarche qui va me permettre de solutionner plein de chose en cour

En vu de décliner pour un autre fichier, que faut-il modifier pour envoyer la plage C2:F2 avec dans un txt, cette fois sur sans retour à la ligne entre les cellules mais avec un espace ou un signe comme séparateur (pour y ajouter un code AINSI par exple)


Et tu me vois venir?! si je peux avoir C2:E4 sous la forme :
C2 D2 E2
C3 D3 E3
C4 D4 E4

Ca serait vraiment génial

Cordialement

Merci encore je vais gagner plein de temps maintenant. !
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506 >
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018

Bonjour,

Ce que tu veux me parait être effectif avec ces modifications :
Public Sub test()
Dim tba, tbc, idx As Integer, elm As Range, lig As Long
Const rep = "D:\test"
tba = Split("C2:E4;C6:G12", ";")
tbc = Split("\f2.txt;\f3.txt", ";")
For idx = 0 To UBound(tba)
    lig = 0
    Open rep & tbc(idx) For Append As #1
    Print #1,
    Print #1, Format(Date, "dd/mm/yyyy")   'date
    For Each elm In Range(tba(idx))
        If lig = 0 Then
            lig = elm.Row
        Else
            If lig <> elm.Row Then lig = elm.Row: Print #1,
        End If
        Print #1, Format(elm.Value, "0.000") & " | "; ' | séparation
    Next elm
    Close #1
Next idx
End Sub

Tu peux bien sûr changer de séparateur, enlever la ligne date (mais pas la précédente).
En espérant que c'est ton souhait, @+
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
De retour de vacances, je me replonge dans mon projet.
ca avance super bien et c'est largement plus évolué que ce que je voulais au départ !

Ça m'a l'air vraiment super!!
je vois déjà pleins d'utilisations possible à tout ca ! un grand merci.
je fais les tests, je relève un petit problème : j'ai l'impression qu'il y a une nombre de caractère maximum, car il me manque la fin sur les grandes cellules...

Dans excel
<dps:Titre=<Nextstyle:Titre><cc:COLOR\:CMYK\:Process\:0\,0\,0\,1><ct:Bold><cs:16.000000><csw:1.051010><ccase:All Caps><phz:37.836361><cf:Tasse><pras:1.051010><prbs:1.051010><prunin:Titre\,RI word\,2\,1\;Date\,RI sentence\,1\,0\;><pdcdetail:><pideosp:0><cdvpos:4>>


Dans le fichier txt
<dps:Titre=<Nextstyle:Titre><cc:COLOR\:CMYK\:Process\:0\,0\,0\,1><ct:Bold><cs:16.000000><csw:1.051010><ccase:All Caps><phz:37.836361><cf:Tasse><pras:1.051010><prbs:1.051010><prunin:Titre\,RI word\,2\,1\;Date\,RI sentence\,1\,0\;><pdcdetail:><pideosp:0><cd

Une idée ?




Est-ce que je peux profiter encore un peu de ta gentillesse ?
- Dans les sélections de cellules j'aimerai sélectionner de C2 à la dernière cellule non vide


- J'ai plusieurs "feuil" dans mon classeur a quel endroit j'indique dans ma macro sur quelle feuille aller chercher les infos ? surement qqpart dans cette ligne :
tba = Split("C2:C6;G5", ";")


- Est-il possible (après la cellule seule et la plage de cellule) de combiner plusieurs cellules ou plages
exple : K3&A2 ou alors K3&A2:C2

Cordialement
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Pour la sélection jusqu'à la dernière cellule non vide j'ai tenté ca, mais je ne sais pas comment écrire l'adresse de la cellule "BDerLigne"

Sub test()
Dim DerLigne, tba, tbc, idx As Integer, elm As Range
Const rep = "D:\test"

'DerLigne : Numéro de la dernière ligne remplie
DerLigne = Range("A" & Rows.Count).End(xlUp).Row


tba = Split("B2:BDerLigne", ";")
tbc = Split("\test.txt", ";")



For idx = 0 To UBound(tba)
Open rep & tbc(idx) For Output As #1 ' chemin
For Each elm In Range(tba(idx))
Print #1, Format(elm.Value, "0.000")
Next elm
Close #1
Next idx


'affiche en A1 la valeur de la variable DerCell
Range("A1").Value = DerLigne

End Sub
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Merci gbinforme
J'ai fait la modif, la marque de séparation à bien disparu, mais il y a maintenant une ligne vide qui vient s'ajouter entre les lignes des cellules...

c2

c3

c4
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506 >
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018

Bonsoir Bemanace,

C'est que tu n'as pas modifié cette ligne :
If lig <> elm.Row Then lig = elm.Row: If man <> 1 Then Print #1,
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8 >
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020

Bonjour,
oups, vraiment désolé, effectivement j'ai loupé un morceau... :-/
CA MARCHE !!!!!!!!!!!
t'es vraiment génial !
Merci
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Bonjour,
j'ai réussi à adapter pas mal cette macro, à plusieurs utilisation, mais je rencontre un problème : lorsque je veux faire comme sélection une plage de cellule plus une autre.
Est-ce possible d'y remédier ?

tba = Split("Feuil1!A2:A5,Feuil2!A4:A>;G12", ";")


J'ai une erreur sur
   For Each elm In Range(tba(idx))


Merci pour ton aide.
Cordialement
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour,

lorsque je veux faire comme sélection une plage de cellule plus une autre
Avec la virgule, cela devrait fonctionner mais sans la feuille ce sera au hasard de la dernière sauvegarde ;-)
tba = Split("Feuil1!A2:A5,Feuil2!A4:A>,G12", ";")
Cordialement
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
En fait le ;G12 n'était pas le problème
c'est le changement de feuille pour le meme ficher texte qu'il n'aime pas

Ne fonctionne pas :
tba = Split("Feuil1!A2,Feuil2!B6", ";")


Fonctionne :
tba = Split("Feuil1!A2,B6", ";")
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Voici mon code complet :

Option Explicit
Public Sub test()
Dim tba, tbc, tbm, idx As Integer, elm As Range, lig As Long, idp As Long, man As String
Const rep = "D:\test" 'chemin
Const flg = ">" ' code pour copier jusqu'à la dernière ligne non vide mettre ce caractère en fin de plage


'fonctionne
'tba = Split("CodesExport!A2:A5;Feuil1!AA1", ";")

'ne fonctionne pas
tba = Split("CodesExport!A2:A5,Feuil1!AA1;Feuil1!AA3", ";")


'NOMENCLATURE
'Feuil1!H2 = la cellule H2 de la Feuil1
'    C2:G4 = De C2 à G4
'    B4,C2 = B4 ET C2
'    C2:E> = de C2 à la dernière cellule non vide de la colonne E




tbc = Split("\Titre.txt;\Prog.txt", ";")
For idx = 0 To UBound(tba)
    Open rep & tbc(idx) For Output As #1
    'Print #1,
    'Print #1, Format(Date, "dd/mm/yyyy")   'insere la date
    tbm = Split(tba(idx), ",")
    For idp = 0 To UBound(tbm)
        If InStr(1, tbm(idp), flg) > 0 Then
            If InStr(1, tbm(idp), ":") > 0 Then
                man = Left(tbm(idp), InStr(1, tbm(idp), ":") - 1)
                While Right(man, 1) <= 9
                    man = Left(man, Len(man) - 1)
                Wend
                lig = Range(man & Rows.Count).End(xlUp).Row
                tbm(idp) = Replace(tbm(idp), flg, lig)
            Else
                MsgBox "Paramètre erroné : " & tba(idx)
                Exit Sub
            End If
        End If
    Next idp
    lig = 0
    tba(idx) = Join(tbm, ",")

'l'erreur est sur la ligne suivante :
    For Each elm In Range(tba(idx))
        If lig = 0 Then
            lig = elm.Row
        Else
            If lig <> elm.Row Then lig = elm.Row: If man <> 1 Then Print #1,
        End If
        If Len(elm.Value) < 255 Then
            Print #1, Format(elm.Value, "0.000");
            For idp = 0 To UBound(tbm)
                If Not Intersect(Range(tbm(idp)), elm) Is Nothing Then
                    man = Range(tbm(idp)).Columns.Count
                    If man = 1 Then Print #1, Else Print #1, " | ";                        ' | séparation
                End If
            Next idp

        Else
            idp = 1
            While idp < Len(elm.Value)
                Print #1, Mid(elm.Value, idp, 255);
                idp = idp + 255
            Wend
            Print #1,
        End If
    Next elm
    Close #1
Next idx
End Sub

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour Bemanace,

Ne fonctionne pas :
tba = Split("Feuil1!A2,Feuil2!B6", ";")

Fonctionne :
tba = Split("Feuil1!A2,B6", ";")

J'avais mal interprété ta question : tu ne peux pas sélectionner 2 plages de 2 feuilles différentes. Si tu essayes sur tes feuilles manuellement tu verras le dysfonctionnement.
Pour le faire, tu mets un point virgule :
tba = Split("CodesExport!A2:A5;Feuil1!AA1;Feuil1!AA3", ";")

et tu doubles ton fichier que tu ouvres en append après l'avoir virginisé par cette séquence :
tbc = Split("\Titre.txt;\Titre.txt;\Prog.txt", ";")
For idx = 0 To UBound(tbc)
Open rep & tbc(idx) For Output As #1
Close #1
Next idx
For idx = 0 To UBound(tba)
Open rep & tbc(idx) For Append As #1

qui remplace
tbc = Split("\Titre.txt;\Prog.txt", ";")
For idx = 0 To UBound(tba)
Open rep & tbc(idx) For Output As #1

Bonne journée
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Bonjour gbinforme,
c'est vrai ça, je n'avais pas pensé que ça n'était pas possible à main la sélection sur plusieurs feuil... !

C'est génial, j'apprend plein de chose ! je ne sais pas comment te remercier !?

Ça fonctionne impeccable avec la "virginisation" !

Plus ça va et moins je suis obligé d'intervenir manuellement dans le résultat.
Il reste juste une ligne vide a la fin de chaque fichier, que je dois enlever.
J'ai essayé de repérer un Print #1 qui pourrait en être la cause, mais ca n'a pas l'air d'être ca...

Y a t-il une astuce ?


Bonne fin de journée.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour Bemanace,

une ligne vide a la fin de chaque fichier
ne serais-ce pas une cellule vide ?
Moi je n'ai pas de ligne vide : as-tu regardé avec un vrai éditeur comme Notepad++ ?

Bonne soirée.
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8 >
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020

Bonjour,
ca ne vient pas d'une cellule vide, j'ai fait le test en exportant une seule cellule, et j'ai le même problème.

Quand j'ouvre mon txt (dans bloc note) ou que je l'importe dans indesign,
j'ai un retour à la ligne à la fin de mon texte, qui me créé donc une ligne vide.

test



Etrange...
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour Bemanace,

Voilà ce que cela donne sur Notepad++ :

En informatique, CRLF (ou CR+LF), est une séquence de deux octets qui indique une fin de la ligne (et surtout une nouvelle ligne) dans un texte(source).

Dans le bloc note il n'y a qu'une ligne mais je n'ai pas indesign pour tester. Si tu y tiens vraiment l'on peut rajouter une séquence pour l'enlever mais avec certains logiciels tu auras des soucis car ton fichier texte ne sera pas normalisé.
à toi de dire.
Bonne soirée.
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8
Bonjour gbinforme,

c'est donc ce LF qui créé une nouvelle ligne qui pose problème...

S'il existe la possibilité de le supprimer je veux bien essayer, mais je ne veux pas que ce soit trop prise de tête pour toi, au cas ou ça ne fonctionnerait pas, ça serait dommage d'avoir passé trop de temps...

Bonne journée.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Bonjour Bemanace,

c'est donc ce LF qui créé une nouvelle ligne qui pose problème...
Ce n'est pas exact car ce code correspond parfaitement au standard d'un fichier texte.

Pour enlever le dernier code que ton logiciel ne sait pas traiter je te propose de rajouter ou modifier les lignes surlignées :
Dim tba, tbc, tbm, idx As Integer, elm As Range, lig As Long, idp As Long, man As String
Dim nel As Integer
Const rep = "D:\test" 'chemin
    nel = Range(tba(idx)).Count
For Each elm In Range(tba(idx))
        Else
If lig <> elm.Row Then lig = elm.Row: If man <> 1 Then If (nel And idx <> UBound(tba)) Then Print #1,
End If
                    man = Range(tbm(idp)).Columns.Count
If man <> 1 Then Print #1, " | "; Else: If (nel And idx <> UBound(tba)) Then Print #1,
End If
            Wend
If (nel And idx <> UBound(tba)) Then Print #1,
End If

Bon test et bonne soirée.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 506
Ps: il manque une ligne dans le second :
    nel = Range(tba(idx)).Count
For Each elm In Range(tba(idx))
nel = nel - 1

Bonne nuit.
Messages postés
60
Date d'inscription
lundi 23 février 2015
Statut
Membre
Dernière intervention
10 août 2018
8 >
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020

T'es un dieu ! çà marche !
Merci