Menu

Conversion et mise en forme .txt en .xls [Résolu/Fermé]

Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
- - Dernière réponse : C0rleone
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
- 17 juin 2010 à 15:37
Bonjour,

je cherche à automatiser la conversion et la mise en forme d'un fichier .txt en .xls. Je m'explique j'ai un terminal mobile qui enregistre des données lorsque je les exporte vers mon pc, j'obtiens un fichier texte avec des informations séparées par des points-virgules. Seulement pour exploiter mes données, c'est à dire les importer vers un logiciel, il faut que ces données soient dans un fichier .xls, suivant un ordre différent de celui du fichier .txt et en plus qu'il y ait un libellé pour chaque colonne.

Je cherche donc à automatiser celà pour éviter de devoir refaire tous les jours la même opération.

Je viens donc vers vous pour savoir quel langage de programmation utilisé ? Et étant novice en programmation, quelles seraient les fonctions à utiliser ?

Merci d'avance pour votre aide.

Afficher la suite 

15 réponses

Meilleure réponse
Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249
1
Merci
aah, mais ton workbook 'codearticle.xls' c'est un autre fichier excel ?

si oui est-il fermé?

si oui, ca peut être un probleme car ca ne fonctionne pas exactement comme une liaison vers un autre fichier depuis l'interface d'excel (qui d'ailleur as besoin que les fichiers soient ouvert quand tu tapes la formule)

rajoute en début de code
dim mon_workbook as workbook 
set mon_workbook = activeworkbook 

dim code_article as workbook 
set code_article = workbooks.open "code_article.xls" 

mon_workbook.activate 

et dans le vlookup

vlookup(code_article.sheet(.....

Dire « Merci » 1

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

CCM 44335 internautes nous ont dit merci ce mois-ci

Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249
1
Merci
essaye de déclarer tes variable en Variant
CodeArticle et Designation

un article sur google parle de ca.

Dire « Merci » 1

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

CCM 44335 internautes nous ont dit merci ce mois-ci

Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249
0
Merci
grace à excel tu peux enregistrer une "macro" (menu outil --> Macro)

tu créer un fichier vide, tu démarre l'enregistrement de la macro, et tu fais toutes les manipulation dont tu as parler (ouverture, conversion, tri, mise en page)

et tu arrete la macro avec le petit bouton carré qui est apparu.

tu peux aller voir le code généré en VBA dans l'éditeur de macro d'excel (Alt+F11)
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
J'ai réussi à automatiser certaines opérations cependant j'ai quelques problèmes. Voici la liste des opérations à réaliser :

1)Création nouveau classeur => OK

2)Enregistrer sous le classeur => Est ce possible de nommer l'enregistrement avec l'aide d'un champ date ? Ex : Prépa-14/06/2010.xls

3)Convertir le fichier Essai.002 en Essai.csv => Est ce possible ? Dans le cas contraire, est-ce que je peux faire un copier coller pour que les données apparaisse dans différentes cases. J'ai essayé en faisant un collage spécial mais ça ne marche pas.

4)Ouvrir le fichier Essai.csv => Je suis obligé de le garder ouvert pour que ça fonctionne, est-il possible de l'ouvrir automatiquement?

5) Coller les différentes données dans les différentes cellules. => OK si fichier en .csv

6) Insérer ligne et renseigner les libellés => Ok

7) Enregistrer le fichier => OK

Merci d'avance.
Krysstof
Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249 -
2 ) oui, tu as des fonction de date dans VBA, par contre prend le format aaaa-mm-jj car les "/" ne sont pas autorisé dans les noms de fichier.

3 ) quand tu ouvre un fichier texte (csv, txt ou xxx) c'est la fonction "opentextfile" qui s'en fiche du nom de fichier, donc tu peux avoir le nom que tu veux, je ne comprend pas ton histoire de copier coller.
tout dépend de ce qu'il y a dedans, si c'est déja du séparé par virgule (csv) mais que le nom est en .002, cela s'ouvrira très bien.

4 ) cf 3, si tu enregistre dans une macro l'ouverture d'un fichier, tu auras le code. mais oui, il faut qu'il reste ouvert sinon tu ne peux y accéder.



si quand tu ouvre le fichier texte, tout est dans la 1ere colonne et que tu n'a pas de cellule séparée, tu sélectionne la colonne (A normalement) et tu as une fonction "Données --> Convertir" qui te permet de transformer le bazard en vrai tableau excel.

faut l'enregistrer aussi dans une macro

après il faut imbriquer ces bouts de macro les un derriere les autre, gérer les date, les nom de fichier etc... pour automatiser le processus.
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
Merci krysstof pour ton aide, ça commence à avoir de la gueule :p

