Macro créer fichier TXT par colonne avec 1 bouton

Résolu/Fermé
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016 - 14 mars 2016 à 19:56
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016 - 16 mars 2016 à 21:03
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 !
A voir également:

3 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
14 mars 2016 à 23:18
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
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016
Modifié par ImaSTAT le 15/03/2016 à 18:40
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 !
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 15/03/2016 à 18:48
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
0
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016
Modifié par ImaSTAT le 15/03/2016 à 19:54
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 !
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
15 mars 2016 à 20:30
En fait, il n'y a pas de guillemets
Oui, c'était pour symboliser une cellule vide avec formule ="".
J'ai beau relire, je ne vois pas la réponse : peut-il y en avoir en milieu de colonne ? (et donc avec des valeur <>"" qui suivent.

Les colonnes à sortir démarreront toujours en F ?
Leur nombre peut être variable ?
0
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016 > eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024
15 mars 2016 à 20:44
Bonjour,

Oui, il peut y avoir des cellules vides en milieu de colonne. Mon erreur, j'ai oublié d'inclure ce scénario dans mon fichier. La colonne H par exemple, pourrait avoir des valeurs en H3 et H5 mais aucune valeur en H4, quoi que la formule serait toujours présente mais retournerais "".

Dans mon exemple, c'est toujours en F que ça débute, oui. En réalité, je ne connais pas encore la vrai colonne de départ car mon fichier n'est pas terminé à 100%. Mais ce sera quelque chose dans les alentours de PT, soit la 436e colonne. Ce sont toujours les même 9 colonnes, pour l'instant, et il sont une à la suite de l'autre. Il se pourrait que dans le futur j'ai besoin d'en ajouter, mais pour l'instant c'est fixe.

Merci
0
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016 > ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016
15 mars 2016 à 21:55
Pour préciser également, dès qu'il y a une valeur entre la ligne 3 et 300 dans une colonne, celle-ci doit avoir un fichier .TXT qui contiendra uniquement la ligne 2 + les lignes qui ont des valeurs (si possible). Si trop complexe, nous pourrons supprimer les valeurs vides dans le fichier TXT manuellement.

Merci
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
15 mars 2016 à 22:49
Non, pas plus complexe que ça. Le tout est de savoir le besoin et le contexte exacts.

1) donc ta 1ère colonne est appeler à changer.
Tu adapteras ou on peut se baser sur la 1ère cellule vide ligne 2 qui ne pourrait être que celle sous le préfixe à coup sûr ?

2) le nombre de col peut varier aussi. Je me base sur le fait que les suffixe seront suivi d'une cellule vide ou tu préfères une constante en début de programme à adapter ?

Je vois ça demain.
0
ImaSTAT Messages postés 21 Date d'inscription vendredi 19 avril 2013 Statut Membre Dernière intervention 2 septembre 2016 > eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024
16 mars 2016 à 02:08
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 :)
0