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

Staple1600

XLDnaute Barbatruc
Re

Je te laisse chercher ce que j'ai ajouté et ce que cela change ;)
VB:
Sub Macro1_Ter()
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(1))
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshStyle = xlInsertDeleteCells
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileTabDelimiter = True
        .TextFileColumnDataTypes = typeCol
        .TextFileDecimalSeparator = "."
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With
End Sub
 

thunder23

XLDnaute Occasionnel
Re

Je te laisse chercher ce que j'ai ajouté et ce que cela change ;)
VB:
Sub Macro1_Ter()
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(1))
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshStyle = xlInsertDeleteCells
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileTabDelimiter = True
        .TextFileColumnDataTypes = typeCol
        .TextFileDecimalSeparator = "."
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With
End Sub


Re,

C'est bon j'ai trouvé mais pour un seul j'ai du comparé mais c'est nickel ^^
Encore merci beaucoup ;)

Cdlt
 

job75

XLDnaute Barbatruc
Bonsoir thunder23, JM,

Pas trop compris ni essayé de comprendre ce qu'à fait JM mais bon voyez ceci :
VB:
Sub Importer()
Application.ScreenUpdating = False
Workbooks.OpenText ThisWorkbook.Path & "\Source.txt", Local:=True
ActiveSheet.UsedRange.Copy ThisWorkbook.Sheets(1).[A1] 'copier-coller
ActiveWorkbook.Close
Sheets(1).UsedRange.Replace ".", ".", xlPart 'remplace le point par... le point
End Sub
Fichiers zippés joints à télécharger dans le même dossier (le bureau).

A+
 

Pièces jointes

  • Dossier.zip
    361.3 KB · Affichages: 12

job75

XLDnaute Barbatruc
Bonjour thunder23, JM, le forum,

Workbooks.OpenText permet de préciser le séparateur décimal du fichier texte :
VB:
Sub Importer()
Application.ScreenUpdating = False
Workbooks.OpenText ThisWorkbook.Path & "\bdd.txt", Local:=True, DecimalSeparator:="."
ActiveSheet.UsedRange.Copy ThisWorkbook.Sheets(1).[A1] 'copier-coller
ActiveWorkbook.Close
End Sub
Dossier (2).

A+
 

Pièces jointes

  • Dossier(2).zip
    806.9 KB · Affichages: 4

Staple1600

XLDnaute Barbatruc
Bonjour le fil, thunder23, job75

job75 à dit:
permet de préciser le séparateur décimal du fichier texte
QueryTable aussi
.TextFileDecimalSeparator = "."

J'ai utilisé Données/Fichiers Texte par c'est ce qu'il y a (à mon sens) de plus simple (*)
Re,

Oui je sais mais je ne serais sans doute pas le seul à avoir ce fichier, c'est que je voudrais qu'il soit le plus simple possible ;)
D'ailleurs, on pourrait faire l'import manuellement pour aller dans ce sens.
(L'autre avantage, c'est que la requête est actualisable: Données/Actualiser tout)
 
Dernière édition:

job75

XLDnaute Barbatruc
Une 3ème solution avec lecture séquentielle du fichier texte (très rapide) et commande Convertir :
VB:
Sub Importer()
Dim texte$, s$, n&, a$(), b$()
Open ThisWorkbook.Path & "\bdd.txt" For Input As #1 'accès au fichier
Do While Not EOF(1) 'EndOfFile: fin du fichier
    Line Input #1, texte 'récupère la ligne
    s = Split(texte, vbTab)(0) 'item de la 1ère colonne
    texte = Format(s, "m/d/yyyy") & Mid(texte, Len(s) + 1) 'date au format US en 1ère colonne
    ReDim Preserve a(n) 'tableau VBA, base 0
    a(n) = texte 'stocke le texte dans le tableau a
    n = n + 1
Loop
Close #1
ReDim b(UBound(a), 0) 'base 0
For n = 0 To UBound(a)
    b(n, 0) = a(n) 'transposition
Next
Application.ScreenUpdating = False
With [A1].Resize(n)
    .Value = b 'restitution
    .TextToColumns .Cells(1), xlDelimited, Tab:=True, DecimalSeparator:="." 'commande Convertir
End With
Columns.AutoFit
End Sub
A+
 

Pièces jointes

  • Dossier(3).zip
    809.7 KB · Affichages: 9

thunder23

XLDnaute Occasionnel
Bonsoir thunder23, JM,

Pas trop compris ni essayé de comprendre ce qu'à fait JM mais bon voyez ceci :
VB:
Sub Importer()
Application.ScreenUpdating = False
Workbooks.OpenText ThisWorkbook.Path & "\Source.txt", Local:=True
ActiveSheet.UsedRange.Copy ThisWorkbook.Sheets(1).[A1] 'copier-coller
ActiveWorkbook.Close
Sheets(1).UsedRange.Replace ".", ".", xlPart 'remplace le point par... le point
End Sub
Fichiers zippés joints à télécharger dans le même dossier (le bureau).

A+

Bonjour Job75,

Est-ce qu'il est possible que dans ton code il peut-être rajouté deux conditions, si par exemple A1 n'est pas vide de mettre à la première ligne vide et pour le chemin du fichier de laisser choisir l'utilisateur
VB:
Application.GetOpenFilename("Text Files (*.txt), *.txt", , "Sélectionnez un fichier")

A+
 

job75

XLDnaute Barbatruc
Bonjour thunder23, JM,

si par exemple A1 n'est pas vide de mettre à la première ligne vide
Pas clair du tout, mettre quoi à la 1ère ligne vide ?

Pour choisir le fichier avec la méthode de mon post #23 :
VB:
Sub Importer()
Dim fichier As Variant, texte$, s$, n&, a$(), b$()
ChDir ThisWorkbook.Path 'dossier initial
fichier = Application.GetOpenFilename("Fichiers textes,*.txt")
If fichier = False Then Exit Sub
Open fichier For Input As #1 'accès au fichier
Do While Not EOF(1) 'EndOfFile: fin du fichier
    Line Input #1, texte 'récupère la ligne
    s = Split(texte, vbTab)(0) 'item de la 1ère colonne
    texte = Format(s, "m/d/yyyy") & Mid(texte, Len(s) + 1) 'date au format US en 1ère colonne
    ReDim Preserve a(n) 'tableau VBA, base 0
    a(n) = texte 'stocke le texte dans le tableau a
    n = n + 1
Loop
Close #1
ReDim b(UBound(a), 0) 'base 0
For n = 0 To UBound(a)
    b(n, 0) = a(n) 'transposition
Next
Application.ScreenUpdating = False
With [A1].Resize(n)
    .Value = b 'restitution
    .TextToColumns .Cells(1), xlDelimited, Tab:=True, DecimalSeparator:="." 'commande Convertir
End With
Columns.AutoFit
End Sub
Dossier (3 bis).

A+
 

Pièces jointes

  • Dossier(3 bis).zip
    809.8 KB · Affichages: 6

thunder23

XLDnaute Occasionnel
Bonjour le fil, thunder23, job75

Bonjour à toi aussi thunder23

•>thunder23
Pas de réaction au message#18...:rolleyes:

Sinon, au final, tu abandonnes QueryTable ?

Bonjour Staple1600,

Je ne vois quoi répondre...enfin si, j'ai recherché d'avantage en parallèle comme tu as pu me le dire en plusieurs fois sur le sujet ;). J'ai tout simplement voulu avoir plus d'information sur un code je ne vois pas où est le mal? :rolleyes:
Faire un même sujet sur plusieurs forum je comprends tout à fait que ce n'est pas bien néanmoins j'utilise le même pseudo sur les forums car je doute que d'autres font la même chose. Après je ne veux pas rentrer dans une polémique, ce n'est pas mon but bien au contraire. :)
Je ne mets pas en doute ta solution, elle fonctionne très bien. Je ne cherche qu'à me développer d'avantage dans le code VBA que je ne connais depuis peu.
 

thunder23

XLDnaute Occasionnel
Bonjour thunder23, JM,


Pas clair du tout, mettre quoi à la 1ère ligne vide ?

Pour choisir le fichier avec la méthode de mon post #23 :
VB:
Sub Importer()
Dim fichier As Variant, texte$, s$, n&, a$(), b$()
ChDir ThisWorkbook.Path 'dossier initial
fichier = Application.GetOpenFilename("Fichiers textes,*.txt")
If fichier = False Then Exit Sub
Open fichier For Input As #1 'accès au fichier
Do While Not EOF(1) 'EndOfFile: fin du fichier
    Line Input #1, texte 'récupère la ligne
    s = Split(texte, vbTab)(0) 'item de la 1ère colonne
    texte = Format(s, "m/d/yyyy") & Mid(texte, Len(s) + 1) 'date au format US en 1ère colonne
    ReDim Preserve a(n) 'tableau VBA, base 0
    a(n) = texte 'stocke le texte dans le tableau a
    n = n + 1
Loop
Close #1
ReDim b(UBound(a), 0) 'base 0
For n = 0 To UBound(a)
    b(n, 0) = a(n) 'transposition
Next
Application.ScreenUpdating = False
With [A1].Resize(n)
    .Value = b 'restitution
    .TextToColumns .Cells(1), xlDelimited, Tab:=True, DecimalSeparator:="." 'commande Convertir
End With
Columns.AutoFit
End Sub
Dossier (3 bis).

A+

C'est qu'en fait il y aura des rajouts de données à la suite et je ne veux pas que ça supprime ce qu'il y a déjà. ;)
 

Staple1600

XLDnaute Barbatruc
Re, Bonjour job75

•>thunder23
[aparté]
Il ne s'agit pas mal ou de bien.
L'usage c'est de signaler par un lien quand on poste sa question sur plusieurs forums.
Cela évite de répondre à une question potentiellement déjà résolue ailleurs.
Ni plus, ni moins.
PS: Pour ta gouverne
[/aparté]

Pour le reste, je ne parle pas de polémique.
Je pose juste une question qui se résume à:
Quelle solution (code) tu as retenu pour la problématique?
 
Dernière édition:

thunder23

XLDnaute Occasionnel
Re

•>thunder23
[aparté]
Il ne s'agit pas mal ou de bien.
L'usage c'est de signaler par un lien quand on poste sa question sur plusieurs forums.
Cela évite de répondre à une question potentiellement déjà résolue ailleurs.
Ni plus, ni moins.
PS: Pour ta gouverne
[/aparté]

Pour le reste, je ne parle pas de polémique.
Je pose juste une question qui se résume à:
Quelle solution (code) tu as retenu pour la problématique?

Stapple1600,

Je suis désolé de ne pas avoir mis un lien avec ma question sur un autre forum, je n'y ai pas pensé.
Pour se qui est de la solution (code), ce sujet m'a répondu à ma problématique. ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 510
Membres
103 570
dernier inscrit
patrickb83p