[RESOLU] Chemin pour import fichier .CSV

richert90

XLDnaute Occasionnel
Bonjour le forum!

Voici ma question. J'ai enregistré une macro me permettant d'importer à l'ouverture d'excel un fichier CSV. A l'ouverture d'excel, on obtient une fenêtre pour parcourir les documents et choisir son fichier.CSV (Grâce à l'instruction
Code:
GetOpenFileName
Voici le code de cet import:

Code:
Sub import_fichier_CSV()

    Dim nom_fichier As String
    
    FileToOpen = Application _
     .GetOpenFilename("(*.csv), *.csv") 'FileToOpen contiendra le chemin du fichier . CSV qu'a choisi d'importer l'utilisateur
        If FileToOpen = "" Then
            MsgBox ("Vous n'avez pas sélectionné le fichier") 'Dans le cas où il n'y a pas de fichier choisi.
            Exit Sub
        End If
        nom_fichier = Split(Mid$(FileToOpen, InStrRev(FileToOpen, "\") + 1), ".")(0)  'Nom du fichier sans son extension
        If FileToOpen <> False Then
            With ActiveSheet.QueryTables.Add(Connection:= _
               "TEXT;" & FileToOpen _
               , Destination:=Range("$A$1"))
               .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 = False
               .TextFileSemicolonDelimiter = False
               .TextFileCommaDelimiter = True
               .TextFileSpaceDelimiter = False
               .TextFileColumnDataTypes = Array(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, 1, 1, 1, 1)
               .TextFileTrailingMinusNumbers = True
               .Refresh BackgroundQuery:=False
           End With
        End If
End Sub

Mais en fait ce que j'aimerais, c'est de pouvoir spécifier un chemin spécifique d'un dossier où sont les fichiers CSV et non pas tomber à chaque import sur le dossier "Mes documents" de la fonction "GetOpenFileName". Donc je pense il faut modifier cette fonction, mais je ne sais pas exactement comment.

Merci de m'aider :)
 
Dernière édition:

richert90

XLDnaute Occasionnel
Re : Chemin pour import fichier .CSV

En fait je voudrais

1) définir un chemin de dossier , par exemple chemin="C:\Documents and Settings\Mes documents\Mes sources de données\ensemble_fichiersCSV"

2)Quand je lance mon application pour importer des fichiers de format .CSV, j'ai une fenêtre avec comme vue les fichiers du dossier "ensemble_fichiersCSV" grâce au chemin précédant .

3) l'utilisateur choisit le fichier de format . CSV dans le dossier et l'importe sur Excel.

Pour ma part c'est la partie 2) qui me bloque

J'ai peut -être bien une idée:
Code:
Application.Dialogs(xlDialogOpen).Show ("C:\Documents and Settings\Mes documents\Importer fichier CSV sur Excel")
End Sub

Cette instruction va bien m'ouvrir une boite de dialogue selon le chemin que je souhaite. L'utilisateur sélectionne un fichier MAIS le problème ici c'est que ce fichier va être ouvert dans un autre classeur Excel Or je souaite l'importer sur le fichier sur lequel je travaille :)

Merci d'avance de votre aide
 
Dernière édition:

richert90

XLDnaute Occasionnel
Re : Chemin pour import fichier .CSV

Ok merci; mais moi du coup je peux juste utiliser Chdir pour changer le répertoire?
Pour l'appliquer après dans le code de la macro pour importer un fichier .CSV, comment je peux remplacer ça:

