Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 08h30   #1
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
Par défaut Import TXT et retour chariot

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.
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 08h40   #2
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Ceci peut être ?
Adapte le chemin du fichier :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
Sub Lire()
 
Dim Tbl
Dim Ligne As String
Dim I As Integer
Dim J As Integer
 
    'adapter le chemin et nom du fichier
    Open "D:\Test.txt" For Input As #1
 
    Do While Not EOF(1)
 
        Line Input #1, Ligne
 
        'évite le ";" isolé
        If Ligne <> ";" Then
 
            'splite dans un tableau
            Tbl = Split(Ligne, ";")
 
            'inscrit les valeurs dans les cellules
             J = J + 1
 
           For I = 0 To UBound(Tbl)
 
                Cells(J, I + 1) = Tbl(I)
 
            Next I
 
        End If
 
    Loop
 
    Close #1
 
Erase Tbl
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 08h46   #3
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
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
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 09h04   #4
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
Par défaut ça ne fonctionne pas

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 ?
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 09h26   #5
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Re,

Oups mal compris le besion, désolé. Teste cette nouvelle proc si elle fait ce que tu désire :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
Sub Lire()
 
    Dim Tbl
    Dim Ligne As String
    Dim Tempo As String
    Dim I As Integer
    Dim J As Integer
 
    'adapter le chemin et nom du fichier
    Open "D:\Test.txt" For Input As #1
 
    Do While Not EOF(1)
 
        Line Input #1, Ligne
 
        'si il manque le point virgule de fin, le rajoute
        If Right(Ligne, 1) <> ";" Then Ligne = Ligne & ";"
 
        'splite dans un tableau en concaténant
        Tbl = Split(Tempo & Ligne, ";")
 
        'évite le retour chariot avant le point virgule
        If Ligne <> ";" Then
 
            'si l'enregistrement est complet, le stocke dans les cellules
            If UBound(Tbl) = 5 Then
                'inscrit les valeurs dans les cellules
                J = J + 1
 
                For I = 0 To UBound(Tbl)
 
                    Cells(J, I + 1) = Tbl(I)
 
                Next I
 
                Tempo = ""
 
            Else
 
                'sinon, récupère la première partie de l'enregistrement
                Tempo = Ligne
 
            End If
 
        End If
    Loop
 
    Close #1
 
    Erase Tbl
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 11h45   #6
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
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.
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 12h30   #7
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
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 ( est une date soit par date format ou carrément tester si il y a des (slashes) si il y en a enregistrer la ligne dans le tableau
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
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 16h30   #8
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
Par défaut Pourquoi pas

Citation:
Envoyé par patricktoulon Voir le message
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
Bonjour,

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
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 19h12   #9
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
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:
Date appel; Heure début; Durée; Numéro appelant; Numéro appelé;

19/01/2011; 07:37:32; 00:00:00; 33649200000;
2,08201E+14
;
19/01/2011; 07:51:24; 00:00:00; 33660000000; 336100000000;
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;
et voilà ce que je récupère dans le fichier Excel :
Citation:
Date appel|Heure début|Durée|Numéro appelant|Numéro appelé
19/01/2011<>07:37:32<>00:00:00<>33649200000<>2,08E+19
19/01/2011<>07:51:24<>00:00:00<>33660000000<>3,361E+11
05/01/2011<>13:19:48<>00:01:53<>33600111213<>33601020304
05/02/2011<>09:55:37<>00:00:03<>33620111213<>33621020304
05/02/2011<>10:34:26<>00:01:56<>33600808080
05/02/2011<>11:44:13<>00:00:03<>33620111213<>33600020304
(les <> séparent les différentes cellules)
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é.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 15h54   #10
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
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
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 17h06   #11
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Aucun problème, va pour lundi.

Bon weekend.

Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 08h47   #12
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
Par défaut Le fichier TXT

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 :

Code :
If UBound(Tbl) = 10 Then
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
Fichiers attachés
Type de fichier : txt TEST.TXT (1,1 Ko, 6 affichages)
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h27   #13
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 256
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 256
Points : 2 979
Points : 2 979
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Sub Lire()
 
    Dim Ligne As String
    Dim ligne_excel As String
    Dim Record_Marker As String
    Dim J As Long
 
    'adapter le chemin et nom du fichier
    Open "D:\Test.txt" For Input As #1
 
    ligne_excel = ""
    Record_Marker = "CELOF000000C1"
 
    Do While Not EOF(1)
 
        Line Input #1, Ligne
 
        Select Case Ligne
            Case 1                 ' Entete
                ligne_excel = Ligne
                J = 1
                Call Formatte_ligne(ligne_excel, J)
            Case Else              ' Autres records
                'Si la ligne commence par CELOF000000C1, on traite 1 nouvel enregistrement mais on termine d'abord celui en trt
               If Left(Ligne, Len(Record_Marker)) = Record_Marker Then
                  If ligne_excel <> "" Then  'qqchose dans Ligne excel en cours de trt ? -> Oui : met en cellule
                    J = J + 1
                    Call Formatte_ligne(ligne_excel, J)
                  End If
               End If
               ligne_excel = ligne_excel & Ligne
        End Select
    Loop
    Close #1
 
    If ligne_excel <> "" Then  'qqchose dans Ligne excel en cours de trt ? -> Oui : met en cellule
        J = J + 1
        Call Formatte_ligne(ligne_excel, J)
    End If
 
 
 
 
End Sub
 
Sub Formatte_ligne(ligne_excel As String, col As Long)
Dim tbl() As String
Dim i As Integer
 
        'splite dans un tableau en concaténant
        tbl = Split(ligne_excel, ";")
 
        'Stocke dans les cellules
 
        For i = 0 To UBound(tbl)
               Cells(col, i + 1) = Trim(tbl(i))
        Next i
        ligne_excel = ""
End Sub
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 13h56   #14
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut re

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
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 21h33   #15
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonsoir,

Donc si j'exécute ma proc (avec juste une petite modif sur la taille supérieure du tableau) j'obtiens :
Citation:
Numéro Cellule<>Date appel<>Heure début<>Durée<>Numéro appelan<>Numéro appelé<>IMSI<>N° de série du téléphone<>Sens d'appel<>Nature d'appel
CELOF000000C1<>03/01/1995<>03:23:31<>00:15:00<>33612000000<>Ici cellule vide ?<>CELOF105000000<>1,2448E+13<>Sortant<>Transport GPRS
CELOF000000C1<>03/01/1995<>03:24:10<>00:00:02<>33664000000<>Ici cellule vide ?CELOF1453000000<>3,52089E+14vSortant<>Transport GPRS
CELOF000000C1<>03/01/1995<>03:24:10<>00:15:00<>33668000000<>Ici cellule vide ?CELOF1701000000<>1,2416E+13<>Sortant<>Transport GPRS
CELOF000000C1<>03/01/1995<>03:24:30<>00:00:01<>33659000000<>Ici cellule vide ?CELOF1400000000<>3,58608E+14<>Sortant<>Transport GPRS
CELOF000000C1<>01/03/1995<>03:25:50<>00:00:01<>33666000000<>Ici cellule vide ?CELOF9800000000<>3,53888E+14<>Sortant<>Transport GPRS
CELOF000000C1<>03/01/1995<>03:26:41<>00:15:00<>33633000000<>Ici cellule vide ?CELOF1701000000<>1,1932E+13<>Sortant<>Transport GPRS
CELOF000000C1<>03/01/1995<>03:26:46<>00:15:00<>33642000000<>Ici cellule vide ?CELOF1050000000<>1,2266E+13<>Sortant<>Transport GPRS
CELOF000000C1<>03/01/1995<>03:27:21<>00:15:00<>33615000000<>Ici cellule vide ?CELOF1551000000<>3,55299E+14<>Sortant<>Transport GPRS
le "<>" symbolisant la séparation des cellules. Et ceci en partant de ton fichier texte structuré de la façon suivante :
Citation:
Numéro Cellule; Date appel; Heure début; Durée; Numéro appelant; Numéro appelé; IMSI; N° de série du téléphone; Sens d'appel; Nature d'appel;
CELOF000000C1; 03/01/1995; 03:23:31; 00:15:00; 33612000000; ; CELOF105000000; 012448003600000; Sortant; Transport GPRS;
CELOF000000C1; 03/01/1995; 03:24:10; 00:00:02; 33664000000; ; CELOF1453000000; 352089042900000; Sortant
;
Transport GPRS;
CELOF000000C1; 03/01/1995; 03:24:10; 00:15:00; 33668000000; ; CELOF1701000000; 012416005600000; Sortant; Transport GPRS;
CELOF000000C1; 03/01/1995; 03:24:30; 00:00:01; 33659000000; ; CELOF1400000000; 358608031600000; Sortant; Transport GPRS;
CELOF000000C1
;
03/01/1995; 03:25:50; 00:00:01; 33666000000; ; CELOF9800000000; 353888037000000; Sortant; Transport GPRS;
CELOF000000C1; 03/01/1995; 03:26:41; 00:15:00; 33633000000; ; CELOF1701000000; 011932000500000; Sortant; Transport GPRS;
CELOF000000C1; 03/01/1995; 03:26:46; 00:15:00; 33642000000; ; CELOF1050000000; 012266000800000; Sortant; Transport GPRS;
CELOF000000C1; 03/01/1995; 03:27:21; 00:15:00; 33615000000; ; CELOF1551000000
;
355299000000000; Sortant; Transport GPRS;
Est-ce le résultat que tu souhaite ?

Voici le code avec la petite modif :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Sub Lire()
 
    Dim Tbl
    Dim Ligne As String
    Dim Tempo As String
    Dim I As Integer
    Dim J As Integer
 
    'adapter le chemin et nom du fichier
    Open "D:\Test.txt" For Input As #1
 
    Do While Not EOF(1)
 
        Line Input #1, Ligne
 
        'si il manque le point virgule de fin, le rajoute
        If Right(Ligne, 1) <> ";" Then Ligne = Ligne & ";"
 
        'splite dans un tableau en concaténant
        Tbl = Split(Tempo & Ligne, ";")
 
        'évite le retour chariot avant le point virgule
        If Ligne <> ";" Then
 
            'si l'enregistrement est complet, le stocke dans les cellules
            If UBound(Tbl) = 10 Then
                'inscrit les valeurs dans les cellules
                J = J + 1
 
                For I = 0 To UBound(Tbl)
 
                    Cells(J, I + 1) = Tbl(I)
 
                Next I
 
                Tempo = ""
 
            Else
 
                'sinon, récupère la première partie de l'enregistrement
                Tempo = Ligne
 
            End If
 
        End If
    Loop
 
    Close #1
 
    Erase Tbl
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 15h12   #16
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
Par défaut Je teste, je teste

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
Fichiers attachés
Type de fichier : txt TEST2.TXT (1,1 Ko, 4 affichages)
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/09/2011, 18h38   #17
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut re

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
Sub Tst()
Dim Fichier As Variant
    ChDir ThisWorkbook.Path
    Fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt")
    If Fichier <> False Then
        Lire Fichier
    End If
End Sub
 
Function Lire(ByVal NomFichier As String)
Dim Chaine As String
Dim NumFichier As Integer
Dim chainefinale As String
Dim i As Long, e As Long, ligne As Long, col As Long
Dim tableau() As String
 
    NumFichier = FreeFile
 
 
    Open NomFichier For Input As #NumFichier
        Do While Not EOF(NumFichier)
          i = i + 1
            Line Input #NumFichier, Chaine
            'une fois i passé a 2 on enregistre la chaine finale correspondant a tout le fichier texte pour sauter ta premiere ligne
 
            If i >= 2 Then chainefinale = chainefinale & Chaine
        Loop
    Close #NumFichier
 
 
  'on va maintenant éliminé les double pointvirgule pour eviter des blancs
  chainefinale = Replace(chainefinale, "; ;", ";")
  MsgBox chainefinale
  ' maintenant on coupe le fichier par les pointvirgules
 tableau = Split(chainefinale, ";")
ligne = 2
For e = 1 To UBound(tableau)
col = col + 1
Cells(ligne, col) = tableau(e)
If col = 10 Then
col = 0
ligne = ligne + 1
End If
Next
 End Function
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
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/09/2011, 20h51   #18
Invité de passage
 
Homme Jean-Claude
Formateur en informatique
Inscription : septembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Jean-Claude
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : septembre 2011
Messages : 8
Points : 4
Points : 4
Par défaut FOR MI DABLE

Bravo Patrick

Je viens de finir mes tests et avec deux petites modifs, j'obtiens tout à fait ce que je voulais :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
Sub Tst()
Dim Fichier As Variant
    ChDir ThisWorkbook.Path
    Fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt")
    If Fichier <> False Then
        Lire Fichier
    End If
End Sub
 
Function Lire(ByVal NomFichier As String)
Dim Chaine As String
Dim NumFichier As Integer
Dim chainefinale As String
Dim i As Long, e As Long, ligne As Long, col As Long
Dim tableau() As String
 
    NumFichier = FreeFile
 
 
    Open NomFichier For Input As #NumFichier
        Do While Not EOF(NumFichier)
          i = i + 1
            Line Input #NumFichier, Chaine
            'une fois i passé a 2 on enregistre la chaine finale correspondant
            ' a tout le fichier texte pour sauter ta premiere ligne
 
            If i >= 2 Then chainefinale = chainefinale & Chaine
        Loop
    Close #NumFichier
 
 ' ======== JE SUPPRIME CETTE LIGNE =====
  'on va maintenant éliminé les double pointvirgule pour eviter des blancs
  'chainefinale = Replace(chainefinale, "; ;", ";")
  ' ======== REPRISE DE TON CODE =====
 
 
  MsgBox chainefinale
  ' maintenant on coupe le fichier par les pointvirgules
 tableau = Split(chainefinale, ";")
ligne = 2
 
' ===== Je remplace 1 par 0 : For e = 1 To UBound(tableau)
For e = 0 To UBound(tableau)
  ' ======== REPRISE DE TON CODE =====
 
col = col + 1
Cells(ligne, col) = tableau(e)
If col = 10 Then
col = 0
ligne = ligne + 1
End If
Next
 End Function
J'ai supprimé la ligne qui retire les doubles ;; parce qu'ils sont nécessaires. Cela signifie que ce champ est vide mais il doit rester matérialisé.
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
jcbne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 20h54   #19
Expert Confirmé
 
Avatar de patricktoulon
 
patrick
Inscription : avril 2009
Messages : 1 829
Détails du profil
Informations personnelles :
Nom : patrick
Âge : 42
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 1 829
Points : 2 857
Points : 2 857
Envoyer un message via MSN à patricktoulon
Par défaut re

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
patricktoulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h47.


 
 
 
 
Partenaires

Hébergement Web