Macro créer fichier TXT par colonne avec 1 bouton [Résolu/Fermé]

Signaler
Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016
-
Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016
-
Bonjour,

J'aimerais savoir s'il est possible, avec une macro, d'effectuer l'enregistrement simultané de plusieurs fichiers .txt contenant chacun le texte de sa colonne en spécifiant un préfixe au nom des fichiers et un chemin de destination.

Ex:

J'ai 3 colonnes, A, B et C. Chacune contient du texte sur plusieurs lignes, mais pas nécessairement le même nombre de lignes (peut varier de 1 à 300).

Simulation:

A1 = allo
A2 = bonjour
B1 = au revoir
B2 = bonsoir
B3 = bonne nuit
C1 = merci
C2 = au plaisir

J'aimerais qu'en cliquant sur le bouton "Create", une fenêtre ouvre et demande le préfixe à utiliser, ainsi que le chemin où enregistrer les fichiers. J'entre par exemple: "Prefix_", et je Browse pour C:/ et lorsque j'appuie OK, 3 fichiers sont créés automatiquement, chacun avec leur propre nom mais précédé du préfixe établi, et chacun contenant le texte de mes colonnes A, B et C, et ce, jusqu'à la dernière ligne pour laquelle il y a du texte (entre 1 et 300). Dans le fichier .TXT, chaque ligne doit être séparé par un "retour".

Donc, je devrais obtenir 3 fichiers:

Prefix_COLA contenant:
allo
bonjour

Prefix_COLB contenant:
au revoir
bonsoir
bonne nuit

Prefix_COLC contenant:
merci
au plaisir

Si ce n'est pas possible d'enregistrer plusieurs fichiers simultanés, alors je pourrais faire un bouton par colonne, mais j'aurais besoin du même principe pour une macro qui gère une seule colonne et un seul fichier.

Je ne sais pas trop par où commencer, mes bases en VBA sont très limitées.

Merci beaucoup à l'avance de votre aide !

3 réponses

Messages postés
23417
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 août 2020
6 281
Bonjour,

Je trouve plus simple, autant pour moi que pour l'utilisateur, de mettre le préfixe en D1 :
Sub fich()
    Dim Repertoire As FileDialog, prefixe As String
    Dim lig As Long, col As Long
    Dim numfich As Integer
    
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Repertoire.Show
    If Repertoire.SelectedItems.Count = 0 Then Exit Sub
    prefixe = [D1] & "_COL"
    
    For col = 1 To 3
        numfich = FreeFile
        Open Repertoire.SelectedItems(1) & "\" & prefixe & Chr(64 + col) & ".txt" For Output As #numfich
        For lig = 1 To Cells(Rows.Count, col).End(xlUp).Row
            Print #numfich, Cells(lig, col) & vbCrLf;
        Next lig
        Close #numfich
    Next col
End Sub 

eric
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57047 internautes nous ont dit merci ce mois-ci

Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016

Bonjour Eric,

Wow, ça fonctionne très bien. Mettre le préfixe dans une cellule peut convenir effectivement.

Petit soucis par contre, en réalité j'aurai 9 colonnes à prendre en considération, et ce ne sont pas les 9 premières. Ce sera quelque chose dans les alentours des colonnes PT à QB, soit les colonnes #436 à #444. Lorsque j'essaie en changeant comme suit:

    prefixe = [PS3] & "_" & [PS4] & "_COL"

For col = 1 To 9


ça fonctionne bien. Mais lorsque j'essaie:

For col = 436 To 444


ça me donne une erreur "Argument ou appel de procédure incorrect" avec la ligne:

Open Repertoire.SelectedItems(1) & "\" & prefixe & Chr(64 + col) & ".txt" For Output As #numfich


Aussi, dans mon exemple, j'avais le suffixe _COLX mais en fait, ce sera autre chose dépendamment de la colonne. Comment mettre du texte différent en fonction de la colonne ?

Ex:
Fichier créé à partir de COLA = prefixe(D1)_bonjour
Fichier créé à partir de COLB = prefixe(D1)_salut
Fichier créé à partir de COLC = prefixe(D1)_allo

Finalement, est-ce possible de faire en sorte que le fichier pour une colonne spécifique n'est pas créer si les lignes 3 à 300 de cette colonne sont vides ? (J'ai deux en-têtes, dans les lignes 1 et 2 de chaque colonne qui ont toujours du texte, donc il ne faut pas en tenir compte).
Attention: lorsque je dis vide, je parle d'aucun texte (""), car chaque cellule contient des formules.

