XL 2019 Import Export fichier .txt ou .csv

RBADA

XLDnaute Nouveau
Bonjour à tous,

avant de rentrer dans le vif du sujet, j'espère que vous passer d'agréables fêtes de fin d'année ?

Je me permets de vous solliciter à la veille de cette nouvelle année au sujet d'une application sur laquelle je m'arrache les cheveux...

Celle-ci a pour objet de convertir au format .xlsx après retraitement de fichiers .txt ou .csv.

Le hic c'est que tout semble fonctionner... jusqu'à la phase de traitement.

La problématique est simple la délimitation des champs est bien réalisée, cependant, au lieu de revenir à la ligne pour traiter le deuxième enregistrement... et le traitement se poursuit mais... en colonne... pour illustrer mes propos :

traitement réalisé : 1,2,3...

traitement souhaité :

1

2

3...

Ci-dessous l'application... qui n'est pour l'heure pas aboutie... quelqu'un pourrait éclairer ma lanterne ?

Merci à vous

Vous souhaitant un bon réveillon.

'déclaration des variables globales

'mémorisation de la ligne et colonne de départ à partir de laquelle nous allons importer les données

Dim ligne_debut As Integer: Dim colonne_debut As Integer

' détermination de la dernière ligne et colonne à importer

Dim ligne_fin As Integer: Dim colonne_fin As Integer

' détermination de la ligne et colonne encours pour suivre la progression de l'insertion des données

Dim ligne_encours As Integer: Dim colonne_encours As Integer

Private Sub import_Click()

'proposer à l'utilisateur de sélectionner le ou les fichiers .txt ou .csv

Dim fichier_select As String

fichier_select = Application.GetOpenFilename("text files (*.txt;*.csv), *.txt; *.csv", , "Sélectionner un fichier .txt ou .csv")

's'assurer que l'utilisateur a bien sélectionner un fichier via la boîte de dialogue

If (LCase(fichier_select) <> "faux" And fichier_select <> "0") Then

liste_fichiers.AddItem (fichier_select)

End If

End Sub

Private Sub export_Click()

'déclarer la variable du nom du fichier sous lequel l'utilisateur souhaite exporter les données

Dim nom_fichier As String

'initialiser les variables globales

ligne_debut = 1: colonne_debut = 1

'initialisation des indices de lignes et colonnes afin de suivre la progression

ligne_encours = ligne_debut: colonne_encours = colonne_debut

'purger la feuille de travail encours

Cells.Clear

's'il y a 2 fichiers répertoriés dans la liste la procédure débutera sur les index 0 et 1... s'il y a 3 fichiers sur les index 0,1,2... et ainsi de suite

For i = 0 To liste_fichiers.ListCount - 1

lecture (liste_fichiers.List(i))

Next i

'appeler la procédure traitement des données

traitement

'proposer sous quel nom le fichier doit être enregistré

nom_fichier = Application.GetSaveAsFilename(fileFilter:="Excel files (*.xlsx), *.xslx")

‘lancer la procédure sortie

sortie.Value = nom_fichier

'lancer la procédure export

ecriture (nom_fichier)

End Sub

Private Sub fermer_Click()

End Sub

'procédure qui permet de passer en lecture les fichiers inscrits dans la zone de liste fichiers du formulaire

'déclaration d'une variable fichier correspondant au fichier

Private Sub lecture(fichier As String)

'déclaration de la variable départ pour connaître la position à laquelle nous nous situons dans le texte à délimiter, la variable position qui permet de délimiter les fichiers .txt ou .csv et la variable texte pour mémoriser les informations textuelles

Dim depart As Integer, position As Integer

Dim texte As String, tampon As String

'accéder au fichier en mode lecture et affecter une adresse mémoire avec un n° exemple: #1

Open fichier For Input As #1

'tant que la fin du fichier n'est pas atteinte EOF

Do While Not EOF(1)

'récupérer les données lignes à lignes et les mémoriser

Line Input #1, texte

'initialiser les variables départ et position

depart = 1: position = 1

'parcourir toute la ligne de texte de manière à trouver les séparateurs

Do While (position <> 0)

'stocker la position du séparateur

position = InStr(depart, texte, ";", 1)

