Importer un fichier texte dans Excel

Bonjour,

J'essaie d'importer un fichier texte de 16 000 lignes par 9 colonnes (délimitées par un espacement) dans Excel...

La macro que j'utilise fonctionne, mais elle est lente car elle lit ligne par ligne.

Dim WordArray() As String
Dim RL As TextStream
Dim Line As String
Dim Column As Long
Dim Row As Long
Dim Word As Variant

Set RL = FSO.OpenTextFile("C:\Users\Frédérik\Desktop\RL.txt")

Row = 4
Column = 2

Do Until RL.AtEndOfStream
  Line = RL.ReadLine
  Column = 2
  WordArray() = Split(Line, " ")
  For Each Word In WordArray()
    Worksheets(SheetName).Cells(Row, Column) = Word
    Column = Column + 1
  Next Word
  Row = Row + 1
Loop

RL.Close

J'aimerais plutôt savoir s'il existe une commande qui permet de faire l'équivalent d'un Ctrl-A , Ctrl-C dans un fichier texte puis Ctrl-V dans Excel.

Merci pour vos réponses,

Frédérik

Bonjour Frédérik,

À part les lignes de Dim, voici ton code VBA modifié :

  Set RL = FSO.OpenTextFile("C:\Users\Frédérik\Desktop\RL.txt")

  Row = 4: Column = 2: Application.ScreenUpdating = False

  With Worksheets(SheetName)

    Do Until RL.AtEndOfStream
      Line = RL.ReadLine
      Column = 2: WordArray() = Split(Line, " ")
      For Each Word In WordArray()
        .Cells(Row, Column) = Word: Column = Column + 1
      Next Word
      Row = Row + 1      
    Loop

  End With

  RL.Close

  Application.ScreenUpdating = True

⚠ Ta variable SheetName n'est pas déclarée et n'a pas de valeur !

tu t'en serais aperçu avec Option Explicit en début de module !

tu dois régler ce problème avant d'exécuter le code VBA !

Cordialement

Bonjour dhany,

1) Oui en effet j'utilise déjà Application.ScreenUpdating (j'ai posté ici le code que j'utilise pour l'importation - qui provient d'un module particulier - mais j'appelle ce module ailleurs dans une macro globale où est placé le Application.ScreenUpdating). Et malheureusement ça ne réduit presque pas le temps de calcul. Peut-être 1-2 secondes sur 30.

2) J'utilise également Option Explicit et la variable SheetName est définie ailleurs également. Le tout fonctionne ce n'est pas le problème...le problème est l'optimisation.

3) Il ne faut pas enlever le column = 2 dans la boucle, car chaque ligne doit être importée dans les colonnes B à K ...si j'enlève le column = 2 dans la boucle, la 1ère ligne de mots se retrouvera dans les colonnes B à K, la 2e ligne dansles colonnes L à U, la 3e V à ... etc.

Merci quand même,

Frédérik

Pour le 3), après avoir validé mon message, j'ai compris que Column = 2 est obligatoire dans la boucle Do, c'est pourquoi j'ai modifié mon message et enlevé la remarque correspondante (nos messages à ce sujet se sont croisés).

Mais regarde le With Worksheets(SheetName) en dehors de la boucle Do, qui est utilisé par le .Cells() de For .. Next : est-ce que ça n'améliore pas un peu la vitesse ? car ça n'a plus besoin de chercher à chaque fois quelle est la feuille concernée.

À part ça, je n'ai pas d'autre idée, mais un autre intervenant aura sûrement mieux à te proposer, donc continue de surveiller les futures réponses.

Oui c'est un peu mieux je sauve quelques secondes...malheureusement peu sur 1 minute. Je crois que ma boucle est utile pour de petits fichiers textes...mais pour plus de 100 000 données à importer ce n'est pas adéquat.

Espérons que quelqu'un ait une meilleure idée.

Merci,

Frédérik

Bonjour,

Essaye ce code, basé sur 2 de mes fonctions génériques réutilisables dans d'autres projets

Option Explicit

Sub lire()
Dim T As Variant

    T = Tinit("C:\Users\Frédérik\Desktop\RL.txt", " ")
    ActiveSheet.Range("A1").Resize(UBound(T, 1)+1, UBound(T, 2)+1) = T
End Sub