Je réussi à ouvrir le fichier test.002 directement dans un classeur excel avec la fonction : Application.Workbooks.Open FileName:="C:\Documents and Settings\test.002"

Je réussi également à convertir en tableau puis classer mes colonnes et indiquer les libellés.

Pour l'enregistrement, j'ai également réussi à rajouter la date, il ne me reste plus qu'à mettre un indice à l'enregistrement mais je ne vois pas trop comment faire c'est à dire que si il y a deux fichier d'iimports pour le même jour et je ne souhaite pas qu'il soit écrasé, il y aura un enregistrement test_15_06_1.xls et un autre en test_15_06_2.xls.

Ensuite, c'est la mise en forme en utilisant des boutons mais ça c'est pas trop dur.

Merci d'avance.
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
27 janvier 2014
960
0
Merci
Bonjour,
Ce serait plus façile d'ajouter l'heure au nom du fichier, sinon il te faut passer en revue tout les classeurs du répertoir pour voir s'il y en a déjà un sous ce nom
Dim NomFichier As String
    NomFichier = Replace("Test_" & Now, "/", "-")
    ActiveWorkbook.SaveAs "C:\Documents and Settings\" & NomFichier

A+
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
merci lermite222 pas bête l'idée de la date, je préfère avoir des indices que la date question de lisibilité. J'ai réussi en faisant une boucle, je me suis appuyer sur une de tes réponses : http://www.commentcamarche.net/forum/affich-7069029-vba-probleme-pour-incrementer

J'ai un dernier problème après j'arrête c'est promis.

Je voudrai faire apparaitre la désignation pour cela, j'ouvrirai un classeur excel et j'effectuerai une recherchev dedans et je fermerai le classeur contenant le tableau de correspondance code - designation.

J'ai cru comprendre en regardant sur différent forum qu'il fallait utiliser la fonction WorksheetFunction.VLookup, c'est ce que j'ai fait. Mais ça bloque sur cette partie du code, ça me marque erreur 1004 : impossible de lire la propriété Vlookup.


For c = 2 To 9999

CodeArticle = Cells(c, 1).Value
MsgBox CodeArticle
Designation = WorksheetFunction.VLookup(CodeArticle, Workbooks("code_article.xls").Sheets("Feuil1").Range("A1:B5000"), 2, False)
If CodeArticle <> "" Then Cells(c, 8).Value = Designation

Next c


J'utilise l'itération pour qu'il me cherche des désignations tant qu'il y a des codes.


Je sens que c'est un truc tout con mais je bloque depuis hier soir dessus.

Merci d'avance.
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
j'ai fait la modif concernant le while not isempty, ça m'a l'air de fonctionner pour incrémenter.

Pour ce qui est de mon tableau, il est standard c'est à dire les codes dans une colonne, les désignations dans une autre. Mais quand j'ai fait des test exemple de mettre la valeur 1 dans les cases, ça me rempli les cases horizontalement si je mets cells(1,c). Je me suis donc dit que c'était peut les anglophones qui était tordu et qui ne fonctionnait pas en (x,y), j'ai donc mis cells(c,1) et ça me rempli les cases verticalement comme je le souhaite.

J'ai modifié le "A1:B5000", j'ai trié mon classeur ayant les correspondance code article, j'ai fait sauter également la ligne avec les libellés pour ne pas que ça gène la recherche mais idem Erreur 1004.

Saloperie de recherchev !! Je ne vois absolument pas d'où ça peut venir.
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
je l'avais ouvert, j'ai essayé au début de faire avec un fichier fermé mais ça marchait pas donc ce que j'ai fait c'était de l'ouvrir puis de le fermer à la fin la macro.

j'ai remplacé mon code par le tien pour l'ouverture, enfin j'ai fait quelques modifications au niveau des noms et des chemins.