Merci beaucoup pour ton aide et ce beau travail !
Messages postés
23417
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 août 2020
6 281
Bonjour,

Dans mon exemple, j'avais le suffixe _COLX mais en fait, ce sera autre chose dépendamment de la colonne. Comment mettre du texte différent en fonction de la colonne ?
Mettre le suffixe en entête de colonne c'est possible ?

lorsque je dis vide, je parle d'aucun texte ("")
Est-ce qu'il peut y avoir des "" au milieu ou sont-ils obligatoirement à la fin de la colonne ?
S'il y en a au milieu faut-il les sauter ou les conserver ?

J'ai deux en-têtes, dans les lignes 1 et 2 de chaque colonne...
Dépose un fichier exemple en précisant où tu as mis le préfixe et les suffixes
cjoint.com et coller ici le lien fourni.
eric
Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016

Bonjour,

Mettre le suffixe en entête de colonne c'est possible ?
Oui, je pourrais utiliser la Ligne 1 de chaque colonne comme suffixe, on aurait ainsi les fichiers finaux qui serait nommés selon:

prefixe_ligne1deLaColonne1
prefixe_ligne1deLaColonne2
etc.

Est-ce qu'il peut y avoir des "" au milieu ou sont-ils obligatoirement à la fin de la colonne ?
S'il y en a au milieu faut-il les sauter ou les conserver ?

En fait, il n'y a pas de guillemets. Les lignes 3 à 300 de chaque colonne peuvent contenir des valeurs ou non, en fonction de ce qui retourne de la formule. Donc les lignes 3 à 300 de mes 9 colonnes contiennent nécessairement des formules, mais pas nécessairement des valeurs. Toutefois, les lignes 1 et 2 de chaque colonnes contiennent des valeurs en tout temps.
Donc, ce que j'aimerais c'est que le fichier pour une colonne X ne soit pas créé si sa colonne n'a aucune valeur du tout en ligne 3:300

Voir ci-joint le fichier d'exemple que j'ai fait. Dans cet exemple, on créer un fichier .txt contenant les lignes 2 à 5 pour chaque colonne F à N si cette dernière contient des valeurs dans la plage des lignes 3 à 5.

Ainsi, je devrais obtenir 5 fichiers:
PREFIXE_SUFFIXE1 contenant les valeurs F2 à F5
PREFIXE_SUFFIXE3 contenant les valeurs H2 à H5
PREFIXE_SUFFIXE4 contenant les valeurs I2 à I5
PREFIXE_SUFFIXE6 contenant les valeurs K2 à K5
PREFIXE_SUFFIXE8 contenant les valeurs M2 à M5

Dans cet exemple j'ai utiliser

For col = 6 To 14


et ça fonctionne pour sortir les 9 colonnes dans des fichiers.

Pourquoi est-ce que ça ne fonctionne pas avec 436 To 444 ?

Oh et je prend une chance. Lorsque le fichier .TXT est créer, il y a toujours une ligne "vide" à la fin du fichier. Est-ce possible de supprimer cette ligne vide pour que le fichier arrête réellement à la dernière ligne de texte (aucun retour final). Le serveur où j'upload les fichiers est très pointilleux et il retournera un erreur s'il y a une ligne de commande vide dans le fichier .txt

http://www.cjoint.com/c/FCpsTiERMGx

Merci beaucoup !
Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016
>
Messages postés
23417
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 août 2020

Bonjour,

Je comprend qu'il peut être difficile de s'y retrouver sans le contexte global.

En fait, j'ai monté le fichier d'exemple en supposant qu'il serait facile de définir les colonnes à traiter par la suite.

1) Dans mon fichier exemple, les colonnes A à D sont appelés à changer fréquemment, il pourrait y en avoir plus ou moins. Mais effectivement, la colonne Préfixe demeure celle qui délimite ce qui est à extraire (toutes les colonnes après le préfixe peuvent être extraient), et la Ligne 2 de cette colonne demeurera vide, présentement les lignes 3 et 4 définissent le préfixe (voir plus bas), et toutes les autres lignes en dessous de la colonne préfixe sont vides. Un ou l'autre me convient, je peux adapter la macro en fonction des colonnes que je modifie si ça allège le code.

2) Les suffixe ne seront pas suivi d'une cellule vide s'ils sont placés en Ligne 1 de chaque colonne à extraire. La Ligne 2 de ces colonnes aura toujours du texte, qui doit être extrait d'ailleurs. Je crois qu'une constante à adapter serait l'idéal.

Si tu aimes la lecture, voici un petit roman expliquant mon scénario plus précisément :)