' ***** Code PierreP56 ****************************************************************************
Function Tinit(Ndf As String, Delim As String) As Variant
Dim Txt As String
Dim T As Variant, T1 As Variant, T2 As Variant
Dim lg As Long, i As Long, j As Long

    Txt = Lire_Txt(Ndf)
    T1 = Split(Txt, vbCrLf)
    T2 = Split(T1(0), Delim)
    lg = UBound(T1)
    ReDim T(lg, UBound(T2))
    For i = 0 To lg
        T2 = Split(T1(i), Delim)
        For j = 0 To UBound(T2) 
            T(i, j) = T2(j)
        Next j
    Next i
    Tinit = T
End Function

Function Lire_Txt(Ndf As String) As String
Dim f As Integer

    On Error GoTo errhdlr:
    f = FreeFile()
    Open Ndf For Binary Access Read As #f
    Lire_Txt = Space$(LOF(f))
    Get #f, , Lire_Txt
    Close #f
    Exit Function

errhdlr:
    Close #f
    Lire_Txt = ""
End Function

Bonjour Pierre,

J'obtiens "erreur d'execution 9 l'indice n'appartient pas à la selection" à cette ligne :

T2 = Split(T1(0), Delim)

Je ne comprends pas pourquoi...

Merci,

Frédérik

Bonjour,

Est-ce que ton fichier texte commence par une ou plusieurs lignes vides?

Si c'est le cas, il suffit de remplacer le zéro par la première ligne significative :

par exemple : T2 = Split(T1(1), Delim)

nb : 1 étant ici la 2ème ligne du txt (le comptage commence par 0)

Tu peux aussi écrire

Function Tinit(Ndf As String, Delim As String) As Variant
Dim Txt As String
Dim T As Variant, T1 As Variant, T2 As Variant
Dim lg As Long, i As Long, j As Long

    On Error Resume Next
    Txt = Lire_Txt(Ndf)
    T1 = Split(Txt, vbCrLf)
    'T2 = Split(T1(0), Delim)
    lg = UBound(T1)
    ReDim T(lg, 10)
    For i = 0 To lg
        T2 = Split(T1(i), Delim)
        For j = 0 To 10
            T(i, j) = T2(j)
        Next j
    Next i
    Tinit = T
End Function

Bonjour,

Mon fichier texte débute bien à la 1ère ligne.

J'ai essayé votre code avec On Error Resume Next et j'obtiens :

"Erreur d'exécution '13' : Incompatibilité de type"

à la ligne :

ActiveSheet.Range("A1").Resize(UBound(T, 1) + 1, UBound(T, 2) + 1) = T

La variable "T" ne se remplie pas dans la fonction Tinit lorsque je regarde les variables locales avec le pas-à-pas.

Merci pour votre aide,

Frédérik

Il n'y a pas uniquement que le "on error ..." comme modif.

Si ton "RL.txt" est structuré en 9 colonnes délimitées par un espace, le code précédent devrait être fonctionnel.

Dans le cas contraire, il serait utile de poster un extrait (anonymisé, de quelques lignes) de ton "RL.txt"

Oui en effet j'ai copié/collé tout votre code. Je l'ai seulement appelé "On Error Resume Next" pour le décrire disons.

Voici un extrait du fichier textes (10 colonnes après révisions)

