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 30/09/2011, 15h53   #1
Membre régulier
 
Inscription : février 2007
Messages : 240
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2007
Messages : 240
Points : 78
Points : 78
Par défaut Convertir un fichier TXT

Bonjour,

Lorsqu'on ouvre un fichier TXT sur Excel, il nous propose automatiquement la boite de dialogue "Convertir" (ce qui est très bien)

Ensuite quand on choisit "Largeur fixe", il nous découpe tout le fichier, et on ne peut pas lui dire que pour la ligne 1 ça va être tel découpe, et pour les lignes 2 à 9 ça va être autrement, et pour la ligne 10 encore différemment ?

Voici un exemple de code :

Code :
1
2
3
4
5
6
Workbooks.OpenText Filename:=OuvrirFichiers, Origin:=xlWindows, StartRow:=1, DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 2), Array(1, 1), Array(6, 1), Array(9, 1), Array(24, 1), Array(26, 1), Array(31, 1), Array(36, 1), _
Array(38, 1), Array(39, 1), Array(71, 1), Array(103, 1), Array(111, 1), Array(115, 1), Array(116, 1), Array(120, 1), _
Array(147, 1), Array(185, 1), Array(223, 1), Array(228, 1), Array(260, 1), Array(265, 1), Array(297, 1), Array(312, 1), _
Array(327, 1), Array(342, 1), Array(382, 1), Array(422, 1), Array(426, 1), Array(431, 1), Array(581, 1)), _
TrailingMinusNumbers:=True
Merci par avance pour votre aide
wyzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h36   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Si le fichier txt a un format spécifique, tu ne peux, à ma connaissance, utiliser cette méthode d'importation.

Les post ci dessous traite d'une méthode d'importation qui te permettra de manipuler chaque ligne du fichier

http://www.developpez.net/forums/d11...tion-fichiers/
http://www.developpez.net/forums/d11...n-donnees-txt/
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h40   #3
Membre régulier
 
Inscription : février 2007
Messages : 240
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2007
Messages : 240
Points : 78
Points : 78
Oui c'est un format spécifique ayant cette norme :

colonne 1 = code enregistrement
colonne 2 à 6 = code client
colonne 7 à 9 = succursale
etc...


Ok je vais regarder tes liens, merci
wyzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 17h34   #4
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 heuh...

bonjour

il y a un sujet du même genre avec un exercice très similaire qui a été traité
très recemment donc j'ai apporté une solution

voici le lien cela t'inspirera peut être
tu pourrais nous donner un exemple de fichier texte et un exemple de fichier excel que l'on doit obtenir pour pouvoir élaborer un matrice

n'hésite pas ces sujet sont toujours très intéressants


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 02/10/2011, 14h08   #5
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 668
Points : 7 668
Citation:
Envoyé par wyzer Voir le message
on ne peut pas lui dire que pour la ligne 1 ça va être tel découpe, et pour les lignes 2 à 9 ça va être autrement, et pour la ligne 10 encore différemment ?
Citation:
Envoyé par wyzer Voir le message
Oui c'est un format spécifique ayant cette norme :

colonne 1 = code enregistrement
colonne 2 à 6 = code client
colonne 7 à 9 = succursale
etc...
On s'y perd, là.

Les lignes peuvent-elles avoir des structures différentes?
__________________
N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 09h43   #6
Membre régulier
 
Inscription : février 2007
Messages : 240
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2007
Messages : 240
Points : 78
Points : 78
J'avoue que c'est pas évident à comprendre

Voici la description complète du fichier TXT:

Première ligne (commence par 1) :



Lignes bénéficiaires (commence par 2) :





Dernière ligne (commence par 9) :



Et un exemple TXT :

Code :
1
2
3
4
5
109999SOCIETE DES FLUTES     28092011OUNIVERIS 4.F.6                
2099990011523           300200000300002JOHNSON                        CAROLINE                        26061970                                    10 ROUTE DE L'EAU                                                           75010PARIS                                                                               0123456789                    SERVICE DE PROXIMITE                                                            000000010LAFEE@GMAIL.COM                                                                                                                                    
209999001758            100200000300002SMITH                          MARIE MADELEINE                 18041960                                    55 ROUTE DE LA BOISERIE                                                     75020PARIS                                                                               0123456789                    SERVICE DE PROXIMITE                                                            000000020CLOCHETE@TISCALI.FR                                                                                                                                  
209999001706            140200000500001STORM                          CHRISTOPHE                      15041980                                    24 RUE DES FEES                                                             75001PARIS                                                                               0123456789                    SERVICE DE PROXIMITE                                                            000000030                                                                                                                                                      
900000540000010800000000268100000002500000
wyzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 15h12   #7
Expert Confirmé
 