En réalité, j'ai un fichier avec plusieurs colonnes qui, au final, une fois compilées de différentes façons, se retrouve avec un résultat dans les 9 dernières colonnes de la feuille (pourrait éventuellement être plus, mais resterons les dernières colonnes du fichier). Ce sont ces dernières colonnes qui doivent être extraient. Le préfixe se trouvera sur une colonne quelconque, entre les colonnes du début et les colonnes à extraire, Le préfixe sera constitué des cellules 3 et 4 de la colonne "préfixe".

Ainsi, supposons que la colonne préfixe est PR (c'est celle-là pour l'instant, mais est portée à changer en fonction des colonnes que j'ajouterai/supprimerai avant).

PR3 et PR4 constituerons le préfixe, soit:
[PR3] & "_" & [PR4] & "_"


Toutes les colonnes qui suivront (pour l'instant PS à QA), seront celle qui doivent être extraient en fichier TXT si au moins une des lignes 3 à 300 contiennent une valeur. J'ai besoin d'être en mesure de définir ces colonnes, car il est très probable que des colonnes s'ajoutent ou se retirent avant le préfixe, ce qui décalera les colonnes à extraire également.

Le suffixe ne changera jamais pour chaque colonne, mais si une nouvelle colonne à extraire est nécessaire dans le futur, elle nécessitera un nouveau suffixe.

Le suffixe peut être n'importe où, il ne correspond pas nécessairement à une cellule. Idéalement, ce serait une constante dans le code, soit par exemple Suffixe de COL PS = Bienvenue, sinon il peut correspondre à la Ligne 1 de chaque colonne à extraire.

Supposons que le suffixe est sur la première ligne de chaque colonne à extraire, et que:
PR3 = Allo
PR4 = Bonjour
PS1 = Bienvenue

Le fichier final correspondant à la colonne PS sera:
Allo_Bonjour_Bienvenue.txt
et contiendra les cellules avec des valeurs de PS2 à PS300, en autant qu'il y ai au moins une valeur dans la plage PS3 à PS300. Si aucune valeur dans cette plage, alors le fichier n'est pas créé. Si par exemple, il y a des valeurs seulement aux lignes PS30 et PS101, alors le fichier contiendra uniquement les lignes PS2, PS30 et PS101 (Ligne 2 est toujours présente on top, elle correspond aux "headers").

En espérant que ça t'aide à comprendre mon besoin. Merci énormément de ton temps.
N'hésites pas si tu as des questions :)
Messages postés
23417
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 août 2020
6 281
Bonjour,

Je pense n'avoir rien oublié, regarde si ça va.
Je ne connais pas ta version excel mais tu m'as passé un xls. Il te faudra un xlsm si tu veux dépasser 256 colonnes.
https://www.cjoint.com/c/FCqiiwFakP6
eric
Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016
>
Messages postés
23417
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 août 2020

Bonjour Eric,

Wow, ça fonctionne à la perfection.

J'utilise effectivement un .xlsm (Excel 2010), j'avais envoyé un .xls car ton premier exemple était dans ce format.

De ce que je comprend, le code va toujours trouver le "préfixe", en fonction de la 2e ligne vide dans la feuille, et tiendra compte ensuite de toutes les colonnes qui suivent pour l'extraction ?

Dernière chose. Mon préfixe sera constitué des lignes 3 & 4 de la colonne "prefixe". J'imagine que ceci est la bonne chose à faire dans ce cas:

prefixe = Cells(3, col1) & "_" & Cells(4, col1) & "_"


Encore une fois, merci beaucoup de ton aide et de ton temps, c'est très apprécié. Ça sauvera du copier/coller à profusion :)
Messages postés
23417
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
6 août 2020
6 281
De ce que je comprend, le code va toujours trouver le "préfixe", en fonction de la 2e ligne vide dans la feuille, et tiendra compte ensuite de toutes les colonnes qui suivent pour l'extraction ?
oui, jusqu'à la 1ère cellule vide à droite ligne 1 pour les colonnes. Tu peux donc sauter une colonne et en utiliser d'autres à droite pour autre chose.

Dernière chose. Mon préfixe sera constitué des lignes 3 & 4 de la colonne "prefixe". J'imagine que ceci est la bonne chose à faire dans ce cas:
oui, ou bien l'intégrer dans le code (mais moins de souplesse en cas d'évolution)
Mais le "_" final est déjà dans le code
Messages postés
21
Date d'inscription
vendredi 19 avril 2013
Statut
Membre
Dernière intervention
2 septembre 2016

Parfait !
Merci beaucoup