|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Bonjour à tous,
Mes recherches dans le forum sont restées vaines et j'en appelle à vos connaissances presque sans limites. Bravo à tous pour le travail formidable que vous faites et que vous partagez .Je cherche à importer dans une feuille d'un classeur des données provenant d'un fichier TXT. Les champs sont séparés par des ; Le nombre des champs est fixe et = à 5 pour l'exemple : Date appel; Heure début; Durée; Numéro appelant; Numéro appelé; 01/05/2011; 13:19:48; 00:01:53; 33600111213; 33601020304; 02/05/2011; 09:55:37; 00:00:03; 33620111213; 33621020304; 02/05/2011; 10:34:26; 00:01:56; 33600808080; ; 02/05/2011; 11:44:13; 00:00:03 ; 33620111213; 33600020304; Le problème consiste en la présence de retours à la ligne assez fréquents. Je voudrais obliger Excel à se comporter comme si chaque enregistrement se trouvait effectivement sur une seule et même ligne et par conséquent à créer 5 champs par enregistrement, même en cas de champ vide comme sur la ligne 5 (Numéro appelé) de l'exemple ci-dessus. D'avance, merci pour votre contribution. |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Hervé SilveInscription : août 2010 Messages : 773 ![]() |
Bonjour,
Ceci peut être ? Adapte le chemin du fichier : Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 435 ![]() |
Bonjour,
Soit on importe dans l'état dans une feuille puis on traite le Retour-charriot Soit on lit le fichier ligne par ligne (Open) dans un tableau et on enregistre dans une feuille quand le Retour-charriot est traité Dans chaque cas la date en début de ligne est un excellent repère pour le traitement |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Bonjour et merci pour vos réponses ultra rapides.
je viens d'essayer le code de Theze mais ça ne fonctionne pas. J'obtiens la même chose qu'avec un copier/coller. En ce qui concerne la réponse de Helas, j'ai essayé la première proposition mais je n'y parviens par parce qu'un enregistrement peut se retrouver sur une, deux voire trois lignes et des champs peuvent être vides. La solution existe peut-être mais je ne possède pas les connaissances nécessaires. Je pense que la deuxième option est très intéressante puisque les noms et le nombre de champs ne changent jamais mais comment faire ? |
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() Hervé SilveInscription : août 2010 Messages : 773 ![]() |
Re,
Oups mal compris le besion, désolé. Teste cette nouvelle proc si elle fait ce que tu désire : Code :
|
||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
J'ai crié VICTOIRE mais après quelques vérifications il y a encore de "petits" problèmes :
Tout à l'air de fonctionner correctement mais un classeur que j'ai traité "manuellement" comporte 13219 lignes. En automatisant avec ta macro, le résultat ne me donne que 1739 lignes. J'ai peut être identifié l'une des causes : L'entête de colonne est OK. En revanche, la première ligne n'est pas la première ligne du TXT. Date appel; Heure début; Durée; Numéro appelant; Numéro appelé; LIGNES NON TRAITEES 19/01/2011; 07:37:32; 00:00:00; 33649200000; 2,08201E+14 ; 19/01/2011; 07:51:24; 00:00:00; 33660000000; 336100000000; C'EST ICI QUE COMMENCE LA REPONSE Je pense donc qu'il y a un lien avec le 2,08201E+14 ; Pour le reste, je continue de comparer les résultats afin d'identifier les lignes qui posent problème. Un grand pas a déjà été franchi. Merci pour ton aide. |
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() |
bonjour
si il y a un retour chariot dans une ligne la solution serait: enregistrer un tableau de toute les lignes en testant si la première partie avant le premier ( si il n'y en a pas ajouter la ligne a la précédente (forcement!!!) ainsi dans ton tableau tu te retrouverais avec toutes les lignes entière ensuite tu coupe les lignes par la fonction split par les ";" avec l'index(0,1,2,3,4) voila tout simplement au plaisir re et finalement encore plus simple puisque a priori il y doit toujours y avoir simplement 5 données séparée par des ";" tester le nombre d'éléments par lignes tant que le nombre d'élément n'est pas atteint, ajouter la ligne suivante a la précédente au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
00
|
|
|
#8 | |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Citation:
Effectivement, cela me parait très intéressant. Le problème c'est que je "bidouille" un peu en VBA avec l'enregistreur et les morceaux de code que je copie à droite à gauche mais je suis incapable d'écrire ce code tout seul. Peux-tu me proposer quelque chose comme l'a fait Theze. Je n'ai pas eu le temps de poursuivre la comparaison mais ta solution m'intéresse toujours Theze. On ne doit pas être loin de la solution. Je vous tiens informé de toute façon. Bon W.E |
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Hervé SilveInscription : août 2010 Messages : 773 ![]() |
Bonsoir,
Je ne sais pas trop comment est structuré ton fichier texte mais voilà ce que j'ai rentré dedans pour tester (avec la seconde ligne vide) : Citation:
Citation:
donc, si je me fis aux dates, avec les entêtes, ça fait 7 enregistrements et j'ai bien 7 enregistrements dans Excel. Le formatage que décide Excel de son propre chef peut être modifié au collage des valeurs. Pour aller plus loin, il faudrait que tu mette en pièce jointe un fichier texte avec tous les cas de figure que je puisse effectuer des tests de récup sur toutes les conditions. Hervé. |
||
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Bonjour Hervé et encore merci pour le temps que tu veux bien me consacrer.
En fait, les données sur lesquelles je travaille sont confidentielles et avant de les poster, j'avais pris soin de tout modifier et surtout de simplifier : je n'avais laissé que quelques colonnes pensant que je pourrais ensuite adapter le code à mon fichier. La première colonne n'est en fait pas une date mais je crois que ça n'a pas grande importance vu la méthode que tu emploie et mon soucis porte uniquement sur ces retours chariots. Je crois que le mieux est effectivement que je t'envoie un fichier. Je n'en ai pas sous la main parce que je ne suis plus au boulot. Si je trouve le temps lundi, je prends un fichier texte original dont je modifie les données sensibles uniquement, sans toucher aux sauts de lignes et autres et je te l'envoie, de préférence en privé si tu n'y vois pas d'inconvénient. Bon week-end JC |
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Hervé SilveInscription : août 2010 Messages : 773 ![]() |
Bonjour,
Aucun problème, va pour lundi. Bon weekend. Hervé. |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Bonjour,
Comme convenu, je joins un fichier TXT qui n'a plus rien de confidentiel puisque toutes les données ont été modifiées à l'exception des retours chariots et autres "parasites" éventuels. Je ne sais pas si ça peut t'être utile mais je crée ce TXT en faisant un copier / coller depuis un fichier PDF que je ne peux malheureusement pas te transmettre pour cause de confidentialité. J'ai testé avec le code que tu as élaboré après l'avoir modifié pour m'adapter au nombre de colonnes : Avec ce fichier, je suis sensé obtenir huit lignes, je n'en obtiens que 5 et avec un décalage d'une cellule sur la droite à la ligne 3 qui en plus me transforme 03/01/1995 en 01/03/1995 ??? C'est un problème que je n'avais pas rencontré ou pas encore détecté. Décidément, avec moi, rien n'est simple ! Bonne journée JC |
|
|
00
|
|
|
#13 | ||
|
Expert Confirmé
![]() Chercheur de bonheur Inscription : août 2007 Messages : 2 256 ![]() |
Bonjour,
peut-on considérer que tout enregistrement à considérer commence par la chaine CELOF000000C1 (hormis les entêtes de colonnes) ? Si c'est le cas, le code de Theze est quasi ![]() --------Edit---------- Voilà le code de Theze un peu revu. le probleme de ta date, et d'autres champs est que parfois tu as des espaces avant, parfois pas. J'ai rajouté un trim de la variable avant la mise en cellule et cela semble permettre un formattage automatique. Je te laisse le soin de reformatter les colonnes numériques à ta sauce. Code :
__________________
(\ _ /) Cordialement G@dz (='.'=) (")-(") Vous avez des neurones. Sollicitez-les. ![]() . Si vous êtes aidé, pensez à Voter.
|
||
|
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() |
bonjour
j'ai regarder ton fichier texte et il me semble que quand on scinde le fichier on a des doubles point virgule donc a quoi correspondent-ils? y a il des cellules de destination qui ne doivent pas etre remplies ensuite quand je regarde la 1 ere ligne du fichier texte tu a plus de 5 éléments donc selon ta réponse il va falloir couper le fichier autrement donc je repose la question qui t'a déjà été posé les "CELLO000XXXX" correspondent -ils a chaque début de ligne? répond vite j'ai pris un moment dans la matinée pour regarder ton fichier EDIT: si tu dois obtenir 8 lignes prend la pièce jointe récupère la vite sinon je suis bloqué pour en déposer d'autre au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
00
|
|
|
#15 | ||||
|
Membre Expert
![]() Hervé SilveInscription : août 2010 Messages : 773 ![]() |
Bonsoir,
Donc si j'exécute ma proc (avec juste une petite modif sur la taille supérieure du tableau) j'obtiens : Citation:
Citation:
Voici le code avec la petite modif : Code :
|
||||
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Bonjour à tous,
Solution de Hervé : Avec le petit fichier que j'avais posté (test.txt), ça fonctionne et c'est très exactement ce que je voulais. Je ne m'explique pas pourquoi mais pour un autre fichier TXT que je travaille manuellement, j'obtiens 13219 lignes dans le tableur. Avec ton code, je n'obtiens que 9171 lignes. A mon avis, il ne faut pas ajouter le ; en fin de ligne s'il n'y en a pas. Cela veut dire que le contenu du champs en cours se poursuit sur la ligne suivante. J'ai conscience que tout serait beaucoup plus facile si je pouvais vous envoyer le fichier pdf mais je ne peux vraiment pas. La solution de Godzestla est presque parfaite. Avec ce même fichier, j'obtiens 13215 lignes. Quatre petites lignes que je peux difficilement localiser. En effet, j'ai fait de nombreux tests avant de répondre ce qui explique le délai. Pour ces tests, j'ai fait un import manuel que j'ai trié par date et heure croissants puis je vérifie l'égalité des cellules dans l'une et l'autre des feuilles XLS. Problème, c'est qu'avec cette solution l'erreur que je signalais sur la date persiste. De ce fait, j'ai un décalage partout et tester pour rechercher les erreurs revient à lire les lignes une par une ... et mon Boss va pas être d'accord ![]() J'ai peut-être identifié la cause et je joins une petit fichier en TXT qui contient deux lignes à problème au milieu de lignes qui sont OK. En, plus, on rencontre bien le problème de date. L'autre problème, qui est de taille, c'est que mon premier champ ne contient pas toujours la même valeur. De ce fait, ton code ne fonctionne qui si mon premier champ contient CELOF000000C1 (Record_Marker = "CELOF000000C1" ). En revanche, ce champ commence toujours par "2082XXXXXXXXX" ou les x sont des chiffres qui peuvent être différents au sein d'un seul fichier. As-tu une solution ? La solution de Patrick fonctionne parfaitement avec le petit fichier TXT que j'avais posté sur le forum. Par contre, avec le fichier complet ci-dessus, j'ai également des pertes de données et des champs décalés. Je n'ai pas encore trouvé le temps de tout analyser mais je crois que si tu adaptes ton code avec le fichier TEST2.TXT ça devrait fonctionner également. Je suis en congés dès cet après-midi et j'aurai plus de temps pour tout tester de façon plus rigoureuse et peut-être identifier l'origine des problèmes. Si j'arrive à solutionner le problème jj/mm/aaaa qui devient mm/jj/aaaa on sera probablement plus près du but. J'ai essayé de formater la colonne qui reçoit la date (en jj/mm/aaaa) avant le traitement mais c'est sans effet. Quoi qu'il en soit, même si je reste quelques jours sans vous donner de nouvelles, je n'abandonne pas et vous tiendrai informés dès que possible. Ne pourrait-on pas traiter champs par champs, écrire dans XLS et passer à la ligne suivante dès que l'on a traité dix champs plutôt que de traiter ligne par ligne ? C'est un traitement qui me fait perdre beaucoup de temps au quotidien et je serais vraiment trop content que l'un de vous trouve ce "petit truc" qui cloche toujours. Encore merci à vous tous. Cordialement JCB |
|
|
10
|
|
|
#17 | ||
|
Expert Confirmé
![]() |
bonjour jcbne
je suis en train de regarder le texte2 et effectivement il n'a rien a voir avec le 1 alors avant on avait comme repère le "CELOxxxxxxC1" qui pouvait déterminer les début de ligne maintenant si je comprend bien on a des "2082XXXXXXXXX" si tes fichiers texte change a tout va tu demande l'impossible vba n'a pas de 6 eme sens ![]() il ne devine pas si les éléments sont dans l'ordre même sur une ligne différente tu pourrais reprendre l'idée que j'ai eu au départ et l'adapter a ma macro c'est a dire ajouter chaque ligne a une variable string pour en un seul texte et le couper par le nombre d'intitulés pour en obtenir chaque lignes mais cependant si je me rebase sur le texte 1 il n'y avait pas tout les intitulés pour chaque lignes alors parti de la ça deviens dur encore une fois vba ne divine pas EDIT dans l'éventualité ou les intitulés ne change plus alors on obtiens toujours 8 lignes avec ca Option Explicit Code :
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
||
|
|
10
|
|
|
#18 | ||
|
Invité de passage
![]() Jean-Claude Formateur en informatique Inscription : septembre 2011 Messages : 8 ![]() |
Bravo Patrick
Je viens de finir mes tests et avec deux petites modifs, j'obtiens tout à fait ce que je voulais : Code :
J'ai également modifié la ligne For e = 0 To UBound(tableau) parce que avec comme valeur 1 j'avais un décalage et ma colonne 1 se trouvait en 10ème position avec la dernière cellule du tableau non renseignée. T trop fort. ![]() ![]() Merci à toi, merci aux autres qui ont contribué et m'ont permis d'apprendre ENCORE un tas de choses.Cordialement JCB |
||
|
|
00
|
|
|
#19 |
|
Expert Confirmé
![]() |
bonsoir
oui finalement tu adopte ma première idée que j'avais eu au départ oui je l'ai remarqué apres avoir relu mon code j'ai dérapé sur la touche 1 a la place de 0 c'est seulement une erreur de frappe car un tableau commence toujour par "0" et bien si ça te conviens a la bonne heure!!!... au plaisir
__________________
mes fichiers dans les contributions: mon formulaire mail avec CDO en vba et mon formulaire mail avec CDO en vbs dans un HTA mon nouveau mouse in out pour les boutons dans un userform mon addin pour prendre un cliché de selection de cellules si ton problème est résolu n'oublie pas de pointer :résolu:ça peut servir aux autres et n'oublie pas de voter ![]()
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com