Macro pour Importer fichier txt spécifique [résolu] - VB/VBA/VBS - Programmation
Marsh Posté le 04-04-2013 à 17:00:28
Bonjour, LoL pour l'exemple ‼
Sinon le faire manuellement en utilisant l'enregistreur de macros, c'est pratique pour se donner une base de code …
Marsh Posté le 04-04-2013 à 17:03:38
Je l'ai fait, j'ai pu donc avancer un peu.
En fait j'aimerai supprimer des lignes soit vides soit contenant du texte.
Pour les lignes vides j'ai trouvé mais pas pour lignes contenant du texte
Marsh Posté le 04-04-2013 à 17:26:21
Sans voir de code, comment aider ? Sinon quel est le type des lignes à conserver ?
Marsh Posté le 04-04-2013 à 17:30:25
Voici un exemple du fichier txt que je veux importer :
-Entity ID--El. Pos. ID--Scalar Value-
125 0 12.000000
126 0 27.000000
127 0 25.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 6.000000
126 0 5.000000
127 0 8.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 10.000000
126 0 20.000000
127 0 6.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 15.000000
126 0 120.000000
127 0 66.000000
136 0 23.000000
140 0 33.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 63.000000
126 0 82.000000
127 0 9.000000
136 0 27.000000
140 0 32.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 99.000000
126 0 26.000000
127 0 134.000000
136 0 22.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 10.000000
126 0 20.000000
127 0 6.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 10.000000
126 0 20.000000
127 0 6.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 10.000000
126 0 20.000000
127 0 6.000000
136 0 3.000000
140 0 3.000000
Voici ce que j'aimerai obtenir :
ID--El. Pos. A B C
125 0 12.000000 15.000000 32.000000
126 0 27.000000 120.000000 562.000000
127 0 25.000000 66.000000 358.000000
136 0 3.000000 23.000000 27.000000
140 0 3.000000 33.000000 89.000000
125 0 6.000000 63.000000 66.000000
126 0 5.000000 82.000000 2.000000
127 0 8.000000 9.000000 123.000000
136 0 3.000000 27.000000 80.000000
140 0 3.000000 32.000000 2.000000
125 0 10.000000 99.000000 27.000000
126 0 20.000000 26.000000 244.000000
127 0 6.000000 134.000000 3.000000
136 0 3.000000 22.000000 46.000000
140 0 3.000000 3.000000 25.000000
Marsh Posté le 04-04-2013 à 17:31:44
J'ai utilisé ce code pour supprimer les lignes vides :
Sub TEST()
Dim LastLig As Long, i As Long, pp As Long, j As Long
Application.ScreenUpdating = False
With Worksheets("Feuil1" ) 'adapte le nom de ta feuille
LastLig = .UsedRange.Rows.Count + .UsedRange.Row - 1
For i = LastLig To 2 Step -1
If Application.CountA(.Rows(i)) = 0 Then .Rows(i).Delete
Next i
End With
Marsh Posté le 04-04-2013 à 17:43:45
ccadic a écrit : Voici ce que j'aimerai obtenir : |
Rien que cette première ligne 125, je ne vois pas bien la concordance avec le fichier,
comment arrives-tu à ce résultat (notamment les 32) ?
J'aimerais bien voir une logique claire et un lien si possible sur le fichier à importer …
Marsh Posté le 04-04-2013 à 17:49:37
A partir du fichier txt, il faut :
- Supprimer les premières lignes vides
- Supprimer la 1e colonne obtenue
- Supprimer les 3 lignes vides plus la ligne contenant (-Entity ID...) entre chaque mini tableau
Après avoir fait cela sur les 3 premiers mini tableau, on obtient la colonne A.
On refait ça pour avoir B, et là on copie la colonne de chiffre obtenue puis on la colle à coté de la colonne A et pareil pour C.
Marsh Posté le 04-04-2013 à 17:50:39
Voila ce que donne l'enregistrement :
Sub Macro1()
'
' Macro1 Macro
'
'
Rows("1:8" ).Select
Selection.Delete Shift:=xlUp
Columns("A:A" ).Select
Selection.Delete Shift:=xlToLeft
Rows("7:10" ).Select
Selection.Delete Shift:=xlUp
Rows("12:15" ).Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=15
Rows("31:34" ).Select
Selection.Delete Shift:=xlUp
Rows("36:39" ).Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=27
Rows("55:58" ).Select
Selection.Delete Shift:=xlUp
Rows("60:63" ).Select
Selection.Delete Shift:=xlUp
ActiveWindow.SmallScroll Down:=-21
Range("C26:C40" ).Select
Selection.Copy
ActiveWindow.SmallScroll Down:=-24
Range("D2" ).Select
ActiveSheet.Paste
ActiveWindow.SmallScroll Down:=33
Range("C50:C64" ).Select
Application.CutCopyMode = False
Selection.Copy
ActiveWindow.SmallScroll Down:=-42
Range("E2" ).Select
ActiveSheet.Paste
Range("C1" ).Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "A"
Range("D1" ).Select
ActiveCell.FormulaR1C1 = "B"
Range("E1" ).Select
ActiveCell.FormulaR1C1 = "C"
Range("A20:E84" ).Select
Selection.ClearContents
Range("A19" ).Select
ActiveWindow.SmallScroll Down:=-18
End Sub
Marsh Posté le 04-04-2013 à 19:08:44
Marc L a écrit : Rien que cette première ligne 125, je ne vois pas bien la concordance avec le fichier, |
Toujours pas eu d'explication sur ce 32 d'où peut-il bien sortir à part d'un chapeau magique ‼
Si ton code généré par l'enregistreur de macros fonctionne, c'est réglé.
Sinon je préfère traiter les données en amont et n'inscrire dans la feuille que le résultat final attendu, plus simple, efficace et rapide …
Pour l'instant, bloquant dès ta première ligne à cause du 32, je retiens qu'il ne faut conserver que les lignes avec des nombres …
Marsh Posté le 05-04-2013 à 09:45:00
Pour le moment j'arrive à supprimer les lignes vides et maintenant j'aimerai supprimer certaines lignes avec du texte.
Marsh Posté le 05-04-2013 à 10:04:03
Y avait une erreur dans le fichier txt :
-Entity ID--El. Pos. ID--Scalar Value-
125 0 12.000000
126 0 27.000000
127 0 25.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 6.000000
126 0 5.000000
127 0 8.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 10.000000
126 0 20.000000
127 0 6.000000
136 0 3.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 15.000000
126 0 120.000000
127 0 66.000000
136 0 23.000000
140 0 33.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 63.000000
126 0 82.000000
127 0 9.000000
136 0 27.000000
140 0 32.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 99.000000
126 0 26.000000
127 0 134.000000
136 0 22.000000
140 0 3.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 32.000000
126 0 562.000000
127 0 358.000000
136 0 27.000000
140 0 89.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 66.000000
126 0 2.000000
127 0 123.000000
136 0 80.000000
140 0 2.000000
-Entity ID--El. Pos. ID--Scalar Value-
125 0 27.000000
126 0 244.000000
127 0 3.000000
136 0 46.000000
140 0 25.000000
Il était là le 32, etc...
Marsh Posté le 05-04-2013 à 10:04:54
Le souci c'est que le nombre le ligne de donnée dans un mini-tableau peut varier...
Marsh Posté le 05-04-2013 à 12:48:35
Sauf que pour la première ligne avec ton dernier fichier j'obtiens ceci :
125 0 12.000000 6.000000 10.000000 |
Avec une autre procédure regroupant sur les valeurs des deux premières colonnes, il y a un 32 mais dans la dernière série :
125 0 12.000000 6.000000 10.000000 15.000000 63.000000 99.000000 32.000000 66.000000 27.000000 |
Alors, où est la logique ?‼
ccadic a écrit : Pour le moment j'arrive à supprimer les lignes vides et maintenant j'aimerai supprimer certaines lignes avec du texte. |
Il n'a pas compris !
Marc L a écrit : Sinon je préfère traiter les données en amont et n'inscrire dans la feuille que le résultat final attendu |
Donc en procédant ainsi, il n'y a rien à supprimer ‼
Exemple :
Code :
|
Vu ?
Au passage, cela résout donc ton problème de code "pourri" d'importation que tu as posté hier sur VB France !
Je remarque que tu as été aussi peu clair, c'est pour cela qu'ils ne t'ont pas répondu …
Aide primaire : curseur sur une instruction puis touche F1 …
Marsh Posté le 05-04-2013 à 13:34:41
Merci, j'ai réussi à faire qqch qui me convient bien et qui fonctionne.
Toutefois, j'aimerai avoir une boucle sur mon importation de fichier. Pour le moment je fais ça :
'Importer le fichier txt
ChDir "C:\Users\stagiaire\Documents\EXCEL"
Workbooks.OpenText Filename:="C:\Users\stagiaire\Documents\EXCEL\INSERT-FORCES-GP01.txt", _
Origin:=xlMSDOS, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=True, _
Tab:=False, _
Semicolon:=False, _
Comma:=False, _
Space:=True, _
Other:=False, _
FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True
Mais j'aimerai ne pas avoir à nommer le nom de mon fichier mais plutôt importer chaque fichier txt dans un fichier excel différent, est-ce possible !?
Marsh Posté le 05-04-2013 à 13:43:37
Tout est quasi possible … (voir l'aide de la fonction Dir)
Mais là ce n'est plus le sujet de départ, celui-ci est donc clos !
Marsh Posté le 06-04-2013 à 13:30:05
ccadic a écrit : Merci, j'ai réussi à faire qqch qui me convient bien et qui fonctionne. |
En fait tu n'as rien fait, c'est seulement du code généré par l'enregistreur de macros !
Si tu persistes à utiliser cette méthode OpenText, ce serait bien de corriger ses paramètres
(certains sont erronés, d'autres n'ont pas lieu d'être),
notamment concernant la structure du fichier à importer dans FieldInfo
car seules les colonnes 2 à 4 ont besoin d'être importées …
Voir l'exemple en développant XlColumnDataType dans FieldInfo dans l'aide de la méthode OpenText …
Marsh Posté le 04-04-2013 à 14:35:33
Bonjour à tous,
En fait, j'aimerai importer un fichier txt sous excel pour un type de fichier délimité par des séparateurs espaces.
Je pense que c'est assez simple mais je ne connais pas la commande pour le type de fichier et le type de séparateur.
Je vous ai mis un exemple de ce que j'aimerai obtenir.
Je vous remercie d'avance.
Message édité par ccadic le 05-04-2013 à 13:46:15