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 :

récupération ligne d'un fichier texte dans un classeur


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef projet informatique agricole
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Chef projet informatique agricole
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Points : 4
    Points
    4
    Par défaut récupération ligne d'un fichier texte dans un classeur
    Bonjour,

    Après quelques recherches sur le forum j'ai trouvé une partie de la solution à mon problème, à savoir : J'ai un classeur A dans lequel je voudrais récupérer des lignes d'un fichier B.txt (séparateur tabulation).
    Idéalement il faudrait que la macro fasse une boucle et récupère ligne après ligne certaines cellules du B.xls et les recopie dans mon classeur de destination A.xls

    Dans un premier temps j'ai réussi a trouver une macro pour transformer le fichier B.txt (sep par tabulation) en fichier B.xls via la macro :

    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
    Sub transformation()
     
     With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;B.txt", Destination:=Range("$A$1"))
            .Name = "transformation "
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = True
            .TextFilePlatform = 1254
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierNone
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
     
        ActiveWorkbook.SaveAs Filename:="B.xls", FileFormat:= _
            xlWorkbookNormal, CreateBackup:=False
    End Sub
    Ensuite je souhaite que cette macro s’exécute dès l'ouverture de mon classeur A.xls, j'utilise la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
              transformation
    End Sub
    Le premier problème étant que la macro de transformation s’exécute à l'ouverture du classeur A.xls et ouvre automatiquement le résultat de la transformation dans la feuil 1 de mon classeur A en remplacant le contenu originel de cette feuil1... Je voudrais simplement que cette macro de transformation se déroule en arrière plan sans que ce classeur B.xls ne s'ouvre..

    Y a t-il un moyen pour que suite à ma transformation de fichier B.txt en B.xls, ce dernier ne s'ouvre pas et n'écrase pas le contenu de mon classeur A ?

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Salut,

    Oui, un moyen étant de lire directement dans le fichier txt.

    Pour ça : Active la référence "Microsoft Scripting Runtime" puis :

    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
    Dim FSO As New FileSystemObject
     
    Sub LireFichier()
     
    Dim Txt As TextStream
    Set Txt = FSO.OpenTextFile("D:\Fichier.txt") 'Ici tu mets le chemin de ton fichier
    Dim Lig As Integer
    Dim Ligne As String
    Dim TableauLigne As Variant
     
    Do Until Txt.AtEndOfStream
        Lig = Lig + 1
        Ligne = Txt.ReadLine
        TableauLigne = Split(Ligne, vbTab) 'Sous le nom "TableauLigne" seront stockées autant de valeurs que tu as de "colonnes" (séparées par Tab) dans la ligne de ton fichier texte
        'Ici, tu peux récupérer les valeurs voulues si tu souhaites en récupérer certaines en particulier :
    '    Range("A" & Lig).Value = TableauLigne(0)
    '    Range("B" & Lig).Value = TableauLigne(2)
    '    Range("C" & Lig).Value = TableauLigne(5)
     
        'Ou alors, tu peux tout récupérer d'un coup, ligne par ligne :
        Range("A" & Lig).Resize(1, UBound(TableauLigne) + 1).Value = TableauLigne 
        'LBound(Tableau) donnera l'index du premier item du tableau, par défaut "0" et UBound donnera celui du dernier (donc valant le nombre d'items -1 vu que ça commence à 0 par défaut)
        'Si ta ligne a 10 colonnes, ça donnera donc 9 + 1 donc bien 10. Ça étendra donc la plage de A1 à : A1:A10 par exemple
     
    Loop
     
    End Sub

  3. #3
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut

    Bonjour, bonjour !

    Comme la présentation n'est pas des plus claires, je dirais juste le VBA a déjà tout ce qu'il faut en interne
    pour lire un pauvre fichier texte sans utiliser un élément externe comme FileSystemObject
    que ce soit ligne par ligne ou dans son intégralité en une seule instruction !

    Voir les nombreux exemples sur ce sujet dans les discussions de ce forum sans compter l'aide VBA interne …

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Effectivement, je n'ai pas précisé que tu peux également le faire sans le FileSystemObject, moi je le fais par habitude et par préférence...

  5. #5
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Pour la lecture de fichiers texte, pas de souci mais pour la recherche de fichiers FSO est souvent bien lent …

    Et penser aussi à ceux qui sont sur MAC !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  6. #6
    Candidat au Club
    Homme Profil pro
    Chef projet informatique agricole
    Inscrit en
    Juillet 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Chef projet informatique agricole
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2016
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci de ta réponse Quentin, en prenant ta procédure j'ai choisi de prendre l'option "tout récupérer d'un coup"
    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
     
    Dim FSO As New FileSystemObject
     
    Sub LireFichier()
     
    Dim Txt As TextStream
    Set Txt = FSO.OpenTextFile("M:\Champs d'@venir 2\Conseil\Bon de commande\conseil_FORM.txt") 'Ici tu mets le chemin de ton fichier
    Dim Lig As Integer
    Dim Ligne As String
    Dim TableauLigne As Variant
     
    Do Until Txt.AtEndOfStream
        Lig = Lig + 1
        Ligne = Txt.ReadLine
        TableauLigne = Split(Ligne, vbTab) 'Sous le nom "TableauLigne" seront stockées autant de valeurs que tu as de "colonnes" (séparées par Tab) dans la ligne de ton fichier texte
     
        'tu peux tout récupérer d'un coup, ligne par ligne :
        Range("A" & Lig).Resize(1, UBound(TableauLigne) - LBound(TableauLigne)).Value = TableauLigne
     
    Loop
     
    End Sub
    Par contre je ne vois pas comment réutiliser les valeurs stockées dans "tableauligne"... Autrement dit comment paramétrer la destination des lignes copiées pour qu'elles s'insèrent dans ma feuil1 du classeur vierge??
    Idéalement, la première cellule à remplir est la E17 avec la "cellule" E2 du fichier txt... puis la cellule E18 avec la cellule E3 du txt et ensuite de suite jusqu'à la dernière ligne du fichier TXT....

    J'espère que ma question reste suffisamment claire ?? auquel cas désolé je tacherais de faire mieux

  7. #7
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut
    Techniquement, que faut-il réaliser ?!

    Deux choses l'une :

    • soit importer directement dans une feuille spécifique l'intégralité du fichier texte par exemple via QueryTables
    s'il s'agit de sauvegarder les données au format Excel;

    • soit lire directement les données du fichier texte pour les intégrer dans la feuille de destination
    si la sauvegarde du fichier texte au format Excel n'est pas le but …

    Les débutants peuvent aussi utiliser le B-A-BA d'Excel, à savoir l'ouverture directe d'un fichier texte dans Excel
    (lire donc enfin l'aide VBA concernant les méthodes Workbook.Open et .OpenText !)
    leur rendant la tâche de recopie plus simple de feuille à feuille au lieu de données en mémoire vers une feuille,
    pour ceux ayant du mal à réfléchir & à conceptualiser (idem à QueryTables) …

    Ce n'est pas compliqué de décrire et expliquer !

    _________________________________________________________________________________________________________
    L'effort fait les forts …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Toujours avec le FSO

    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
    Dim FSO As New FileSystemObject
     
    Sub LireFichier()
     
    Dim Wb As Workbook
    Set Wb = Workbooks.Add 'Ou Workbooks.Open([Chemin]) si tu veux ouvrir un fichier existant
    Dim Ws As Worksheet
    Set Ws = Wb.Sheets("Feuil1")
     
    Dim Txt As TextStream
    Set Txt = FSO.OpenTextFile("M:\Champs d'@venir 2\Conseil\Bon de commande\conseil_FORM.txt") 'Ici tu mets le chemin de ton fichier
    Txt.ReadLine 'on lit une fois pour passer directement à la ligne 2, comme tu as dit que tu voulais commencer qu'à la seconde ligne
     
    Dim Lig As Integer
    Dim Ligne As String
    Dim TableauLigne As Variant
    Dim TabTemp As Variant
     
    Lig = 16 'On commencera donc à écrire en ligne 16+1 
     
    Do Until Txt.AtEndOfStream
        Lig = Lig + 1
        Ligne = Txt.ReadLine
        TabTemp = Split(Ligne,vbTab,5) 'Coupera en un tableau dont la dernière ligne contiendra tout ce qui t'intéresse, c'est à dire la chaîne de caractères commençant en colonne "E"
        TableauLigne = Split(TabTemp(4), vbTab) 'Sous le nom "TableauLigne" seront stockées autant de valeurs que tu as de "colonnes" (séparées par Tab) dans la chaîne de caractères que l'on a récupérée de la ligne de ton fichier texte
     
        'tu peux tout récupérer d'un coup, ligne par ligne :
        Ws.Range("E" & Lig).Resize(1, UBound(TableauLigne) + 1).Value = TableauLigne
    Loop
     
    'Ensuite, tu peux faire ce que tu veux avec le classeur de destination "Wb", l'enregistrer par exemple
    Wb.SaveAs [Chemin voulu]
     
    End Sub
    Quelqu'un a peut-être plus simple... On aurait pu également boucler dans le "TableauLigne" à partir de la 4ème valeur, mais ça aurait rajouté des boucles... Je pense que l'idée du Tableau temporaire qui ne sert qu'à éliminer les données des colonnes A à D du fichier texte est intéressante...

  9. #9
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut




    Réalisable alors avec le B-A-BA d'Excel : la fonction de feuille de calculs INDEX, même en VBA !
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

Discussions similaires

  1. [Batch] Mettre une ligne d'un fichier texte dans une variable
    Par guiguir68 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/08/2014, 16h45
  2. Récupération de certaines lignes d'un fichier texte
    Par D_light dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 31/10/2012, 16h46
  3. [Débutant] rentrer dans une certaine ligne d'un fichier texte Possible?
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/04/2010, 00h16
  4. Insérer une ligne d'un fichier texte dans une table
    Par Atemi76 dans le forum Administration
    Réponses: 1
    Dernier message: 10/07/2007, 17h32
  5. recuperer 3 float dans une ligne d'un fichier texte
    Par obiwankennedy dans le forum C++
    Réponses: 3
    Dernier message: 14/03/2006, 03h59

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