Inscription : décembre 2007
Messages : 1 908
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 908
Points : 3 708
Points : 3 708
Ca pue le cobol, ça.....ou un équivalent. Malgré toutes ses qualités, VBA n'est pas aussi efficace que ces vieilleries pour traiter ce genre de fichiers. Tu ne pourras pas faire un simple import. Il va falloir coder un petit peu.....

Par contre, 2 questions avant de répondre sur une méthode.
1)Y-a-t-il des retours chariots?
2)Les lignes sont-elles de longueur identiques?(utile seulement si la réponse à la première question est non)

Si la réponse à la première question est oui, un bête "line input" et une lecture sur le premier caractère pour avoir le type d'enregistrement, et il ne reste plus qu'à découper avec la fonction mid pour coller dans des cellules.

Si la réponse à la première question est non, il faut coder un get. Si tout est à la même longueur, on règle le get sur la longueur donnée. Sinon, il faut lire caractère par caractère, s'adapter à la longueur, etc.....



Vu que c'est un .txt, je suppose que le line input suffira. A vérifier. Exemple tiré(et adapté) de l'aide de VBA :

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
 
Sub Import
Dim TextLine as String
Dim NumLine as Integer
Open "FICHTEST" For Input As #1    ' Ouvre le fichier.
Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
    NumLine = NumLine + 1
    Line Input #1, TextLine        ' Lit la ligne dans la variable.
    If Mid(TextLine, 1, 1) = "1" Then
        Call Decoupage1(TextLine, NumLine)
    End If
    If Mid(TextLine, 1, 1) = "1" Then
        Call Decoupage1(TextLine, NumLine)
    End If
    If Mid(TextLine, 1, 1) = "1" Then
        Call Decoupage1(TextLine, NumLine)
    End If
Loop
 
Close #1    ' Ferme le fichier.
End Sub
 
Sub Decoupage1(CutLine as String, NumLine as integer)
Cells(NumLine,1) = Mid(TextLine, 1, 1)
Cells(NumLine,2) = Mid(TextLine, 2, 5)
Cells(NumLine,3) = Mid(TextLine, 7, 32)
(.../...)
End Sub
pareil pour découpage2 et découpage3 que tu dois adapter à ta définition de données.







Mais si tu n'as pas de retours chariots, ça va être plus compliqué.....
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/10/2011, 17h06   #8
Membre régulier
 
