Importer un csv avec comme séparateurs des ; et

Bonjour à tous,

Je me suis inspiré d’une macro trouvée sur le Net pour importer les notes de mes élèves pour chaque question dans l’onglet Data (présent dans le classeur joint Macro et fichier Destination).

Les notes (Données brutes) que j’importe ont été générées par un logiciel nommé AMC, qui me délivre un fichier au format csv (avec comme séparateur des ; et des ") (Fichier joint ExempleSourceAImporterEnCsv). Ceci est mon fichier Source à importer.

L’import avec un fichier xls fonctionne parfaitement (j’ai fait une conversion avec LibreOffice Calc du format .csv en .xls) (Fichier joint FichierSourceAImporterEnXls)

Le but est d’importer directement les notes du fichier .csv (et éviter cette conversion).

Le problème est que l’importation avec le csv se passe mal. Je pense que Excel détecte mal les séparateurs : les ; et " du csv.

Dans la macro d’appel présente dans le classeur joint Macro et fichier Destination, j’ai trouvé et adapté le morceau de code suivant (à la toute fin du fichier)

Function Selectionner_Fichiers(sTitre As String) As Variant 'Necessaire pour l'importation des fichiers QCM et la recuperation dans Data
Dim sFiltre As String, bMultiSelect As Boolean
    sFiltre = "Fichiers XYZ (.xls)(.xlsm), *.xls*"
    'sFiltre = "Fichiers Excel (.xls)(.xlsm), *.xls*,Fichiers csv (*.csv),*.csv" 'NE marche pas : l'import en csv ne fonctionne pas
    bMultiSelect = True 'Permet de choisir plusieurs fichiers à la fois
    Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function

y a t il un paramètre à rajouter pour que Excel fasse bien l’import ?

Cordialement

Bonjour,

Pour ouvrir un fichier csv, à mon avis c'est le paramètre local qui manque :

Workbooks.OpenText Filename:=Chemin_complet_du_fichier, semicolon:=True, local:=True

J'ai essayé d'adapter votre instruction à mon code mais je n'arrive à rien.

Je vous mets le code que j'utilise :

Sub Etape1_Importer_Donnees_des_Fichiers_AMC()
Dim wbRecap As Workbook         'fichier recap
Dim wsRecap As Worksheet        'feuille où on écrit les données
Dim wbSource As Workbook        'fichier à ouvrir
Dim wsSource As Worksheet       'feuille où on cherche les données
Dim vFichiers As Variant        'noms des fichiers
Dim i As Integer, k As Integer
Dim rgRecap As Range            'plage où on copie les données

Set wbRecap = ThisWorkbook       'Fichier récapitulatif
Set wsData = Worksheets("Data")
Set wsRecap = wsData 'wbRecap.Sheets(1)  'on écrit dans la feuille 1 du fichier récapitulatif

' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
    vFichiers = Selectionner_Fichiers("Sélectionner les fichiers d'AMC à importer") 'Appel de Fonction pour ouvrir fichiers

' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
        Debug.Print "Aucun fichier sélectionné."
        MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next

    Application.ScreenUpdating = False

' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
        Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)

' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' C'est ici qu'on écrit les instructions
'Set wbSource = Workbooks.Open(vFichiers(k))     'Fonctionne avec cette instruction uniquement avec les .xls  'on ouvre le fichier
Set wbSource = Workbooks.OpenText(Filename:=vFichiers(k), Semicolon:=True, local:=True) 'BUG ICI 

Set wsSource = wbSource.Sheets(1)                                  'On copie les données de la feuille 1

' - On copie les données vers le fichier Recapitulatif nommé Data (enfin, je crois)

With wsSource
            .Select
            .Range("A1").Select
            DerniereColonneData = wsRecap.Cells(1, Cells.Columns.Count).End(xlToLeft).Column

    .Range("A1").CurrentRegion.Resize(Range("A1").CurrentRegion.Rows.Count, Range("A1").CurrentRegion.Columns.Count - 6).Offset(0, 5).Copy _
    Destination:=wsRecap.Range("A1").Offset(0, DerniereColonneData)

End With

        wbSource.Close              'fermer fichier
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k

    Application.ScreenUpdating = True
    Application.StatusBar = False

End Sub

Function Selectionner_Fichiers(sTitre As String) As Variant 'Necessaire pour l'importation des fichiers QCM et la recuperation dans Data
Dim sFiltre As String, bMultiSelect As Boolean

    sFiltre = "Fichiers XYZ (.xls)(.xlsm), *.xls*"
    bMultiSelect = True 'Permet de choisir plusieurs fichiers à la fois
    Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function

A l'endroit du BUG

Set wbSource = Workbooks.OpenText(Filename:=vFichiers(k), Semicolon:=True) 'BUG ICI 

J'ai essayé plusieurs possibilités sans les parenthèses, avec Local:=True mais il me dit qu'il y a une erreur de compilation.

J'ai l'impression que GetOpenFilename et le MultiSelect ne font pas bon ménage mais je ne sais pas résoudre le problème.

Avez vous une idée de l'erreur ?

Merci pour vos réponses.

Re,

Tu ne l'utilises pas correctement. Il faut l'utiliser exactement comme j'ai indiqué. Tu continues à faire ce que tu veux après l'ouverture du fichier texte.

Merci pour votre réponse, Raja.

Cela semble fonctionner en partie.

Cependant, à la fin de la macro, je me retrouve avec plusieurs classeurs ouvert à l'écran : celui où j'ai fait l'import mais aussi celui de la source qui est ouvert dans une autre instance d'excel. Je présume que c'est l'appel de Workbooks.OpenText qui ouvre cette fenêtre "parasite".

Comment faire pour n'avoir, à la fin, que mon classeur où j'ai importé mes données ?

Cordialement

Re,

Il faudra un code en quelque sorte comme le suivant (à adapter) pour fermer tous les classeurs sauf ce que tu veux garder :

 Dim wb As Workbook
 For Each wb In Workbooks
  If Not wb Is ThisWorkbook Then
     wb.Close False
  End If
 Next

Merci : cela fonctionne.

J'ai utilisé la méthode close.

Je pensais que c'était plus compliqué : qu'il fallait le bon paramètre associé à OpenText pour ouvrir de manière particulière le fichier.

Hum... j'ai beaucoup de choses encore à apprendre.

Encore merci pour votre aide.

Rechercher des sujets similaires à "importer csv comme separateurs"