Importer données fichier texte excel

Résolu
Bonjour,

A partir d’un fichier excel, je souhaiterai ouvrir un fichier texte et copier l’ensemble des données dans une feuille.
J’ai commencé la macro en m’appuyant de ce que j’ai trouvé sur internet, voici le lien de mon fichier :
https://www.cjoint.com/c/FBpwa1sf2ma

Ce code à l’air de poser problème : Worksheets("test").QueryTables.Add("TEXT;" & Fichier, [A1]).Refresh

En espérant que vous pourrez m’aider …
Merci d’avance.

Cordialement.

10 réponses

Résumé de la discussion

Importation de données d’un fichier texte vers Excel via une QueryTables.Add et délimiteurs adaptables constitue le cœur du fil, avec des échanges centrés sur les difficultés d’import et les ajustements à apporter. La solution retenue passe par une macro qui ouvre le fichier texte avec GetOpenFilename, place les données sur la feuille à partir de A1 et active plusieurs délimiteurs pour assurer un import fiable. En pratique, l’usage des propriétés TextFileConsecutiveDelimiter et TextFileTabDelimiter, TextFileSemicolonDelimiter, TextFileCommaDelimiter et TextFileSpaceDelimiter permet d’adapter l’import au format du fichier et d’éviter l’erreur de destination rencontrée. D'autres réponses complètent ces éléments en recommandant l’intégration via un bouton et l’option GetOpenFilename pour une utilisation pratique sans configuration manuelle répétée dans Excel au quotidien.