'vérification qu'il n'y a plus de séparateur

If position = 0 Then

tampon = Mid(texte, depart)

'inscription de la donnée extraite dans la feuille "import"

Sheets("Import").Cells(ligne_encours, colonne_encours).Value = tampon

Exit Do

'sortir de la procédure de traitement de caractère si aucun séparateur n'est trouvé

Else

'sinon la procédure continue et réalise le traitement

tampon = Mid(texte, depart, position - depart)

End If

Sheets("Import").Cells(ligne_encours, colonne_encours).Value = tampon

depart = position + 1

colonne_encours = colonne_enours + 1

Loop

colonne_enours = colonne_debut

ligne_encours = ligne_encours + 1

Loop

Close #1

End Sub

'procédure qui permet de retranscrire les traitements réalisés dans un fichier

'déclaration d'une variable fichier correspondant au fichier

Private Sub ecriture(fichier As String)

End Sub

'procédure qui permet le traitement des données

'déclaration d'une variable fichier correspondant au fichier

Private Sub traitement()

End Sub

Private Sub liste_fichiers_Click()

End Sub
 

Staple1600

XLDnaute Barbatruc
Bonjour à tous

Juste pour infos
colonne_encours = colonne_enours + 1
Petite coquille ici ;)
(qu'on retrouve plus bas dans le code)
Il manquerait pas un petit c par hasard?

Sinon, tu peux joindre une exemple de fichier CSV ?
(si non confidentiel)
=>pour le joindre, le zipper au préalable

EDITION: Bonjour JHA, job75
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour RBADA, JHA, JM,

@RBADA votre code est bien compliqué, une méthode très classique avec les fichiers joints :
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, ";")(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 [A2].Resize(n)
    .Resize(Rows.Count - .Row + 1).EntireRow.ClearContents 'RAZ
    .Value = b 'restitution
    .TextToColumns .Cells(1), xlDelimited, Tab:=True, Semicolon:=True, DecimalSeparator:="." 'commande Convertir
End With
End Sub
A+
 

Pièces jointes

  • FichierTXT.txt
    83 bytes · Affichages: 25
  • Importer(1).xlsm
    19.8 KB · Affichages: 28

RBADA

XLDnaute Nouveau
Merci à tous.

JHA je n'ai jamais utilisé Power Query.

Staple1600 en effet, j'ai recopié la procédure de la première version de l'application... et comme je l'ai modifiée... elle présente des erreurs de casse... colonne_enCours

Merci job75 je garde précieusement ta procédure comme modèle.

En revanche, vous trouverez ci-joint ma procédure pourriez-vous y jeter un oeil et me dire d'où provient l'erreur (ou les erreurs) ?

Je reste également ouvert à toute suggestion perfectible de la procédure.

Vous remerciant par avance.

Mes salutations les meilleures.
 

Pièces jointes

  • import_exportV2.xlsm
    22.2 KB · Affichages: 17
  • clients-facturation.txt
    700 bytes · Affichages: 11

juvaxe

XLDnaute Occasionnel
Bonjour

Voici comment je procède pour importer un fichier de format CSV dans un classeur Excel :


With ActiveSheet.QueryTables.Add(Connection:= _
TxtInclus, Destination:=Range("$B$1"))
.Name = Nm_Fich_Releve
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With


Pour trouver cette solution j'ai procédé à une procédure manuelle d'importation après avoir déclenché l'enregistrement d'une macro. Ensuite j'ai tout simplement récupéré le contenu de la macro pour l'inclure dans mon code VBA.

Bonne réception et bon courage

Meilleurs vœux à tous mes lecteurs

Bien cordialement
 

Staple1600

XLDnaute Barbatruc
Re,

Même piste que juvaxe
(avec un peu de toilettage en plus)
VB:
Sub Import_TXT()
Dim fichier As Variant
fichier = Application.GetOpenFilename("Fichiers textes,*.txt")
If fichier = False Then Exit Sub
Cells.Clear
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & fichier, Destination:=Range("A1"))
        .Name = "clients-facturation"
        .FieldNames = True
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileSemicolonDelimiter = True
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 9, 9, 9, 9)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
 

Discussions similaires

Réponses
3
Affichages
122