Importation d'un fichier CSV

Fermé
khawla.az - Modifié le 17 juil. 2018 à 11:40
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 17 juil. 2018 à 21:17
Salut
J'ai réaliser un code qui permet d'importer un fichier CSV et je veux que le feuille de fichier excel porte le même nom du fichier. j'ai trouver la fonction GetOpenFileName mais cette fonction permet d'importer un seul type de fichier et l'importation du fichier se fait chaque mois et il peut être un fichier txt ou Prn.Merci
Sub ImportCSV()

Application.ScreenUpdating = False
Dim laChaine As String, x, fichier As String, texte, i As Long, Sh As Long, lig As Long 'variable necessaire
Dim J As Long
Dim l As Integer
Dim k As Integer
Dim DerCol As Integer
Dim F1 As Worksheet
Dim p As Integer
Dim f As String
'f = Application.GetOpenFilename("Text file (*.CSV), *.CSV")
'ActiveSheet.Name = Split(Mid(f, InStrRev(f, "\") + 1), ".")(0)
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False ' on choisi q'un seul fichier
If Application.FileDialog(msoFileDialogOpen).Show = True Then 'si on annule pas
fichier = .SelectedItems(1) 'fichier sera l'item choisi dans la boite de dialog
'f = Application.GetSaveAsFilename(fileFilter:="Text Files (*.CSV), *.CSV")

Else
MsgBox "Annuler" ' sinon un message
Exit Sub 'sortie de sub si annuler
End If
End With
'partie 2
' lecture et enregistrement du csv dans la variable
x = FreeFile
Open fichier For Input As #x 'ouverture du fichier en mémoire (non apparent)
laChaine = Input(LOF(x), #x) 'placement du texte complet dans la variable "lachaine"
Close #x ' fermeture du fichier
'partie 3
'exploitation du csv
Sh = 2 ' on demarre au 2 eme sheets le premier étant l'accueil chez moi
texte = Split(laChaine, vbCrLf) ' on coupe le texte par les saut de ligne
For i = 0 To UBound(texte)
lig = lig + 1 'on increment le n° de ligne
With Sheets(Sh)
.Name = "Final Dormant report Mai 2018" ' on nomme le sheets
.Cells(lig, 1) = texte(i) 'on met la ligne entiere dans la cellule la ligne complete meme avec les pointvirgules
If lig = Rows.Count - 2 Or i = UBound(texte) Then ' si on arrive en bas du sheets ou au bout des lignes du csv alors
'on applique la fonction native |||textTocolumns||| par les point virgules
.Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False, Space:=False, Other:=False
'DataType:=OtherChar, OtherChar:=";", TextQualifier:=xlDoubleQuote, Space:=True
Sh = Sh + 1: lig = 0 'on increment l'index de sheet

If Sheets.Count < Sh Then Sheets.Add After:=Sheets(Sheets.Count) 'au cas ou il n'y aurait pas le sheets (sh) on l'ajoute
End If
End With
Next
End Sub
A voir également:

1 réponse

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
17 juil. 2018 à 21:17
Bonjour,

Ta méthode de lecture du csv est susceptible de générer des erreurs.
En effet lorsqu'on "splite" sur vbCrLf on peut couper une ligne en 2 ou plus si du texte contient un vbCrLf.
Pour savoir si une ligne est entière, il faut s'assurer que le nombre de doubleQuote soit pair.
Lorsqu'il est impair, il faut concaténer le texte "splité" avec le suivant, jusqu'à ce que le nombre de doubleQuote soit pair pour reformer la ligne entière.
1