Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/08/2011, 11h54   #1
Membre du Club
 
Avatar de Dennis Nedry
 
Étudiant
Inscription : septembre 2007
Messages : 68
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2007
Messages : 68
Points : 45
Points : 45
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:

Citation:
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.
__________________
If Ramage = Plumage Then
Phenix_des_hôtes_de_ces_bois = True
End If
Dennis Nedry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 12h51   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
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...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 13h18   #3
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
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 :
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.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/08/2011, 10h26   #4
Membre du Club
 
Avatar de Dennis Nedry
 
Étudiant
Inscription : septembre 2007
Messages : 68
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2007
Messages : 68
Points : 45
Points : 45
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 :
<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 :
<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 :
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 :
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?
__________________
If Ramage = Plumage Then
Phenix_des_hôtes_de_ces_bois = True
End If
Dennis Nedry est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h34.


 
 
 
 
Partenaires

Hébergement Web