Code:
FileToOpen = Application _
     .GetOpenFilename("(*.csv), *.csv") 'FileToOpen contiendra le chemin du fichier . CSV qu'a choisi d'importer l'utilisateur
        If FileToOpen = "" Then
            MsgBox ("Vous n'avez pas sélectionné le fichier") 'Dans le cas où il n'y a pas de fichier choisi.
            Exit Sub
        End If
        nom_fichier = Split(Mid$(FileToOpen, InStrRev(FileToOpen, "\") + 1), ".")(0)  'Nom du fichier sans son extension
car une fois qu'il a choisi son fichier dans le dossier spécifié par le chemin avec Chdir, j'ai besoin de récupérer le chemin entier dans la variable FileToOpen (avec le nom du fichier et son extension) , et je ne vois pas comment on peut passer de l'un à l'autre en fait..
 

Dranreb

XLDnaute Barbatruc
Re : Chemin pour import fichier .CSV

Ok merci; mais moi du coup je peux juste utiliser Chdir pour changer le répertoire?
Si entre temps l'usager n'est pas allé ouvrir un fichier sur un CD ou autre, oui. Mais il est plus prudent de faire un ChDrive aussi. Car CurDir c'est le dossier courant du lecteur courant.
.GetOpenFileName rend le nom complet du fichier avec son chemin. Il faut savoir qu'il peut changer le CurDir en faveur du chemin du fichier choisi.
 

richert90

XLDnaute Occasionnel
Re : Chemin pour import fichier .CSV

Pour être franc j'ai du mal à comprendre là :rolleyes:
le Curdir donne le chemin mais sans le fichier et son extension? car l'utilisateur doit ensuite choisir dans e dossier le fichier qu'il souhaite. Comment le Application.GetOpenFileName peut donc changer ce chemin?

Je ne vois pas l'astuce pour le coup :(
 

Dranreb

XLDnaute Barbatruc
Re : Chemin pour import fichier .CSV

CurDir ne donne qu'un répertoire, pas un fichier. C'est le dossier courant dans le lecteur courant, c'est à dire ceux fixés par les dernier ChDrive et ChDir effectués. Et c'est de cet embranchement là que part une recherche de fichier à l'aide de GetOpenFileName. Ce dernier peut le changer si le choix de l'utilisateur se porte finalement sur un autre dossier.
 

richert90

XLDnaute Occasionnel
Re : Chemin pour import fichier .CSV

Est-ce que tu aurais un exemple d'utilisation de Chdrive et de GetOpenFileName pour visualiser un peu comme ça marche?
Enfin un exemple juste pour voir comment se fait cet embranchement de Chdrive et Chdir à GetOpenFileName?
Merci davance
 

Dranreb

XLDnaute Barbatruc
Re : Chemin pour import fichier .CSV

Oh écoutez, ne vous posez plus de questions. Faites au tout début de votre procédure :
VB:
Const Chemin = "C:\Documents and Settings\Mes documents\Mes sources de données\ensemble_fichiersCSV"
ChDrive Chemin: ChDir Chemin
Un point c'est tout.
 

malekula

XLDnaute Nouveau
Re : [RESOLU] Chemin pour import fichier .CSV

Bonjour,
Deux ans après, cette discussion m'a beaucoup servi, et j'ai pu écrire ma macro en copiant des bouts de code.
Mais la boite de dialogue pour ouvrir le fichier csv s'ouvre là où elle a été ouverte la dernière fois.
Je n'ai pas compris où insérer le code fourni par Dranreb :
Code:
Const Chemin = "C:\Documents and Settings\Mes documents\Mes sources de données\ensemble_fichiersCSV"
ChDrive Chemin: ChDir Chemin

Ma macro :
Code:
Sub Traitement_donnees_Reefnet()
'
' Traitement_donnees_Reefnet Macro
' Traitement des données des sondes reefnet
Dim nom_fichier As String
    FileToOpen = Application _
     .GetOpenFilename("(*.csv), *.csv") 'FileToOpen contiendra le chemin du fichier . CSV qu'a choisi d'importer l'utilisateur
        If FileToOpen = "" Then
            MsgBox ("Vous n'avez pas sélectionné le fichier") 'Dans le cas où il n'y a pas de fichier choisi.
            Exit Sub
        End If
        nom_fichier = Split(Mid$(FileToOpen, InStrRev(FileToOpen, "\") + 1), ".")(0)  'Nom du fichier sans son extension
        If FileToOpen <> False Then
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & FileToOpen, Destination:=Range("$A$1"))
        '.Name = "2015 Arbois KB95-10695"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    End If
    Rows("1:1").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    With ActiveWindow
        .SplitColumn = 0
        .SplitRow = 1
    End With
    Dim derniereLigne As Long
derniereLigne = Range("A" & Rows.Count).End(xlUp).Row
    ActiveWindow.FreezePanes = True
    Range("N2").Select
    ActiveCell.FormulaR1C1 = "=RC[-2]+RC[-1]/100"
    Selection.AutoFill Destination:=Range("N2:N" & derniereLigne)
    Range("N2:N" & derniereLigne).Select
    Columns("N:N").Select
    Selection.Copy
    Range("O1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Columns("L:N").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft
    Columns("M:M").Select
    Selection.NumberFormat = "m/d/yyyy h:mm"
    Selection.ColumnWidth = 19.29
    Range("M2").Select
    ActiveCell.FormulaR1C1 = "=DATE(RC[-9],RC[-8],RC[-7])+RC[-6]/24+RC[-5]/1440"
    Range("M3").Select
    ActiveCell.FormulaR1C1 = "=R[-1]C+R3C[-3]/86400"
    Selection.AutoFill Destination:=Range("M3:M" & derniereLigne)
    Range("M3:M" & derniereLigne).Select
    Columns("A:B").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.ColumnWidth = 21.86
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "=TEXT(RC[13],""jj/mm/aaaa hh:mm"")"
    Selection.AutoFill Destination:=Range("B2:B" & derniereLigne)
    Range("B2:B" & derniereLigne).Select
    Columns("B:B").Select
    Selection.Copy
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Columns("O:O").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft
    Columns("B:L").Select
    Selection.Delete Shift:=xlToLeft
    Selection.ColumnWidth = 8.43
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "Date"
    Range("B1").Select
    ActiveCell.FormulaR1C1 = "P(mb)"
    Range("C1").Select
    ActiveCell.FormulaR1C1 = "T(K)"
End Sub
C'est important pour moi de maîtriser cette question d'adresses, parce qu'à la fin de la macro, je voudrais qu'elle enregistre le classeur excel ainsi créé dans le même dossier que le fichier csv d'où proviennent les données.

Merci d'avance pour vos réponses.
 

Dranreb

XLDnaute Barbatruc
Re : [RESOLU] Chemin pour import fichier .CSV

Bonjour malekula.

Les ChDrive et ChDir doit se placer juste avant FileToOpen = Application.GetOpenFilename(etc.
L'instruction Const peut se mettre en tête du module, mais aussi dans la procédure.
Un classeur sauvegardé sans préciser de chemin est enregistré sur celui courant, indiqué par CurDir.
 

malekula

XLDnaute Nouveau
Re : [RESOLU] Chemin pour import fichier .CSV

Merci beaucoup Dranreb.
J'ai réussi à finaliser une macro qui répond à mes souhaits.
Elle permet d'aller chercher facilement chaque fichiers csv dans son dossier, puis d'enregistrer le classeur excel dans le même dossier.
Finalement je n'ai pas utilisé Const, ni Curdir.
Cela pourra peut-être servir à d'autres, je donne juste le début et la fin, le reste c'est comme dans mon message précédent.
Début :
Code:
ChDrive "C:\"
ChDir "C:\dossier\sousdossier\soussousdossier"
    FileToOpen = Application _
     .GetOpenFilename("(*.csv), *.csv") 'FileToOpen contiendra le chemin du fichier . CSV qu'a choisi d'importer l'utilisateur
        If FileToOpen = "" Then
            MsgBox ("Vous n'avez pas sélectionné le fichier") 'Dans le cas où il n'y a pas de fichier choisi.
            Exit Sub
        End If
        nom_fichier = Split(Mid$(FileToOpen, InStrRev(FileToOpen, "\") + 1), ".")(0)  'Nom du fichier sans son extension
        If FileToOpen <> False Then
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & FileToOpen, Destination:=Range("$A$1"))
        .FieldNames = True
        .RowNumbers = False
Fin :
Code:
    ActiveCell.FormulaR1C1 = "T(K)"
    ActiveWorkbook.SaveAs Filename:=nom_fichier
End Sub
 

Discussions similaires

Réponses
2
Affichages
286

Statistiques des forums

Discussions
312 203
Messages
2 086 196
Membres
103 153
dernier inscrit
SamirN