Macro créer fichier TXT par colonne avec 1 bouton
Résolu
ImaSTAT
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
ImaSTAT Messages postés 21 Date d'inscription Statut Membre Dernière intervention -
ImaSTAT Messages postés 21 Date d'inscription Statut Membre Dernière intervention -
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 !
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:
- Macro créer fichier TXT par colonne avec 1 bouton
- Fichier bin - Guide
- Fichier epub - Guide
- Creer un fichier .bat - Guide
- Déplacer colonne excel - Guide
- Fichier rar - Guide
3 réponses
Bonjour,
Je trouve plus simple, autant pour moi que pour l'utilisateur, de mettre le préfixe en D1 :
eric
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
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:
ça fonctionne bien. Mais lorsque j'essaie:
ça me donne une erreur "Argument ou appel de procédure incorrect" avec la ligne:
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 !
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 !
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
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
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
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 !
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 !
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 ?
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 ?
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
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
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
Merci
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.
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.
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:
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 :)
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 :)