0.001 -650.531 566249 52.7184 5230.72 -256916 1.24467e+006 2545.01 -30195.8 13.8607
0.002 -669.054 562321 -23.1664 7347.63 -252985 1.41617e+006 2631.01 -41557.7 122.449
0.003 -545.343 632685 -20.5425 9118.29 -323354 854865 2521.79 -53251.9 153.303
0.004 -491.349 638229 -3.75226 10825.2 -328893 567679 2378.89 -55825.3 40.2652
0.005 -460.59 624384 -4.39435 12478.6 -315039 483164 2250.7 -54004.2 -46.5768
0.006 -436.991 610269 -3.98724 14030 -300918 506077 2141.99 -51365.5 -76.7254
0.007 -415.001 604855 -24.1695 15424.5 -295506 568317 2051.47 -48640.1 -77.1949
0.008 -399.543 602586 -49.4258 16629.9 -293244 657912 1970.76 -46174.9 -67.8428
0.009 -388.011 603192 -66.8111 17623.1 -293860 760033 1896.34 -43644.5 -56.2396
0.01 -381.401 603333 -79.699 18393.5 -294012 875942 1823.97 -41128.8 -44.1051
0.011 -376.649 604074 -84.8601 18932.1 -294765 997882 1753.08 -38426.7 -30.3148
0.012 -374.601 603823 -94.3664 19237.2 -294527 1.1273e+006 1682.12 -35639.6 -15.1207
0.013 -373.229 603681 -99.3162 19307 -294399 1.25863e+006 1611.57 -32695 2.29548
0.014 -373.457 602764 -110.869 19145.8 -293495 1.39235e+006 1540.92 -29726.5 20.3501
0.015 -373.805 602028 -115.747 18758 -292771 1.52383e+006 1470.91 -26734.8 38.8309
0.016 -375.101 600913 -124.334 18153.2 -291666 1.65286e+006 1401.46 -23837.9 55.666
0.017 -376.243 600118 -123.747 17341.9 -290879 1.77571e+006 1333.27 -21045.3 70.5988
0.018 -377.968 599197 -124.931 16339 -289964 1.89198e+006 1266.38 -18438.5 82.0382
0.019 -379.44 598629 -116.958 15160.1 -289400 1.99877e+006 1201.36 -16023 90.0615
0.02 -381.268 598056 -110.361 13824.7 -288827 2.09572e+006 1138.27 -13855.5 93.6692
0.021 -382.79 597820 -95.8738 12346.2 -288588 2.18064e+006 1072.48 -11941.4 93.2283
0.022 -384.503 597633 -83.0539 10753.9 -288394 2.2533e+006 1009.11 -10320.7 88.3117
0.023 -385.895 597736 -64.3728 9070.73 -288488 2.31218e+006 948.435 -8995.82 79.6057
0.024 -387.401 597884 -48.3907 7321.5 -288625 2.35732e+006 890.436 -7990.64 67.2495
0.025 -388.648 598242 -29.1035 5530.49 -288968 2.38787e+006 835.258 -7300.77 52.2181
0.026 -390.018 598597 -13.7339 3723.14 -289306 2.40419e+006 782.789 -6935.2 35.0488
0.027 -391.227 599062 2.81519 1923.77 -289753 2.40595e+006 733.053 -6882.19 16.8235
0.028 -392.59 599460 14.9522 157.091 -290133 2.39388e+006 685.851 -7138.84 -1.74979
0.029 -393.875 599883 27.2326 -1553.91 -290536 2.36813e+006 641.093 -7687.34 -19.7409

Ça continue ainsi jusqu'à 15.000

Merci,

Frédérik

Avec cet extrait du Rl.txt, le code proposé est parfaitement fonctionnel sur mon PC.

Pour tester, les 2 fichiers de l'archive sont à dézipper dans "Mes Documents"

16lire-txt.zip (17.52 Ko)

Rebonjour,

Encore l'erreur d'exécution 13 : erreur de compatibilité de type .

à la même ligne :

ActiveSheet.Range("A1").Resize(UBound(T, 1) + 1, UBound(T, 2) + 1) = T

J'ai dézippé le fichier dans "Mes documents".

Est-ce que je dois activer une référence particulière en VBA?

Merci,

Frédérik

Bonjour,

J'ai trouvé qu'il était finalement plus simple d'ouvrir le fichier texte dans Excel, de manipuler les données, puis de refermer le fichier Excel.

Voici ce que ça donne. L'exécution est beaucoup plus rapide.

'Ouvrir le fichier texte
    Workbooks.OpenText Filename:="C:\Users\Frédérick\Desktop\RL.out", Origin:= _
    xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote _
    , ConsecutiveDelimiter:=True, Tab:=True, Semicolon:=False, Comma:=False _
    , Space:=True, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), Array _
    (3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array( _
    10, 1)), TrailingMinusNumbers:=True

'Transférer les données
    Windows("RL.out").Activate
    Range("A1").CurrentRegion.Cut Workbooks("VBA"). _
        Worksheets(SheetName).Range("B4")

'Fermer le fichier texte
    Windows("RL.out").Activate
    ActiveWindow.Close

Merci pour votre aide!

Frédérik

Rechercher des sujets similaires à "importer fichier texte"