XL 2010 Importer .txt sur feuille Excel

thunder23

XLDnaute Occasionnel
Bonjour le forum,

Je souhaite importer les données d'un fichier en format texte sur une feuille Excel mais par VBA et avec la même mise en forme que dans le fichier .txt .
Un exemple est disponible en pièce jointe

Merci pour commentaires :)
 

Pièces jointes

  • testimport.xlsx
    433.3 KB · Affichages: 34

thunder23

XLDnaute Occasionnel
Bonjour le fil, thunder23, job75, patricktoulon

•>thunder23

C'est une blague ? ;)
Précédemment , tu m'as demandé comme effacer les noms qui apparaissant automatiquement en utilisant QueryTables...:rolleyes:

Bonjour Stapple1600,

Oui effectivement car ça me créer une nouvelle plage et me décalait celles déjà en place.
J'ai mis en pièce-jointe comment ça me fait lors de ton premier message ;)
 

Pièces jointes

  • decalage.docx
    189.4 KB · Affichages: 2

Staple1600

XLDnaute Barbatruc
Re

Cela donne quoi avec ces modifs?
NB: Sur la feuille d'import, il faut qu'il y ait déjà les entêtes des colonnes préalablement saisies
VB:
Sub Macro1_Quatro()
Dim typeCol, Chemin$
Application.ScreenUpdating = False
Chemin = "C:\Users\STAPLE\Documents\bdd.txt"
typeCol = Array(4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Chemin, Destination:=Cells(Rows.Count, 1).End(3)(2))
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshStyle = xlInsertDeleteCells
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePlatform = 850
        .TextFileStartRow = 4
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileTabDelimiter = True
        .TextFileColumnDataTypes = typeCol
        .TextFileDecimalSeparator = "."
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With
End Sub
Si tu lances plusieurs fois de suite, la macro tu verras que les données se mettent en dessous à chaque fois.
(et qu'il n'y a toujours pas de noms qui s'ajoutent dans le gestionnaire)
 

thunder23

XLDnaute Occasionnel
Re

Cela donne quoi avec ces modifs?
NB: Sur la feuille d'import, il faut qu'il y ait déjà les entêtes des colonnes préalablement saisies
VB:
Sub Macro1_Quatro()
Dim typeCol, Chemin$
Application.ScreenUpdating = False
Chemin = "C:\Users\STAPLE\Documents\bdd.txt"
typeCol = Array(4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & Chemin, Destination:=Cells(Rows.Count, 1).End(3)(2))
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshStyle = xlInsertDeleteCells
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePlatform = 850
        .TextFileStartRow = 4
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileTabDelimiter = True
        .TextFileColumnDataTypes = typeCol
        .TextFileDecimalSeparator = "."
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With
End Sub
Si tu lances plusieurs fois de suite, la macro tu verras que les données se mettent en dessous à chaque fois.
(et qu'il n'y a toujours pas de noms qui s'ajoutent dans le gestionnaire)


Re,

Là c'est nickel par ailleurs je peux remplacer ActiveSheet par un nom de feuille?
 

patricktoulon

XLDnaute Barbatruc
bonjour thunder
je persiste avec mon idée qui comparée a querytable est 4 fois plus rapide avec tes 14000 lignes
j'ai rectifié aussi le problème de date
dans cet exemple si dessous je ne garde que la colonne 1 3 et 6
VB:
Sub test()
    Dim tout As String, x, fichier As String
    Columns("A:A").NumberFormat = "mm/dd/yyyy"
    Cells.ClearContents
    fichier = "C:\Users\polux\DeskTop\bdd.txt"
    x = FreeFile: Open fichier For Binary Access Read As #x: tout = String(LOF(x), " "): Get #x, , tout: Close #x
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText tout: .PutInClipboard: End With
    With ActiveSheet: .Cells(1).Select: .Paste: End With
    tbl = Application.Index([A1].CurrentRegion.Value, Evaluate("ROW(" & 1 & ":" & [A1].CurrentRegion.Rows.Count & ")"), Array(1, 3, 6))
    Cells.ClearContents
    Columns("A:A").NumberFormat = "m/d/yyyy"
    Cells(1).Resize(UBound(tbl), UBound(tbl, 2)) = tbl
End Sub

démonstration

demo4.gif
 

thunder23

XLDnaute Occasionnel
bonjour thunder
je persiste avec mon idée qui comparée a querytable est 4 fois plus rapide avec tes 14000 lignes
j'ai rectifié aussi le problème de date
dans cet exemple si dessous je ne garde que la colonne 1 3 et 6
VB:
Sub test()
    Dim tout As String, x, fichier As String
    Columns("A:A").NumberFormat = "mm/dd/yyyy"
    Cells.ClearContents
    fichier = "C:\Users\polux\DeskTop\bdd.txt"
    x = FreeFile: Open fichier For Binary Access Read As #x: tout = String(LOF(x), " "): Get #x, , tout: Close #x
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText tout: .PutInClipboard: End With
    With ActiveSheet: .Cells(1).Select: .Paste: End With
    tbl = Application.Index([A1].CurrentRegion.Value, Evaluate("ROW(" & 1 & ":" & [A1].CurrentRegion.Rows.Count & ")"), Array(1, 3, 6))
    Cells.ClearContents
    Columns("A:A").NumberFormat = "m/d/yyyy"
    Cells(1).Resize(UBound(tbl), UBound(tbl, 2)) = tbl
End Sub

démonstration

Regarde la pièce jointe 1063762

Re,

D'accord ok, je t'ai mis en pièce jointe un exemple d'importation de données que je suis susceptible d'avoir, les deux exemples sont sur 2 feuilles différentes

Cdlt
 

Pièces jointes

  • importation.xlsx
    849.3 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
si je comprends bien se sont les colonnes jaunes que tu veux récupérer
donc j'ai réaménagé le code dans un bloc with comme ca ce sera plus intelligible

VB:
Sub test()
    Dim tout As String, x, fichier As String
    fichier = "C:\Users\polux\DeskTop\bdd.txt"
    x = FreeFile: Open fichier For Binary Access Read As #x: tout = String(LOF(x), " "): Get #x, , tout: Close #x
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText tout: .PutInClipboard: End With
    With ActiveSheet.Cells(1, 1)
        .CurrentRegion.ClearContents
        .EntireColumn.NumberFormat = "mm/dd/yyyy"
        .Select
        ActiveSheet.Paste
        tbl = Application.Index(.CurrentRegion.Value, Evaluate("ROW(" & 1 & ":" & .CurrentRegion.Rows.Count & ")"), Array(1, 2, 3, 8, 9, 11, 17, 18, 19))
        .CurrentRegion.ClearContents
        .EntireColumn.NumberFormat = "m/d/yyyy"
        .Resize(UBound(tbl), UBound(tbl, 2)) = tbl
    End With


End Sub
moins d'une seconde pour ta base de + de 14000 lignes
je te met au défit d'avoir un résultat aussi rapide avec querytables voir même ADO que j'ai testé aussi
voila
:);)
démonstration
demo4.gif
 