Et ......... toujours le même problème :(

c = 2
While Not IsEmpty(Cells(c, 1))
CodeArticle = Cells(c, 1).Value
MsgBox CodeArticle
Designation = WorksheetFunction.VLookup(CodeArticle, code_article.Sheets("Feuil1").Range("A:B"), 2, False)
If CodeArticle <> "" Then Cells(c, 2).Value = Designation
c = c + 1
Wend


j'ai remodifié l'ordre (1,c) en (c,1) car ça me faisait le même bordel en itérant en horizontal et non en vertical. Pourtant c'est la bon code qu'il cherche car j'ai mis la msgbox pour vérifier quelle valeur était renseignée pour CodeArticle.

Le problème ne viendrait pas d'une différence de format entre les deux tableaux l'un serait en texte et l'autre en nombre ?? mais ils m'ont l'air d'être bon. La formule du vlookup est bonne ??
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
ça marche !!!!!!!!!!!!!!

Je les ai juste déclaré en variant à la place string et c'est bon.

Merci à toi Krysstof, tu m'as filé vraiment fait gagner bcp de temps et surtout bcp de prises de têtes.
Krysstof
Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249 -
mets ton probleme en résolu, et des +1 sur les solutions, ca peut aider les autres
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
Je reviens vers vous car ma macro marche bien mais j'ai des problèmes à l'importation de mon fichier vers un autre programme.

J'ai pu remarquer en essayant d'ouvrir mon fichier avec openoffice qu'il me demandait le type de séparation comme lors de l'ouverture d'un .csv alors que d'habitude quand j'ouvre un .xls avec Open office, il ne me le demande pas.

J'ai essayé de voir en créant le fichier manuellement et en faisant les différentes opérations. Quand je l'ouvre avec le bloc note, j'ai une bouillie de caractères alors que quand j'ouvre le fichier généré par la macro, ça me donne un fichier clair avec des ; pour séparer les champs.

J'ai un message quand j'enregistre le fichier pour me dire qu'il contient des informations non compatibles avec Texte (séparateur:tabulation) (*.txt). On me propose soit de conserver le format et ça me donne un fichier par exploitable ou soit de conserver les caractéristiques et dans ce cas là ça doit marcher.

J'aimerais donc savoir comment faire pour enregistrer automatiquement en gardant les caractéristiques.

C'est la dernière ligne droite.

Merci d'avance.
Krysstof
Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249 -
heu... hein?
le fichier que tu veux ouvrir avec open office, c'est le fichier qui résulte de la macro, c'est ca?

Si c'est le cas, quel est le format d'enregistrement, ou mieux, le bout de code qui fait l'enregistrement.

Ensuite il y a un probleme avec le CSV pour nous, cher francais que nous sommes.
CSV = Comma separated value, valeur séparées par une virgule, pas un point virgule.
Cela veut donc dire un gros probleme d'incompatibilité car certain tableurs vont obligatoirement vouloir des virgules, d'autre vont se baser sur les paramètre régionaux de windows qui dit ";" et donc un vrai csv avec des "," ne fonctionnera pas... bref c'est un vrai cafouillage à ce niveau la.

donc, avant de se lancer dans la conversion de séparateur, montre moi comment le fichier est enregistrer, et ensuite la liste de programme avec lesquels tu veux ouvrir ce fichier.
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
Dans un premier temps, je déclare la variable Destination et ensuite je lui donne une valeur. Cela me permet si je modifie le chemin ou le nom du fichier de le modifier qu'une seule fois dans le programme. Ensuite, je sauvegarde.

Dim Destination As String
Destination = "C:\Documents and Settings\stagiaire 1\Bureau\Migration base de données\test macro\Inventaire.xls"

'Sauvegarde du fichier'
ActiveWorkbook.SaveAs Destination


Oui, c'est le fichier généré par la macro que j'ai ouvert sous open office mais juste pour voir. Je veux que ça devienne un vrai fichier .xls car on me demande un fichier .xls pour l'importation que j'ai à réaliser.
Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249
0
Merci
rajoute une option de formatage dans la fonction saveas

je crains que tu ais ouvert un csv, donc il va garder le format csv, mais l'appeler .xls sans le convertir.

ActiveWorkbook.SaveAs Filename:=Destination , FileFormat:=xlNormal
Messages postés
11
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
9 juillet 2010
0
Merci
SuperKrysstof is back !!!

Une fois de plus, tu m'as trouvé la solution ^^ Encore une fois, un grand merci !!

Cette fois, je vais attendre avant de mettre que le problème est résolu mais je l'espère fortement !!

1000 merci.
Messages postés
1489
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
23 août 2010
249
-1
Merci
Alors déja tu remplaces ca :
For c = 2 To 9999
...
Next c

par

c=2
while not isempty(Cells(c, 1))
     ....

     c=c+1
wend


Ensuite, si je regarde ton code, j'ai un doute, cells(c,1) référence une cellule de la 1ere ligne et c'est le numéro de colone qui incrémente?
ca me parait juste étonnant, mais bon, chacun fait ses tableaux comme il veut.
(si jamais tes articles sont dans la colonne A et que tu veux faire une itération sur tt les lignes, c'est cells(1,c) qu'il faut mettre)

pour le RechercheV (VLookUp), essaye de remplacer "A1:B5000" par "A:B" et assure toi que ce tableau des code article est trié dans l'ordre croissant sur la colonne A, c'est une obligation
j'ai fais un test chez moi, ca marche