Macro pour Importer fichier txt spécifique [résolu]

Macro pour Importer fichier txt spécifique [résolu] - VB/VBA/VBS - Programmation

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
Reply

Marsh Posté le 04-04-2013 à 14:35:33   

Reply

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 …
 

Reply

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

Reply

Marsh Posté le 04-04-2013 à 17:26:21    

 
           Sans voir de code, comment aider ?       Sinon quel est le type des lignes à conserver ?
 

Reply

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

Reply

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

Reply

Marsh Posté le 04-04-2013 à 17:43:45    

ccadic a écrit :

Voici ce que j'aimerai obtenir :  
ID--El. Pos. A B C
125 0 12.000000 15.000000 32.000000

            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 …
 

Reply

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.

Reply

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


Message édité par ccadic le 04-04-2013 à 17:53:42
Reply

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,
comment arrives-tu à ce résultat (notamment les 32) ?

            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 …
 

Reply

Marsh Posté le 04-04-2013 à 19:08:44   

Reply

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.

Reply

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...

Reply

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...

Reply

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 :
  1. Sub ImportSimple()
  2.     N = FreeFile
  3.     Open "D:\Tests\ccadic.txt" For Input As #N
  4.     L = Split(Input(LOF(N), #N), vbCrLf)
  5.     Close #N
  6.     Set N = ActiveSheet.UsedRange
  7.     Range([A2], N(N.Count)).ClearContents
  8.     R = 1
  9.  
  10.     For Each N In L
  11.         If Val(N) > 0 Then
  12.             R = R + 1
  13.             S = Split(Application.WorksheetFunction.Trim(N))
  14.             Cells(R, 1).Resize(, UBound(S) + 1) = S
  15.         End If
  16.     Next
  17. End Sub

           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 …
 

Reply

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 !?

Reply

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 !
 

Reply

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  …
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed