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 :

Extraire une chaine de caractères d'un fichier texte et le placer dans une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de Dennis Nedry
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 88
    Points
    88
    Par défaut Extraire une chaine de caractères d'un fichier texte et le placer dans une cellule
    Bonjour.

    Je dispose d'un dossier dans lequel plusieurs dizaine de milliers de fichiers texte sont entreposés. Dans chacun de ces fichier se trouve une information, et une seule, nécessaire.

    Je dispose d'un classeur excel dans lequel je désire récupérer ces informations.

    Chaque fichier se nome file 1, file 2, file 3... (fichiers sans extension)

    Dans la colonne A, j'ai l'identifiant (un nombre entier, de 1 à 21000).

    Dans la colonne B, je souhaite avoir la donnée extraite du fichier.

    La donnée se trouve entre des bornes de type <name>madonnée</name>, qui sont uniques au fichier.

    J'ai essayé de regarder par moi-même, mais je n'y arrive pas... mon cerveau n'a plus touché de VBA depuis plus de 4 ans.

    Voilà ce que mon code devrait faire, d'après ce que j'ai essayé de faire:

    Boucle loop, de 1 à 21000 (ou plus selon les limites du classeur)

    ouverture du fichier n

    loop sur chaque ligne du fichier n

    si donnée trouvée entre <name> et </name>, l'écrire dans la cellule. (méthode instr?)

    fin loop sur chaque ligne du fichier n

    fin du loop, passage au fichier n+1
    J'ai essayé de bidouiller avec du code trouvé à droite à gauche, mais là, je sèche totalement... notamment sur la façon de boucler sur chaque ligne de ma feuille, et de l'écrire dans la cellule correspondante.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Points : 251
    Points
    251
    Par défaut
    Pour aller chercher des données dans un fichier texte, tu peux utiliser la classe TextStream.

    Si tu as déjà fait un peu de VB, fais une petite recherche sur Google et ça devrait aller...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut
    Transformez votre description en constantes ayant des noms et des commentaires choisis par vous. C'est 50% de la solution si la description est précise car elle donne la structuration du programme.

    Dans Excel, ouvrir le Visual Basic Editor (Alt+F11).
    Cliquez sur le VBE (Visual Basic Editor) menu "Insérer" > "Module".
    Module 1 est créé.

    Dans les propriétés de Module1, renommez Module1 en ModParser.
    Dans la fenêtre d'Edition du module ModParser, copier-coller et compléter le code VBA suivant :
    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
    Option Explicit ' Parser de fichiers textes entre les tags <name>...</name>
    ' ============================== Description des fichiers textes à analyser : SOURCE
    Public Const nbrIdFileMax = 21000 ' Nombre maximum de fichiers à traiter
    Public Const filenamePrefixe = "file " ' + un n° de 1 à nbrIdFileMax. Notez le blanc séparateur.
    ' Indiquez la position du tag sur une ligne de texte. Exemple : il commence en colonne 1.
    ' <name>madonnée</name> ' Le tag est seul sur la ligne. Retour-chariot est après le tag de fermeture
    Public Const strTagNameOpen = "<name>" ' Ce tag est unique dans chaque fichier
    Public Const strTagNameClose = "</name>" ' Ce tag ferme la donnée à extraire
    
    ' ============================== Description de la feuille CIBLE
    Public Const nomFeuilleCible = "Feuil 1" ' Feuille cible à remplir. Donnez le nom correct.
    ' Décrire en déclarant les constantes de chaque rangée et colonne cible et commenter les.
    Public Const rowFileFirst = 1 ' Première rangée on l'on écrit la valeur du tag extraite du fichier n° 1
    
    Public Const colId = 1 ' Dans la colonne A, j'ai l'identifiant (un nombre entier, de 1 à nbrIdFileMax).
    Public Const colTagInfo = colId  + 1 ' Dans la colonne B, je souhaite avoir la donnée extraite du fichier.
    Donnez l'extrait significatif de "file 1" entre les balises [code] et [/code] ainsi que vos tentatives (ouverture fichiers textes à traiter, gestion d'erreur, lecture des lignes, etc. même si certaines procédures peuvent encore vides.)
    ___________

    En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.

  4. #4
    Membre régulier Avatar de Dennis Nedry
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Points : 88
    Points
    88
    Par défaut
    Un grand merci pour votre aide à tous! MattChess, je ne connaissais pas les modules, mais maintenant j'en apprécie toute leur valeur!

    L'objectif de mon programme était de récupérer la liste de tous les membres inscrits sur un forum. Pour cela, je récupère les formulaires d'envoi de message privé, et je travaille à partir de ces données.

    La ligne contenant le nom de l'utilisateur est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="./memberlist.php?mode=viewprofile&amp;u=82">Piero Della Francesca</a></strong>&nbsp;<input class="post" type="submit" name="remove_u[82]" value="Remove" />&nbsp;         </span>
    Pour compliquer la chose, si un membre fait partie d'un groupe (modérateur, admin, bot moteur de recherche), son nom est d'une couleur particulière, et le code est très légèrement différent dans ce cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="./memberlist.php?mode=viewprofile&amp;u=2" style="color: #AA0000;" class="username-coloured">Marc Tapage</a></strong>&nbsp;<input class="post" type="submit" name="remove_u[2]" value="Remove" />&nbsp;           </span>
    Pour pimenter le tout, je me suis aussi amusé à récupérer le code couleur pour ces membres spéciaux, afin de les classer dans leurs groupes respectifs.

    Ce qui nous donne le programme suivant, qui tourne à merveille (moins de 10 minutes pour récupérer tous les noms depuis les 21,000 enregistrements):

    Module 1:
    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
    Option Explicit ' Parser de fichiers textes entre les tags <name>...</name>
    ' ============================== Description des fichiers textes à analyser : SOURCE
    Public Const nbmin = 1 ' Premier fichier à analyser - si l'on doit compléter la liste ultérieurement, ça servira.
    Public Const nbmax = 21000 ' numéro du dernier fichier à analyser, ça servira.
    Public Const nomfichier = "D:\Documents\memberlist\file " ' + un n° de 1 à nbmax. chemin complet des fichiers.
    'exemple de ligne administrateur:
    '<a href="./memberlist.php?mode=viewprofile&amp;u=2" style="color: #AA0000;" class="username-coloured">Marc Tapage</a></strong>&nbsp;<input class="post" type="submit" name="remove_u[2]" value="Remove" />&nbsp;           </span>
    'exemple de ligne utilisateur lambda:
    '<a href="./memberlist.php?mode=viewprofile&amp;u=82">Piero Della Francesca</a></strong>&nbsp;<input class="post" type="submit" name="remove_u[82]" value="Remove" />&nbsp;         </span>
    Public Const tagdeb = "le&amp;u=" ' tag indiquant le début des informations, multiple.
    Public Const tagfin = "</a></strong>&nbsp;<input class=" ' Ce tag ferme la donnée à extraire
    Public Const tagadmin = "username-coloured" ' tag de vérification profil administrateur/mod/bot. On appellera "admin" toute personne ayant un statut différent d'un membre quelconque, ce qui se repère grace à la couleur de son nom.
    ' ============================== Description de la feuille CIBLE
    Public Const feuillecible = "memberlist" ' Feuille cible à remplir. Donnez le nom correct.
    ' Décrire en déclarant les constantes de chaque rangée et colonne cible et commenter les.
    Public Const rowFileFirst = 1 ' Première rangée on l'on écrit la valeur du tag extraite du fichier n° 1
     
    Public Const colId = 1 ' Dans la colonne A, j'ai l'identifiant (un nombre entier, de 1 à nbrIdFileMax).
    Public Const colTagInfo = colId + 1  ' Dans la colonne B, je souhaite avoir la donnée extraite du fichier.
    Objet, appliqué à ma feuille 1:
    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
    46
    47
    48
    49
    50
    51
    52
    53
     
     
    'début du programme
    Sub extraction()
    Dim ifile As Integer
    ifile = FreeFile
    Dim Data As String
    Dim endtext As Integer
    Dim debtext As Integer
    Dim admin As Integer
    Dim largeur As String
     
     
    Dim numfichier As Integer 'numéro de fichier en cours d'analyse.
     
     
    'début réel du programme: on va aller voir les fichiers un par un.
    For numfichier = nbmin To nbmax
     
        'ouverture du fichier
        Open nomfichier & numfichier For Input As #ifile
        'lecture du fichier ligne par ligne
        Do While Not EOF(ifile)
            Line Input #ifile, Data 'Récupère la ligne
            endtext = InStr(1, Data, tagfin)
            debtext = InStr(1, Data, tagdeb)
            admin = InStr(1, Data, tagadmin)
                If endtext <> 0 Then 'on regarde si le tag de fin est présent dans la ligne
     
                    debtext = InStr(1, Data, tagdeb)
                    admin = InStr(1, Data, tagadmin)
     
                    'vérification si admin
                    If admin <> 0 Then
                        'admin detecté. On récupère le code couleur que l'on met dans la colonne C.
                        Cells(numfichier, 3) = Mid(Data, admin - 16, 4)
                        'on ajoute le nom de l'admin
                        Cells(numfichier, 2) = Mid(Data, admin + 19, endtext - admin - 19)
                    Else
     
                        largeur = numfichier 'la fonction LEN() ne marchant que pour des variables de type string ou object, on copie numfichier (integer) dans largeur (string)
                        largeur = Len(largeur)
     
                        'Ajout du nom du membre dans la colonne B.
                        Cells(numfichier, 2) = Mid(Data, debtext + 11 + largeur, endtext - (debtext + 11 + largeur))
                    End If
                End If
     
     
        Loop
        Close #ifile 'fermeture du fichier
    Next numfichier
    End Sub
    Le code tourne à merveille. Cependant, en récupérant Data de manière brute, j'ai remarqué qu'il contient l'ensemble du fichier, et non une seule ligne. Pour un gain de temps, devrais-je mettre toute ma partie d'analyse de la ligne après le loop, afin de le faire qu'une fois par fichier, et non plus une fois par ligne?

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/12/2011, 14h22
  2. Réponses: 2
    Dernier message: 13/02/2011, 10h08
  3. Réponses: 14
    Dernier message: 29/05/2010, 12h19
  4. extraction d'une chaine de caractère d'un fichier texte
    Par c_salsabil dans le forum Général Java
    Réponses: 1
    Dernier message: 31/12/2009, 15h27
  5. Lire un fichier Texte d'1 bloc dans une chaine
    Par User dans le forum Langage
    Réponses: 6
    Dernier message: 13/09/2006, 21h56

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