Bobot (l’IA à votre service)
  1. Contributeur
    0
    1. Bonsoir,
      Merci pour la réponse, j'ai réussi à importer le fichier texte.
      Cependant, est-il possible d'exécuter cette macro à partir d'un bouton qui se trouverait simplement dans l'une des feuilles ?

      Ensuite, mon fichier comporte beaucoup de texte. Je souhaiterai utiliser la fonction "Assistant importation de texte" de manière automatique. En effet, à chaque fois qu'il y a un espace, je souhaiterai que la valeur qui suit cet espace soit décalée dans la cellule de droite. Je n'arrive pas à adapter cette fonction à la suite de votre code.
      0
    2. Contributeur
      Pour la seconde question je n'ai pas tout compris. Essaie avec cela:

      Sub Recup()
      Dim DernLigne As Long
      DernLigne = Range("A" & Rows.Count).End(xlUp).Row
       Dim Fichier
          Fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt")
          If Fichier <> False Then
          'crée une requête sur le fichier texte et insère les champs
             'dans la feuille "Feuil1" en partant de "A1" à adapter
             Worksheets("Feuil1").QueryTables.Add("TEXT;" & Fichier, Range("A" & DernLigne)).Refresh 'à adapter
              Range("A1:A" & DernLigne).Select
          Selection.Delete Shift:=xlToLeft
         Else
              MsgBox "Pour importer des données dans Excel, vous devez choisir un fichier texte !"
          End If
      End Sub
      


      Sinon tu peux essayer avec l'enregistreur de macro, cela fonctionne bien

      @+ Le Pivert
      0
    3. @cs_Le PivertBonjour,
      Merci pour la procédure mais j'avais déjà essayé cette méthode. Lorsque j'appuie sur le bouton, le programme s'éxecute mais il me met une erreur en me disant que la plage de destination doit être sur la même feuille or je souhaite mettre le boutton sur une autre feuille. Voici l'erreur:
      Worksheets("PV").QueryTables.Add("TEXT;" & Fichier, [A1]).Refresh 'à adapter

      Voici le lien de mon fichier:
      https://www.cjoint.com/c/FBrkgiXdY75
      0
    4. Avant d'essayer le code concernant ma deuxième question, je rencontre un petit problème. Hier j'ai testé la solution de ton lien:
      https://forums.commentcamarche.net/forum/affich-33039694-recuperation-donnees-avec-macro#p33168496

      J'ai réussi à la faire fonctionner en appuyant sur la touche F5. Cependant, aujourd'hui j'ai essayé de refaire un classeur avec ce code sur un autre pc et lorsque j'appuie sur F5 la boite de dialogue ne s'éxécute pas.
      Voici la fenêtre affichée:
      http://image.noelshack.com/fichiers/2016/07/1455704632-capture.png
      0
  2. Bonjour
    si tu peux donne un fichier TXT
    A+
    Maurice
    0
    1. Déjà merci de votre aide.

      Ci-dessous, j'ai joint mon fichier:
      https://www.cjoint.com/c/FBrkphD13j5

      Dans la feuille "PV", on voit comment sont copiées les données. Dans la feuille exemple, on retrouve la manière dont je voudrais qu'elles soient copiées ("Assistant importation de texte" de manière automatique).

      Voici un exemple de fichier texte que je voudrais copier:
      https://www.cjoint.com/c/FBrkogJqJk5
      0
      1. Contributeur
        Voilà le classeur opérationnel:

        http://www.cjoint.com/c/FBrnOtYDaiQ
        0
        1. Merci pour le fichier. Je trouve cette méthode plus simple.

          Par contre, sais tu copier les données de la même manière que sur la feuille exemple ?Pour chaque ligne du code, je voudrais que les données suivant un espace soient inscrites dans la cellule de droite. En manuel, la fonction utilisée est "Assistant importation de texte".
          0
        2. Contributeur
          Normalement si tu cliques sur Importer texte, ça le fait!
          0
        3. Ça ne fonctionne pas chez moi.
          0
        4. Contributeur
          @ath80Tu cliques sur Développeur dans le ruban, ensuite en haut à gauche tu cliques sur Enregistrer une macro.
          Ensuite tu exécutes la procédure que tu fais habituellement avec "Assistant importation de texte". Quand tu as fini, tu cliques sur Arrêter macro. Tu vas dans l'éditeur dans module à gauche tu as ta macro. Tu la copies et tu la postes. Je l'automatiserais.

          pour afficher l'onglet Développeur dans le ruban:

          https://support.office.com/fr-fr/article/Afficher-l-onglet-D%C3%A9veloppeur-ou-ex%C3%A9cuter-le-mode-d%C3%A9veloppeur-1b4a8529-3094-432a-9a7f-53935089e5ed
          0
        5. J'avais déjà essayé en enregistrant une macro et j'obtiens uniquement ce code:

          Sub Macro1()
          Range("A1").Select
          ActiveSheet.PasteSpecial Format:="Texte Unicode", Link:=False, _
          DisplayAsIcon:=False
          End Sub
          0
      2. Contributeur
        Bon je l'ai fait, voilà à mettre à la place de l'ancienne:

        Option Explicit
        Sub Bouton6_Clic()
        Dim Fichier
        Worksheets("PV").Select
            Fichier = Application.GetOpenFilename("Text Files (*.txt), *.txt")
            If Fichier <> False Then
             With ActiveSheet.QueryTables.Add(Connection:= _
                "TEXT;" & Fichier, Destination:=Range("A1"))
                .Name = "essai"
                .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 = True
                .TextFileTabDelimiter = True
                .TextFileSemicolonDelimiter = False
                .TextFileCommaDelimiter = False
                .TextFileSpaceDelimiter = True
                .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
                .TextFileTrailingMinusNumbers = True
                .Refresh BackgroundQuery:=False
            End With
            Else
                MsgBox "Pour importer des données dans Excel, vous devez choisir un fichier texte !"
            End If
        End Sub
        

        0
        1. Oui justement j'allais répondre, j'ai trouvé la solution. J'ai mis ça pour la fin du code:
          .TextFileConsecutiveDelimiter = True
          .TextFileTabDelimiter = True
          .TextFileSemicolonDelimiter = True
          .TextFileCommaDelimiter = True
          .TextFileSpaceDelimiter = True
          .TextFileOtherDelimiter = ""
          .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
          .TextFileTrailingMinusNumbers = True
          .Refresh BackgroundQuery:=False

          Merci beaucoup en tout cas !!
          0
      3. Bonjour,
        J'ai une question qui n'a rien à avoir avec ma question initiale.

        Voici mon fichier:
        https://www.cjoint.com/c/FBsrqUPk1SR

        Le module "programme_principal" pilote l'ensemble des autres modules.
        A partir de celui-ci, je supprime l'ancienne feuille "PV". Je vais copier le nouveau fichier dans celle-ci. Dans le module "detection_erreur_pv", je regarde si deux cellules sont vides, j'affiche un message si la condition est vérifiée et dans chacun des cas je voudrais arrêter l'éxécution de l'ensemble des modules. C'est à dire aller à la fin du module "programme_principal" sachant qu'après le call detection_erreur_pv, il y aura d'autres macros.

        Comment faire ?
        0
        1. Contributeur
          Avec une variable Boolean déclarée Public pour fonctionner dans tous les modules:

          Insérer un module et mettre:

          Option Explicit
          
          Public continuer As Boolean


          Dans le module Sub detection_erreur_pv() parce que c'est le dernier

          Sub detection_erreur_pv()
          
          Sheets("PV").Select
          
          If Cells(8, 3).Value = "" Then MsgBox "Numéro de l'OP manquant"
          If Cells(9, 4).Value = "" Then MsgBox "Numéro de l'OP manquant"
          continuer = False
          End Sub
          


          et dans le module principal:

          Sub programme_principal()
          Application.ScreenUpdating = False
          continuer = True
          Call suppression_pv
          Call ouverture_pv
          Call detection_erreur_pv
          Sheets("Synthèse").Select
          If continuer = False Then
          Exit Sub
          Else
          'tes macros
          End If
          
          End Sub
          


          Tu comprends le principe, après tu fais ta sauce, c'est juste une direction à prendre

          @+ Le Pivert
          0
        2. Bonjour,
          Merci encore une fois pour ton aide !
          https://www.cjoint.com/c/FBtlcJOe4ac

          En dessous de else j'ai mis la suite du programme à réaliser s'il ne manque pas de paramètres.

          Quand j'importe un fichier avec des paramètres manquants le programme se stoppe par contre quand il y a l'ensemble des paramètres (Cells(8, 3) et Cells(9, 4) le programme se stoppe également.
          Dans mon exepemple, s'il ne manque pas de paramètre je voudrais que les étapes suivantes soient réalisées:
          Call fermeture

          Sheets("Synthèse").Select

          J'ai joint un fichier avec paramètre manquant:
          https://www.cjoint.com/c/FBtldqVPAzc

          et un sans:
          https://www.cjoint.com/c/FBtlekqYLzc
          0
        3. Contributeur
          Voilà,

          Sub detection_erreur_pv()
          Sheets("PV").Select
          If Cells(8, 3).Value = "" Then
          MsgBox "Numéro de l'OP manquant"
          continuer = False
          ElseIf Cells(9, 4).Value = "" Then
          MsgBox "Numéro de machine manquant"
          continuer = False
          Else
          continuer = True
          End If
          End Sub
          


          Petite précision, tu n'es pas obligé de mettre chaque macro dans un module différent, tu peux tout mettre dans le même module. Cela permet de faire des déclarations communes a chaque macro en dehors des macros en dessous de Option Explicit. Cela t'évite aussi de faire une déclaration de variable Public. A toi de voir!
          0
      4. Bonjour.
        Je n'ai pas bien compris aussi ta deuxième question. Et le fichier que tu as joint est corrompu. Ajoute de nouveau ton fichier pour que l’on puisse avoir une bonne idée de ta deuxième question.
        Merci.
        0
        1. Contributeur
          Bonjour h3ler,

          Le fichier n'est pas corrompu, il fonctionne bien; J'ai déjà répondu à la demande

          @+ Le Pivert
          0
      5. Bonjour,
        Ci-joint le fichier modifié:
        https://www.cjoint.com/c/FBwnjGlEEJa

        Lorsque j'importe un fichier sans erreur l'ensemble du programme est exécuté c'est donc bon par contre quand j'importe un fichier avec des infos manquantes l'ensemble du programme est également exécuté (le module fermeture est exécuté). Je ne comprends pas pourquoi puisque si continuer = false on doit exécuter:
        Exit Sub
        0
        1. Contributeur
          Cela fonctionne comme indiqué:

          Si le fichier est vrai, cela ferme et sélectionne la feuille Synthèse
          Si le fichier est faux un message apparaît et le programme s'arrête. Mais on reste sur la feuille où est situé le bouton, c'est à dire le feuille Synthèse.

          C'est cela qui te trompe. A moins que tu veuille faire autre chose?
          0
          1. Mon problème est le suivant:
            Si le fichier est faux un message apparaît mais le programme ne s'arrête pas. Il continue d'exécuter la fin du programme c'est à dire:
            Call fermeture
            Sheets("Synthèse").Select

            Je souhaiterai qu'il n'exécute pas ces étapes.
            0
          2. Contributeur
            Changer cela dans les 2 modules

            Option Explicit
            Public continuer As Boolean
            Sub detection_erreur_pv()
            Sheets("PV").Select
            If Cells(8, 3).Value = "" Then
            MsgBox "Numéro de l'OP manquant"
            continuer = False
            ElseIf Cells(9, 4).Value = "" Then
            MsgBox "Numéro de machine manquant"
            continuer = False
            Else
            continuer = True
            End If
            End Sub
            


            Option Explicit
            Sub programme_principal()
            Application.ScreenUpdating = False
            Call suppression_pv 'continuer = true
            Call ouverture_pv 'continuer = true
            Call detection_erreur_pv 'continuer = true
            If continuer = False Then
            Exit Sub 'continuer = false
            Else
                Call fermeture 'continuer = true
            Sheets("Synthèse").Select 'continuer = true
            End If
            Application.ScreenUpdating = True
            End Sub
            


            @+
            0
          3. Bonjour,
            Là c'est le phénomène inverse qui se produit. Lorsque j'importe un fichier faux (avec paramètres manquants) le programme s'arrête. Lorsque j'importe un fichier vrai, le programme s'arrête aussi alors que je souhaiterai que la suite du programme soit réalisée dans cette condition:
            Call fermeture
            Sheets("Synthèse").Select

            J'ai remarqué que le premier code était identique à celui que j'avais déjà.
            0
          4. C'est bon il s'agit d'une erreur de ma part.
            Au début du programme principal j'avais ajouté:
            Option Explicit
            Public continuer As Boolean

            Au lieu de:
            Option Explicit

            Je ne comprends pas pourquoi cela a un impact ...
            0
        2. Contributeur
          Voici le classeur corrigé. Pour voir la différence des 2 actions, saisir du texte dans la cellule A1 de la feuille Exemple.

          Sub fermeture()
              Sheets("exemple").Select
              Cells.Select
              Range("A1").Activate
              Selection.ClearContents
          End Sub


          comme le montre cette macro:
          Si c'est true la cellule A1 sera effacée, sinon elle restera telle quel

          http://www.cjoint.com/c/FBxh2H2qEsQ
          0
          1. Le lien à l'air mort mais comme dit précédemment je suis parvenu à réaliser ce que je voulais faire.

            Merci beaucoup !
            0