Inscription : février 2007
Messages : 240
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2007
Messages : 240
Points : 78
Points : 78
Oui il y a des retour de chariots, et chaque ligne comme par un identificateur (1 pour l'en-tête, 2 pour les bénéficiaires, 9 pour la fin)

Visuellement c'est exactement comme l'exemple que j'ai mis dans mon message précédent

J'ai essayé d'adapté ton code mais j'ai le message d'erreur suivant :

Citation:
Erreur d'exécution '1004':

La méthode 'Cells' de l'objet '_Global' a échoué
C'est bon j'ai compris !!

Dès que j'ai terminé je posterais le code complet au cas où ça pourrait servir à quelqu'un
wyzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h07   #9
Membre régulier
 
Inscription : février 2007
Messages : 240
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2007
Messages : 240
Points : 78
Points : 78
Voilà :

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
Option Explicit
Option Base 1
 
Sub Mono_VN()
Application.ScreenUpdating = False
 
Dim TextLine As String
Dim i As Long, wb As Workbook
Dim OuvrirFichiers As Variant, dl As Long, tb(10000, 54) As Variant, tb2 As Variant
 
i = 0
 
OuvrirFichiers = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
 
If OuvrirFichiers = False Then
    Exit Sub
End If
 
Open OuvrirFichiers For Input As #1
 
Do While Not EOF(1)
    i = i + 1
    Line Input #1, TextLine
    If Mid(TextLine, 1, 1) = "1" Then 'en-tête
        tb(i, 1) = Mid(TextLine, 1, 1)
        tb(i, 2) = Mid(TextLine, 2, 5)
        tb(i, 3) = Mid(TextLine, 7, 32)
        tb(i, 4) = Mid(TextLine, 39, 8)
        tb(i, 5) = Mid(TextLine, 47, 1)
        tb(i, 6) = Mid(TextLine, 48, 30)
        tb(i, 7) = Mid(TextLine, 78, 20)
        tb(i, 8) = Mid(TextLine, 98, 2)
    End If
    If Mid(TextLine, 1, 1) = "2" Then 'ligne bénéficiaires
        tb(i, 1) = Mid(TextLine, 1, 1)
        tb(i, 2) = Mid(TextLine, 2, 5)
        tb(i, 3) = Mid(TextLine, 7, 3)
        tb(i, 4) = Mid(TextLine, 10, 15)
        tb(i, 5) = Mid(TextLine, 25, 2)
        tb(i, 6) = Mid(TextLine, 27, 5)
        tb(i, 7) = Mid(TextLine, 32, 5)
        tb(i, 8) = Mid(TextLine, 37, 2)
        tb(i, 9) = Mid(TextLine, 39, 1)
        tb(i, 10) = Mid(TextLine, 40, 32)
        tb(i, 11) = Mid(TextLine, 72, 32)
        tb(i, 12) = Mid(TextLine, 104, 8)
        tb(i, 13) = Mid(TextLine, 112, 4)
        tb(i, 14) = Mid(TextLine, 116, 1)
        tb(i, 15) = Mid(TextLine, 117, 4)
        tb(i, 16) = Mid(TextLine, 121, 27)
        tb(i, 17) = Mid(TextLine, 148, 38)
        tb(i, 18) = Mid(TextLine, 186, 38)
        tb(i, 19) = Mid(TextLine, 224, 5)
        tb(i, 20) = Mid(TextLine, 229, 32)
        tb(i, 21) = Mid(TextLine, 261, 5)
        tb(i, 22) = Mid(TextLine, 266, 32)
        tb(i, 23) = Mid(TextLine, 298, 15)
        tb(i, 24) = Mid(TextLine, 313, 15)
        tb(i, 25) = Mid(TextLine, 328, 15)
        tb(i, 26) = Mid(TextLine, 343, 40)
        tb(i, 27) = Mid(TextLine, 383, 40)
        tb(i, 28) = Mid(TextLine, 423, 4)
        tb(i, 29) = Mid(TextLine, 427, 5)
        tb(i, 30) = Mid(TextLine, 432, 150)
        tb(i, 31) = Mid(TextLine, 582, 1)
        tb(i, 32) = Mid(TextLine, 583, 32)
        tb(i, 33) = Mid(TextLine, 615, 32)
        tb(i, 34) = Mid(TextLine, 647, 4)
        tb(i, 35) = Mid(TextLine, 651, 1)
        tb(i, 36) = Mid(TextLine, 652, 4)
        tb(i, 37) = Mid(TextLine, 656, 27)
        tb(i, 38) = Mid(TextLine, 683, 38)
        tb(i, 39) = Mid(TextLine, 721, 38)
        tb(i, 40) = Mid(TextLine, 759, 5)
        tb(i, 41) = Mid(TextLine, 764, 32)
        tb(i, 42) = Mid(TextLine, 796, 5)
        tb(i, 43) = Mid(TextLine, 801, 5)
        tb(i, 44) = Mid(TextLine, 806, 11)
        tb(i, 45) = Mid(TextLine, 817, 2)
        tb(i, 46) = Mid(TextLine, 819, 50)
        tb(i, 47) = Mid(TextLine, 869, 50)
        tb(i, 48) = Mid(TextLine, 919, 34)
        tb(i, 49) = Mid(TextLine, 953, 8)
        tb(i, 50) = Mid(TextLine, 961, 8)
        tb(i, 51) = Mid(TextLine, 969, 1)
        tb(i, 52) = Mid(TextLine, 970, 6)
        tb(i, 53) = Mid(TextLine, 976, 20)
        tb(i, 54) = Mid(TextLine, 996, 20)
    End If
    If Mid(TextLine, 1, 1) = "9" Then 'dernière ligne
        tb(i, 1) = Mid(TextLine, 1, 1)
        tb(i, 2) = Mid(TextLine, 2, 7)
        tb(i, 3) = Mid(TextLine, 9, 11)
        tb(i, 4) = Mid(TextLine, 20, 11)
        tb(i, 5) = Mid(TextLine, 31, 7)
        tb(i, 6) = Mid(TextLine, 38, 5)
    End If
Loop
 
dl = i
ReDim tb2(dl, 54)
tb2 = tb
 
Close #1
 
Set wb = Workbooks.Add
 
With wb.Sheets("Feuil1")
    .Range("a1:bb" & dl).Value = tb2
    .Rows(1).Insert
    .Rows(1).Font.Bold = True
    .Range("a1").Value = "Code enregistrement"
    .Range("b1").Value = "Code client"
    .Range("c1").Value = "Raison sociale"
    .Range("d1").Value = "Date commande (JJMMAAAA)"
    .Range("e1").Value = "Exonération (O/N)"
    .Range("f1").Value = "Origine fichier"
    .Range("g1").Value = "Référence de commande externe"
    .Range("h1").Value = "Type de commande"
    .Rows(3).Insert
    .Rows(3).Font.Bold = True
    .Range("a3").Value = "Code enregistrement"
    .Range("b3").Value = "Code client"
    .Range("c3").Value = "Code point livraison"
    .Range("d3").Value = "Matricule salarié"
    .Range("e3").Value = "Nombre de chèques"
    .Range("f3").Value = "Valeur en centimes"
    .Range("g3").Value = "Part financeur en centimes"
    .Range("h3").Value = "Mois de fin de validité"
    .Range("i3").Value = "Civilité"
    .Range("j3").Value = "Nom du bénéficiaire"
    .Range("k3").Value = "Prénom du bénéficiaire"
    .Range("l3").Value = "Date de naissance (JJMMAAAA)"
    .Range("m3").Value = "N° de voie"
    .Range("n3").Value = "Lettre voie (B,T,Q)"
    .Range("o3").Value = "Type voie"
    .Range("p3").Value = "Nom voie"
    .Range("q3").Value = "Complément adresse"
    .Range("r3").Value = "Lieu dit"
    .Range("s3").Value = "Code postal"
    .Range("t3").Value = "Bureau distributeur"
    .Range("u3").Value = "Code INSEE"
    .Range("v3").Value = "Nom commune"
    .Range("w3").Value = "Téléphone portable"
    .Range("x3").Value = "Téléphone domicile"
    .Range("y3").Value = "Autre téléphone"
    .Range("z3").Value = "Mention"
    .Range("aa3").Value = "Zone d'utilisation"
    .Range("ab3").Value = "Famille d'utilisation"
    .Range("ac3").Value = "Rang d'enregistrement"
    .Range("ad3").Value = "Adresse mail"
    .Range("ae3").Value = "Civilité tuteur"
    .Range("af3").Value = "Nom tuteur"
    .Range("ag3").Value = "Prénom tuteur"
    .Range("ah3").Value = "N° voie tuteur"
    .Range("ai3").Value = "Lettre voie (B,T,Q) tuteur"
    .Range("aj3").Value = "Type voie tuteur"
    .Range("ak3").Value = "Nom voie tuteur"
    .Range("al3").Value = "Complément adresse tuteur"
    .Range("am3").Value = "Nom lieu dit tuteur"
    .Range("an3").Value = "Code postal tuteur"
    .Range("ao3").Value = "Bureau distributeur tuteur"
    .Range("ap3").Value = "Code banque"
    .Range("aq3").Value = "Code guichet"
    .Range("ar3").Value = "N° de compte"
    .Range("as3").Value = "Clé RIB"
    .Range("at3").Value = "Domiciliation bancaire"
    .Range("au3").Value = "Titulaire du compte"
    .Range("av3").Value = "IBAN"
    .Range("aw3").Value = "Date début de prise en charge"
    .Range("ax3").Value = "Date de fin de prise en charge"
    .Range("ay3").Value = "Titre dématérialisé (O/N)"
    .Range("az3").Value = "Mois de référence"
    .Range("ba3").Value = "Référence ligne commande externe"
    .Range("bb3").Value = "Identifiant externe"
    .Rows(dl + 2).Insert
    .Rows(dl + 2).Font.Bold = True
    .Range("a" & dl + 2).Value = "Code enregistrement"
    .Range("a" & dl + 2).Value = "Nombre de chèques"
    .Range("a" & dl + 2).Value = "Montant de la commande en centimes"
    .Range("a" & dl + 2).Value = "Montant subvention financeur en centimes"
    .Range("a" & dl + 2).Value = "Nombre d'enregistrement détail"
    .Range("a" & dl + 2).Value = "Taux de prestattion de service en centimes"
    .Columns.AutoFit
End With
 
Application.ScreenUpdating = True
End Sub
wyzer 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 03h42.


 
 
 
 
Partenaires

Hébergement Web