Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

impossible de récupérer sous excel des données d'un fichier texte

4 réponses
Avatar
Trèfle
Bonjour,

Dans un classeur Excel, je liste en colonne C tous les classeurs contenus
dans un dossier, et je voudrais faire une macro pour modifier dans tous les
fichiers texte (1000 env.) de type doc*.inc (ils s'ouvrent avec le
bloc-note), 2 caractères sur la ligne 2 (sans toucher aux autres lignes) .
Il s'agit de remplacer un "ne" par "bl", ou autre cas, de un "ra" par "rb"
Ces fichiers blocs-notes ont une quinzaine de lignes et les 2 1ère ligne
toujours les mêmes, soit :
<?
$type = "ne";

, sauf les 2 caractères entre"" qui peuvent varier, mais toujours au nombre
de 2

J'ai essayé avec l'aide en ligne de Excel de récupérer ces données de type
String dans une variable, mais j'ai une erreur d'exécution N°62 : "l'entrée
dépasse la fin du fichier" avec le programme suivant :
Dim MyChar, MyChars, mon_fichier As String
mon_fichier = [C1]
MyChars = ""
Open mon_fichier For Input As #1 ' Ouvre le fichier.
Do While Not EOF(1)
MyChar = Input(1, #1)
MyChars = MyChar & CStr(Input(1, #1))
' Debug.Print MyChar Loop
MsgBox MyChars
Close #1

Dans l'exemple du guide VBA excel, la ligne initiale "Debug.Print MyChar
Loop" affiche bien tous les caractères dans la fenètre d'exécution...mais je
n'arrive pas à récupérer dans une variable string les caractères...
L'idée étant après, avec les fonctions left et right faire la correction
voulue, de le coller dans un nouveau fichier texte que j'aurais réenregistré
sous le nom initial avec un DisplayAlerts= False ...
C'est un peu compliqué, et ce que je sais en vba atteint vite les limites!
Cela vous semble-t-il faisable par Excel, bien que cela ne soit pas la
vocation initiale du vba sous excel.


Merci


Pour exemple, voici un fichier standard à traiter :
<?
$type = "ne";
$fileid = "1744";
$status = "a";
$creadate = "200807171412";
$moddate = "200807211820";
$author = stripslashes("Toto");
$email = stripslashes("jean.toto@orange.fr");
$fielda1 = stripslashes("");
$fielda2 = stripslashes("");
$fieldb1 = stripslashes("10 jours à Paris");
$fieldb2 = stripslashes("");
$fieldc1 = stripslashes("Super voyage <br /><br /><embed
id=\"VideoPlayback\" style=\"width:500px;height:406px\"
allowFullScreen=\"true\"
src=\"http://video.google.com/googleplayer......=fr&fs=true\"
type=\"application/x-shockwave-flash\"> </embed>");
$fieldc2 = stripslashes("");
$fieldd1 = stripslashes("");
$fieldd2 = stripslashes("");
$fieldweb = stripslashes("");
$fieldmail = stripslashes("");
?>

4 réponses

Avatar
Silve Hervé
Bonsoir Trèfle,

Teste d'abords sur deux ou trois fichiers pour voir si tu as le résultat
escompté. Lance la proc "EffectuerModif", j'ai commenté le code pour plus de
compréhension :

Sub EffectuerModif()
Dim I As Integer
Dim Der As Integer

'recherche la dernière ligne
Der = [C65536].End(xlUp).Row

'parcour toutes les lignes de la colonne C
For I = 1 To Der
LireEtModifierFichierTexte Range("C" & I).Value, "bl"
Next I

End Sub

Sub LireEtModifierFichierTexte(Fichier As String, Lettre As String)
Dim Tbl() As String
Dim Index As Integer
Dim I As Integer

'récupère un index libre
Index = FreeFile

'ouvre le fichier en lecture
Open Fichier For Input As #Index

'parcour tout le fichier et
'stocke les lignes dans un tableau
Do While Not EOF(Index)
I = I + 1
ReDim Preserve Tbl(1 To I)
Input #Index, Tbl(I)
Loop

'ferme le ficher en lecture
Close #Index

'et l'ouvre en écriture
Open Fichier For Output As #Index

'effectue la modif dans le tableau
'à la 2ème ligne
Tbl(2) = "$type = """ & Lettre & """"

'réinscrit le tout dans le fichier
For I = 1 To UBound(Tbl)
Print #Index, Tbl(I)
Next I

'ferme le ficher en écriture
Close #Index

Erase Tbl

End Sub


Hervé.




"Trèfle" a écrit dans le message de
news:%23$
Bonjour,

Dans un classeur Excel, je liste en colonne C tous les classeurs contenus
dans un dossier, et je voudrais faire une macro pour modifier dans tous
les fichiers texte (1000 env.) de type doc*.inc (ils s'ouvrent avec le
bloc-note), 2 caractères sur la ligne 2 (sans toucher aux autres lignes) .
Il s'agit de remplacer un "ne" par "bl", ou autre cas, de un "ra" par "rb"
Ces fichiers blocs-notes ont une quinzaine de lignes et les 2 1ère ligne
toujours les mêmes, soit :
<?
$type = "ne";

, sauf les 2 caractères entre"" qui peuvent varier, mais toujours au
nombre de 2

J'ai essayé avec l'aide en ligne de Excel de récupérer ces données de type
String dans une variable, mais j'ai une erreur d'exécution N°62 :
"l'entrée dépasse la fin du fichier" avec le programme suivant :
Dim MyChar, MyChars, mon_fichier As String
mon_fichier = [C1]
MyChars = ""
Open mon_fichier For Input As #1 ' Ouvre le fichier.
Do While Not EOF(1)
MyChar = Input(1, #1)
MyChars = MyChar & CStr(Input(1, #1))
' Debug.Print MyChar Loop
MsgBox MyChars
Close #1

Dans l'exemple du guide VBA excel, la ligne initiale "Debug.Print MyChar
Loop" affiche bien tous les caractères dans la fenètre d'exécution...mais
je n'arrive pas à récupérer dans une variable string les caractères...
L'idée étant après, avec les fonctions left et right faire la correction
voulue, de le coller dans un nouveau fichier texte que j'aurais
réenregistré sous le nom initial avec un DisplayAlerts= False ...
C'est un peu compliqué, et ce que je sais en vba atteint vite les limites!
Cela vous semble-t-il faisable par Excel, bien que cela ne soit pas la
vocation initiale du vba sous excel.


Merci


Pour exemple, voici un fichier standard à traiter :
<?
$type = "ne";
$fileid = "1744";
$status = "a";
$creadate = "200807171412";
$moddate = "200807211820";
$author = stripslashes("Toto");
$email = stripslashes("");
$fielda1 = stripslashes("");
$fielda2 = stripslashes("");
$fieldb1 = stripslashes("10 jours à Paris");
$fieldb2 = stripslashes("");
$fieldc1 = stripslashes("Super voyage <br /><br /><embed
id="VideoPlayback" style="width:500px;height:406px"
allowFullScreen="true"
src="http://video.google.com/googleplayer......=fr&fs=true"
type="application/x-shockwave-flash"> </embed>");
$fieldc2 = stripslashes("");
$fieldd1 = stripslashes("");
$fieldd2 = stripslashes("");
$fieldweb = stripslashes("");
$fieldmail = stripslashes("");
?>





Avatar
Trèfle
Bonjour Silve Hervé

Merci beaucoup,

C'est super (quoique je ne comprends pas encore vraiment tout, mais je vais
approfondir les fonctions utilisées qui me manquaient ; je cerne un peu
l'approche que tu as eu avec la création d'un tableau temporaire ...)
Dans la masse des fichiers, ceux avec "ne" ou "ra" sont mélangés avec
d'autres... est-il possible d'intégrer une différenciation du type filtre
Excel pour n'appliquer que le bon type de correction sur "ne", l'autre type
sur "ra" et bien sûr de laisser les autres intacts ?
Je ne sais pas comment intégrer dans le programme une boucle du genre :
if lit_en_ligne2 "ne" then EffectuerModif de ne vers bl
elseif lit_en_ligne2 "ra" then EffectuerModif de ra vers rb
else on_ne_change_rien ...

Est-ce cela te semble possible

Dans tous les cas, merci beaucoup, j'ai fait un pas de géant que je n'aurais
pu faire et il me reste à apronfondir ce que tu m'as apporté.

Trèfle

"Silve Hervé" a écrit dans le message de news:

Bonsoir Trèfle,

Teste d'abords sur deux ou trois fichiers pour voir si tu as le résultat
escompté. Lance la proc "EffectuerModif", j'ai commenté le code pour plus
de compréhension :

Sub EffectuerModif()
Dim I As Integer
Dim Der As Integer

'recherche la dernière ligne
Der = [C65536].End(xlUp).Row

'parcour toutes les lignes de la colonne C
For I = 1 To Der
LireEtModifierFichierTexte Range("C" & I).Value, "bl"
Next I

End Sub

Sub LireEtModifierFichierTexte(Fichier As String, Lettre As String)
Dim Tbl() As String
Dim Index As Integer
Dim I As Integer

'récupère un index libre
Index = FreeFile

'ouvre le fichier en lecture
Open Fichier For Input As #Index

'parcour tout le fichier et
'stocke les lignes dans un tableau
Do While Not EOF(Index)
I = I + 1
ReDim Preserve Tbl(1 To I)
Input #Index, Tbl(I)
Loop

'ferme le ficher en lecture
Close #Index

'et l'ouvre en écriture
Open Fichier For Output As #Index

'effectue la modif dans le tableau
'à la 2ème ligne
Tbl(2) = "$type = """ & Lettre & """"

'réinscrit le tout dans le fichier
For I = 1 To UBound(Tbl)
Print #Index, Tbl(I)
Next I

'ferme le ficher en écriture
Close #Index

Erase Tbl

End Sub


Hervé.




"Trèfle" a écrit dans le message de
news:%23$
Bonjour,

Dans un classeur Excel, je liste en colonne C tous les classeurs contenus
dans un dossier, et je voudrais faire une macro pour modifier dans tous
les fichiers texte (1000 env.) de type doc*.inc (ils s'ouvrent avec le
bloc-note), 2 caractères sur la ligne 2 (sans toucher aux autres lignes)
.
Il s'agit de remplacer un "ne" par "bl", ou autre cas, de un "ra" par
"rb"
Ces fichiers blocs-notes ont une quinzaine de lignes et les 2 1ère ligne
toujours les mêmes, soit :
<?
$type = "ne";

, sauf les 2 caractères entre"" qui peuvent varier, mais toujours au
nombre de 2

J'ai essayé avec l'aide en ligne de Excel de récupérer ces données de
type String dans une variable, mais j'ai une erreur d'exécution N°62 :
"l'entrée dépasse la fin du fichier" avec le programme suivant :
Dim MyChar, MyChars, mon_fichier As String
mon_fichier = [C1]
MyChars = ""
Open mon_fichier For Input As #1 ' Ouvre le fichier.
Do While Not EOF(1)
MyChar = Input(1, #1)
MyChars = MyChar & CStr(Input(1, #1))
' Debug.Print MyChar Loop
MsgBox MyChars
Close #1

Dans l'exemple du guide VBA excel, la ligne initiale "Debug.Print MyChar
Loop" affiche bien tous les caractères dans la fenètre d'exécution...mais
je n'arrive pas à récupérer dans une variable string les caractères...
L'idée étant après, avec les fonctions left et right faire la correction
voulue, de le coller dans un nouveau fichier texte que j'aurais
réenregistré sous le nom initial avec un DisplayAlerts= False ...
C'est un peu compliqué, et ce que je sais en vba atteint vite les
limites! Cela vous semble-t-il faisable par Excel, bien que cela ne soit
pas la vocation initiale du vba sous excel.


Merci


Pour exemple, voici un fichier standard à traiter :
<?
$type = "ne";
$fileid = "1744";
$status = "a";
$creadate = "200807171412";
$moddate = "200807211820";
$author = stripslashes("Toto");
$email = stripslashes("");
$fielda1 = stripslashes("");
$fielda2 = stripslashes("");
$fieldb1 = stripslashes("10 jours à Paris");
$fieldb2 = stripslashes("");
$fieldc1 = stripslashes("Super voyage <br /><br /><embed
id="VideoPlayback" style="width:500px;height:406px"
allowFullScreen="true"
src="http://video.google.com/googleplayer......=fr&fs=true"
type="application/x-shockwave-flash"> </embed>");
$fieldc2 = stripslashes("");
$fieldd1 = stripslashes("");
$fieldd2 = stripslashes("");
$fieldweb = stripslashes("");
$fieldmail = stripslashes("");
?>








Avatar
LSteph
Bonsoir,

Je n'ai pas même eu le temps de comprendre ce que voulait Trèfle.. mais..

..enfin un code qui a de la ..
propre
avec des variables déclarées et typées comme il faut
Sans fioritures, select ou autres inutilités
C'est plus si souvent qu'on en voit!

J'aime!

Merci RV

--
lSteph



Silve Hervé a écrit :
Bonsoir Trèfle,

Teste d'abords sur deux ou trois fichiers pour voir si tu as le résultat
escompté. Lance la proc "EffectuerModif", j'ai commenté le code pour
plus de compréhension :

Sub EffectuerModif()
Dim I As Integer
Dim Der As Integer

'recherche la dernière ligne
Der = [C65536].End(xlUp).Row

'parcour toutes les lignes de la colonne C
For I = 1 To Der
LireEtModifierFichierTexte Range("C" & I).Value, "bl"
Next I

End Sub

Sub LireEtModifierFichierTexte(Fichier As String, Lettre As String)
Dim Tbl() As String
Dim Index As Integer
Dim I As Integer

'récupère un index libre
Index = FreeFile

'ouvre le fichier en lecture
Open Fichier For Input As #Index

'parcour tout le fichier et
'stocke les lignes dans un tableau
Do While Not EOF(Index)
I = I + 1
ReDim Preserve Tbl(1 To I)
Input #Index, Tbl(I)
Loop

'ferme le ficher en lecture
Close #Index

'et l'ouvre en écriture
Open Fichier For Output As #Index

'effectue la modif dans le tableau
'à la 2ème ligne
Tbl(2) = "$type = """ & Lettre & """"

'réinscrit le tout dans le fichier
For I = 1 To UBound(Tbl)
Print #Index, Tbl(I)
Next I

'ferme le ficher en écriture
Close #Index

Erase Tbl

End Sub


Hervé.




"Trèfle" a écrit dans le message de
news:%23$
Bonjour,

Dans un classeur Excel, je liste en colonne C tous les classeurs
contenus dans un dossier, et je voudrais faire une macro pour modifier
dans tous les fichiers texte (1000 env.) de type doc*.inc (ils
s'ouvrent avec le bloc-note), 2 caractères sur la ligne 2 (sans
toucher aux autres lignes) .
Il s'agit de remplacer un "ne" par "bl", ou autre cas, de un "ra" par
"rb"
Ces fichiers blocs-notes ont une quinzaine de lignes et les 2 1ère
ligne toujours les mêmes, soit :
<?
$type = "ne";

, sauf les 2 caractères entre"" qui peuvent varier, mais toujours au
nombre de 2

J'ai essayé avec l'aide en ligne de Excel de récupérer ces données de
type String dans une variable, mais j'ai une erreur d'exécution N°62 :
"l'entrée dépasse la fin du fichier" avec le programme suivant :
Dim MyChar, MyChars, mon_fichier As String
mon_fichier = [C1]
MyChars = ""
Open mon_fichier For Input As #1 ' Ouvre le fichier.
Do While Not EOF(1)
MyChar = Input(1, #1)
MyChars = MyChar & CStr(Input(1, #1))
' Debug.Print MyChar Loop
MsgBox MyChars
Close #1

Dans l'exemple du guide VBA excel, la ligne initiale "Debug.Print
MyChar Loop" affiche bien tous les caractères dans la fenètre
d'exécution...mais je n'arrive pas à récupérer dans une variable
string les caractères...
L'idée étant après, avec les fonctions left et right faire la
correction voulue, de le coller dans un nouveau fichier texte que
j'aurais réenregistré sous le nom initial avec un DisplayAlerts= False
...
C'est un peu compliqué, et ce que je sais en vba atteint vite les
limites! Cela vous semble-t-il faisable par Excel, bien que cela ne
soit pas la vocation initiale du vba sous excel.


Merci


Pour exemple, voici un fichier standard à traiter :
<?
$type = "ne";
$fileid = "1744";
$status = "a";
$creadate = "200807171412";
$moddate = "200807211820";
$author = stripslashes("Toto");
$email = stripslashes("");
$fielda1 = stripslashes("");
$fielda2 = stripslashes("");
$fieldb1 = stripslashes("10 jours à Paris");
$fieldb2 = stripslashes("");
$fieldc1 = stripslashes("Super voyage <br /><br /><embed
id="VideoPlayback" style="width:500px;height:406px"
allowFullScreen="true"
src="http://video.google.com/googleplayer......=fr&fs=true"
type="application/x-shockwave-flash"> </embed>");
$fieldc2 = stripslashes("");
$fieldd1 = stripslashes("");
$fieldd2 = stripslashes("");
$fieldweb = stripslashes("");
$fieldmail = stripslashes("");
?>








Avatar
Trèfle
Bonjour Hervé,

Merci encore pour la macro que tu m'a réalisée hier, j'ai compris ton
approche et j'ai réussi à l'exploiter en introduisant un if/elseif... pour
détecter le "ne" ou le "ra" avec le code suivant :
If I = 2 Then
If Tbl(2) = "$type = """ & "ne" & """" Then
Lettre = "bl"
ElseIf Tbl(2) = "$type = """ & "ra" & """" Then
Lettre = "rb"
Else
Close #Index ' ferme le ficher en lecture
Erase Tbl
I = 0
GoTo evite
et cela fonctionne sans erreur ...

Merci pour ton aide et toutes les explications fournies.

Bonne journée et bon WE

Trèfle



"Silve Hervé" a écrit dans le message de news:

Bonsoir Trèfle,

Teste d'abords sur deux ou trois fichiers pour voir si tu as le résultat
escompté. Lance la proc "EffectuerModif", j'ai commenté le code pour plus
de compréhension :

Sub EffectuerModif()
Dim I As Integer
Dim Der As Integer

'recherche la dernière ligne
Der = [C65536].End(xlUp).Row

'parcour toutes les lignes de la colonne C
For I = 1 To Der
LireEtModifierFichierTexte Range("C" & I).Value, "bl"
Next I

End Sub

Sub LireEtModifierFichierTexte(Fichier As String, Lettre As String)
Dim Tbl() As String
Dim Index As Integer
Dim I As Integer

'récupère un index libre
Index = FreeFile

'ouvre le fichier en lecture
Open Fichier For Input As #Index

'parcour tout le fichier et
'stocke les lignes dans un tableau
Do While Not EOF(Index)
I = I + 1
ReDim Preserve Tbl(1 To I)
Input #Index, Tbl(I)
Loop

'ferme le ficher en lecture
Close #Index

'et l'ouvre en écriture
Open Fichier For Output As #Index

'effectue la modif dans le tableau
'à la 2ème ligne
Tbl(2) = "$type = """ & Lettre & """"

'réinscrit le tout dans le fichier
For I = 1 To UBound(Tbl)
Print #Index, Tbl(I)
Next I

'ferme le ficher en écriture
Close #Index

Erase Tbl

End Sub


Hervé.




"Trèfle" a écrit dans le message de
news:%23$
Bonjour,

Dans un classeur Excel, je liste en colonne C tous les classeurs contenus
dans un dossier, et je voudrais faire une macro pour modifier dans tous
les fichiers texte (1000 env.) de type doc*.inc (ils s'ouvrent avec le
bloc-note), 2 caractères sur la ligne 2 (sans toucher aux autres lignes)
.
Il s'agit de remplacer un "ne" par "bl", ou autre cas, de un "ra" par
"rb"
Ces fichiers blocs-notes ont une quinzaine de lignes et les 2 1ère ligne
toujours les mêmes, soit :
<?
$type = "ne";

, sauf les 2 caractères entre"" qui peuvent varier, mais toujours au
nombre de 2

J'ai essayé avec l'aide en ligne de Excel de récupérer ces données de
type String dans une variable, mais j'ai une erreur d'exécution N°62 :
"l'entrée dépasse la fin du fichier" avec le programme suivant :
Dim MyChar, MyChars, mon_fichier As String
mon_fichier = [C1]
MyChars = ""
Open mon_fichier For Input As #1 ' Ouvre le fichier.
Do While Not EOF(1)
MyChar = Input(1, #1)
MyChars = MyChar & CStr(Input(1, #1))
' Debug.Print MyChar Loop
MsgBox MyChars
Close #1

Dans l'exemple du guide VBA excel, la ligne initiale "Debug.Print MyChar
Loop" affiche bien tous les caractères dans la fenètre d'exécution...mais
je n'arrive pas à récupérer dans une variable string les caractères...
L'idée étant après, avec les fonctions left et right faire la correction
voulue, de le coller dans un nouveau fichier texte que j'aurais
réenregistré sous le nom initial avec un DisplayAlerts= False ...
C'est un peu compliqué, et ce que je sais en vba atteint vite les
limites! Cela vous semble-t-il faisable par Excel, bien que cela ne soit
pas la vocation initiale du vba sous excel.


Merci


Pour exemple, voici un fichier standard à traiter :
<?
$type = "ne";
$fileid = "1744";
$status = "a";
$creadate = "200807171412";
$moddate = "200807211820";
$author = stripslashes("Toto");
$email = stripslashes("");
$fielda1 = stripslashes("");
$fielda2 = stripslashes("");
$fieldb1 = stripslashes("10 jours à Paris");
$fieldb2 = stripslashes("");
$fieldc1 = stripslashes("Super voyage <br /><br /><embed
id="VideoPlayback" style="width:500px;height:406px"
allowFullScreen="true"
src="http://video.google.com/googleplayer......=fr&fs=true"
type="application/x-shockwave-flash"> </embed>");
$fieldc2 = stripslashes("");
$fieldd1 = stripslashes("");
$fieldd2 = stripslashes("");
$fieldweb = stripslashes("");
$fieldmail = stripslashes("");
?>