thunder23

XLDnaute Occasionnel
non je n'ai pas regardé je viens de le faire
et bien teste sur ta base de 53000 lignes
sache une chose aussi
c'est que l'array peut être mis dans l'ordre que tu veux ;)

Oui je suis en train de le mettre dans le fichier final. Ok mais en fait c'est à partir de la colonne L que ça peut-être modifié de plus le fichier sera partagé et je voudrais juste savoir si par un UserForm il est possible gérer l'Array?
 

patricktoulon

XLDnaute Barbatruc
allez en avant guingand
VB:
Sub test()
   Dim tout As String, x, fichier As String, tbl,x$,colonnes
    x = InputBox("tapez les numero de colonnes séparée par une virgule", "liste des colonnes")
    If x <> "" Then colonnes = Split(x, ",")
     fichier = "C:\Users\polux\DeskTop\bdd.txt"
    x = FreeFile: Open fichier For Binary Access Read As #x: tout = String(LOF(x), " "): Get #x, , tout: Close #x
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"): .SetText tout: .PutInClipboard: End With
    With ActiveSheet.Cells(1, 1)
        .CurrentRegion.ClearContents
        .EntireColumn.NumberFormat = "mm/dd/yyyy"
        .Select
        ActiveSheet.Paste
        tbl = Application.Index(.CurrentRegion.Value, Evaluate("ROW(" & 1 & ":" & .CurrentRegion.Rows.Count & ")"), colonnes)
        .CurrentRegion.ClearContents
        .EntireColumn.NumberFormat = "m/d/yyyy"
        .Resize(UBound(tbl), UBound(tbl, 2)) = tbl
    End With


End Sub
démonstration su un exemplaire de 53000 ligne
demo4.gif
 

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 266
Membres
103 501
dernier inscrit
talebafia