IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro importer un fichier texte avec un chemin relatif [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Macro importer un fichier texte avec un chemin relatif
    Bonjour la communauté,

    Après avoir fouillé le web, je fais appel à votre expertise car ce problème parait simple mais je n'arrive pas a m'en dépatouiller...

    Je souhaite que ma macro VBA importe un fichier texte présent dans un dossier. Je ne connais pas le nom de fichier a l'avance car chaque jour, c'en sera un nouveau.
    J'ai utilisé la fonction d'enregistrement pour avoir un bout de code, et ça marche nickel. Puis j'ai ajouté la fonction "Application.GetOpenFilename" pour laisser l'utilisateur choisir le fichier, mais ça ne marche plus... j'obtiens "erreur d’exécution 1004, impossible de trouver le fichier texte..."

    Quelqu'un saurait comment résoudre ça?

    voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Sub Macro1()
     
    Dim File_Name As String
    File_Name = Application.GetOpenFilename
     
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;File_Name" _
        , Destination:=Range("$A$1"))
        .Name = "List"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
     
    End Sub
    Merci d'avance,
    oekoniko

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai fais dernièrement le même type de travail. Adapte le à ton programme.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub ImportFichierTexte()
        Dim NewFeuille As Worksheet                                                     'Déclaration d'une variable en Feuille de calcul
        Dim Fichier, Chemin, NomFichier, NomFeuille As String                           'Déclaration des variables en chaîne de caractères
        Fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt")              'Ouvrir une fenêtre explorer qui affiche que les fichiers.txt
        NomFichier = ""                                                                 'Variable ne contitent rien
        NomFeuille = ""                                                                 'Variable ne contitent rien
     
        If Fichier = False Then                                                         'SI Fichier est faux (null/ne contient rien), alors :
            MsgBox "Vous n'avez pas selectionné de fichier TEXTE !"                     'Affichage d'un message
            Exit Sub                                                                    'Sortie forcée de la fonction
        End If
     
        If Fichier <> "" Then                                                           'Si Fichier contient quelque chose, alors :
            NomFichier = Dir(Fichier & "")                                              'Recherche le nom du fichier qui sera importé
            NomFeuille = Left(NomFichier, Len(NomFichier) - 4)                          'On supprime l'extenstion ".txt" du nom que l'on affectera au nom de la feuille créée
            Set NewFeuille = Sheets.Add(after:=Sheets(Sheets.Count))                    'La nouvelle feuille créée se place en dernière position
            NewFeuille.Name = NomFeuille                                                'Renomme la feuille avec le nom qui a été modifié par la valeur de la variable NomFeuille
            Set NewFeuille = Nothing                                                    'Libération de l'objet NomFeuille
            Worksheets("DONNEES").QueryTables.Add("TEXT;" & Fichier, _
                Worksheets("DONNEES").[A1]).Refresh                                     'Insert le fichier.txt choisi par l'utilisateur dans la page de calcul DONNEES à partir de la colonne A1
            Moulinette                                                                  'Appel de la fonction Moulinette qui regroupe tout le système de traitement des données
        End If
    End Sub

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut presque
    Bonjour Hankow et merci de ta réponse rapide.

    Étrangement, ça ne passe pas... :-(
    J'ai enlevé les quelques lignes qui ne me servent pas, mais ca plante a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Worksheets("DONNEES").QueryTables.Add("TEXT;" & Fichier, _
                Worksheets("DONNEES").[A1]).Refresh
    avec une erreur 9 "l'indice n'appartient pas a la selection"

    Es-tu sur du code? Est-ce que cela marche chez toi?

    Merci d'avance.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Oui il reste encore un bout de mon code dans cette ligne !

    Il faut que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Worksheets("Ta_Feuille_Où_sera_importe_le_fichier").QueryTables.Add("TEXT;" & Fichier, _
                Worksheets("Ta_Feuille_Où_sera_importe_le_fichier").[A1]).Refresh
    Rq : [A1] correspond à la 1ère cellule où sera importé la première ligne de ton fichier.txt

    Tiens moi au courant

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut ca marche, mais...
    Bonjour Hankow,

    Bon, effectivement, ca marche avec ma feuille "List":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Worksheets("List").QueryTables.Add("TEXT;" & Fichier, _
            Worksheets("List").[A1])
    Faut croire que j'avais juste besoin d'un week-end de repos et de reprendre ca au calme ce matin! ;-)

    Toutefois, ca me l'importe en texte pur, sans conversion. J'ai essayé de compiler ca avec les parametres obtenus en enregistrant une macro...Mais ca ne marche pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     If Fichier <> "" Then                                                           'Si Fichier contient quelque chose, alors :
            NomFichier = Dir(Fichier & "")                                              'Recherche le nom du fichier qui sera importé
            NomFeuille = "Test"                                                         'On supprime l'extenstion ".txt" du nom que l'on affectera au nom de la feuille créée
            Set NewFeuille = Sheets.Add(after:=Sheets(Sheets.Count))                    'La nouvelle feuille créée se place en dernière position
            NewFeuille.Name = NomFeuille                                                'Renomme la feuille avec le nom qui a été modifié par la valeur de la variable NomFeuille
            Set NewFeuille = Nothing                                                    'Libération de l'objet NomFeuille
            Worksheets("List").QueryTables.Add("TEXT;" & Fichier, _
            Worksheets("List").[A1]).Refresh
            .Name = "liste_entiere"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 65001
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End If
    J'obtiens une erreur "reference incorrecte". Quelqu'un aurait-il une idee?
    Merci et joyeuse paques a tous!

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut pour resumer
    Pour resumer, jai d'un coté un premier code (fourni par l'enregistrement) qui importe et formate comme je veux le fichier, mais qui ne prends qu'un seul fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;C:\tesfilefortest.txt" _
            , Destination:=Range("$A$1"))
            .Name = "Liste_entiere"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 65001
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    et de l'autre un code qui me permets de choisir un fichier mais qui ne formate pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Dim NewFeuille As Worksheet                                                     'Déclaration d'une variable en Feuille de calcul
        Dim Fichier, Chemin, NomFichier, NomFeuille As String                           'Déclaration des variables en chaîne de caractères
        Fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt")              'Ouvrir une fenêtre explorer qui affiche que les fichiers.txt
        NomFichier = ""                                                                 'Variable ne contitent rien
        NomFeuille = ""                                                                 'Variable ne contitent rien
     
        If Fichier = False Then                                                         'SI Fichier est faux (null/ne contient rien), alors :
            MsgBox "Vous n'avez pas selectionné de fichier TEXTE !"                     'Affichage d'un message
            Exit Sub                                                                    'Sortie forcée de la fonction
        End If
     
        If Fichier <> "" Then                                                           'Si Fichier contient quelque chose, alors :
            NomFichier = Dir(Fichier & "")                                              'Recherche le nom du fichier qui sera importé
            NomFeuille = "Test"                                                         'On supprime l'extenstion ".txt" du nom que l'on affectera au nom de la feuille créée
            Set NewFeuille = Sheets.Add(after:=Sheets(Sheets.Count))                    'La nouvelle feuille créée se place en dernière position
            NewFeuille.Name = NomFeuille                                                'Renomme la feuille avec le nom qui a été modifié par la valeur de la variable NomFeuille
            Set NewFeuille = Nothing                                                    'Libération de l'objet NomFeuille
            Worksheets("List").QueryTables.Add("TEXT;" & Fichier, _
            Worksheets("List").[A1]).Refresh
            .Name = "SPAM_REPORT_2015-03-25_fr_FR-fr_FR_elite"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 65001
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End If
    Et j'aimerais pouvoir combiner les deux: choisir le fichier texte et l'importer correctement converti!

    Merci!

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    importer le fichier en le convertissant ca sent le CSV a mon avis est ce que je me trompe

    si non tu n'utilise pas la bonne méthode alors c'est un peu le soucis avec ces fichiers selon le format dans le quel il ont été écrit

    sinon essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workbooks.open(chemin complet du fichier ) ,local:=true
    normalement ca te le met en place cellules par cellules
    et si ca ne marche pas il va te falloir ruser en ouvrant le fichier texte et en le manipulant avecc Scripting.filesystemobject

  8. #8
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour

    D'accord avec Patrick. Je trouve que Workbooks.Open avec Local:=True est simple et performant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Ouvrir()
     
     fich = "C:\a_Rechercher\test.txt"
     
     Set wb = Workbooks.Open(fich, Local:=True)
     
    End Sub

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut trouvé!
    Bonjour Patrick,

    Merci pour ton aide, mais j'ai finalement trouvé une solution cet aprem. La voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
        Dim File_Name As String
        ChDrive "G"
        ChDir "G:\CustomerCare"
        File_Name = Application.GetOpenFilename
     
        Sheets("Temp").Activate
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;" & File_Name _
            , Destination:=Range("A1"))
            .Name = "Test"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 65001
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    ps: Il s'agit bien d'un fichier texte (*.txt) en format séparé par des points virgules ;-)

    bonne journée a tous!

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    Maintenant attention cette fonction ouvre un nouveau fichier si tu dois importer après workbooks.open il te faut transférer d'un classeur a l'autre

    OU BIEN
    comme je te l'ai dis tout a l'heure "Ruser"
    ouvrir le fichier avec filesystemobject faire un tableau en mémoire et coller le tout
    exemple
    met le chemin de ton fichier remplace le cas échéant le point-virgule par virgule et lance le bourrin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    Sub ouvre_csv_ou_text()
       Dim fs, f
        Const ForReading = 1, ForWriting = 2, ForAppending = 3
         Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.OpenTextFile("chemin fichiercomplet", ForReading, TristateFalse)
        texte = f.ReadAll
        f.Close
        ligne = Split(texte, vbCrLf)
        ReDim tablo(ligne, 100)
        For i = 0 To UBound(ligne)
            For e = 0 To UBound(Split(ligne(i), ";"))
                tablo(i, e) = Split(ligne(i), ";")(e)
                a = IIf(e > a, e, a)
            Next
        Next
        Sheets(1).Cells(1, 1).Resize(UBound(tablo), a) = tablo
    End Sub
    

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème macro importer un fichier texte
    Par aviat3ur dans le forum Excel
    Réponses: 4
    Dernier message: 15/12/2012, 15h47
  2. [MySQL] Importation de fichier texte avec traitement des caractères spéciaux
    Par runcafre91 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/12/2009, 22h28
  3. Importer un fichier texte avec SQL Express
    Par hannii dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/03/2007, 10h26
  4. Import fichier texte avec des champs variables
    Par joshua12 dans le forum Access
    Réponses: 4
    Dernier message: 26/09/2006, 09h06
  5. Import fichier texte avec separateur milliers "."
    Par mgrsys dans le forum Access
    Réponses: 8
    Dernier message: 12/09/2006, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo