VBA Extraction données word avec fonction input vers Excel
Bonjour à vous,
je rencontre un obstacle que je peine à contourner.
Afin de récolter des informations d'une page word dans un array, j'utilise la fonction Open de vba Open strFileName For Input As #fileIndex
puis je boucle sur chaque ligne avec un Do While Not EOF(fileIndex)
. (Je place le code ci dessous).
Cependant, alors que le fichier de départ contient beaucoup de lignes, ainsi qu'une image, le débugger me fait ressortir une seule ligne, comme si EOF avait été trouvé: le "do" s'arrêtant effectivement après sa première boucle. Voici la ligne concernée: PK!ZØÃÐÈ [Content_Types].xml ¢( ÄVKkÜ0¾òŒ®ÁÖ&…RÊzsÈ㘺¥
Quelqu'un saurait il comment je peux boucler en contournant ce EOF qui devrait continuer jusqu'à la fin du document? Ou constatez vous une erreur d'approche de ma part? Voici le code:
Sub wordDocExtraction(ByVal strFileName As String)
Application.ScreenUpdating = False
On Error GoTo extractorErrorHandler
'Définition des variables
Dim fileIndex As Integer
Dim ContenuLigne As String
'Assignation et ouverture d'un fichier à ouvrir
fileIndex = FreeFile() '(Fonction vba: donne un index disponible de fichier)
Open strFileName For Input As #fileIndex 'ouvre le fichier
'Parcour des lignes du fichier et insertion du contenu dans la variable contenu ligne
Do While Not EOF(fileIndex) '
Input #fileIndex, ContenuLigne ' lecture du fichier ligne par ligne: la variable "ContenuLigne" contient le contenu de la ligne active
Debug.Print ContenuLigne
Loop
'Fermeture du fichier et réactivation du rafraichissement d'écran
Close #fileIndex
Application.ScreenUpdating = True
Stop
Exit Sub
extractorErrorHandler:
MsgBox "Le programme a rencontré une erreur."
Exit Sub
End If
End Sub
J'ai mis un exemple de document word en pj.
Bonjour,
merci de votre aide.
Oui la macro se réalise sans erreur, seulement lorsqu’on assigne le fichier qu’en j’ai placé en pièce jointe étonnamment on ne recupere pas les informations présentes dans le fichier (nom, prénom, etc).
Je me demande si de votre côté également la boucle fait un seul tour...
Si vous avez-vous une petite idée je suis entièrement preneur.
re,
à tester,
'ajouter la référence : Microsoft Scripting Runtime.
Sub LireFichierTexte()
Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.file
Dim oTxt As Scripting.TextStream
Dim i As Integer
'à adapter
fileName = "C:\Users\isabelle\Documents\Excel_Pratique_forum\Theophile69-TEST DEMDANDE.docx"
Set oFSO = New Scripting.FileSystemObject
Set oFl = oFSO.GetFile(fileName)
Set oTxt = oFl.OpenAsTextStream(ForReading)
'Lire
While Not oTxt.AtEndOfStream
i = i + 1
Range("A" & i) = oTxt.ReadLine
Wend
End Sub
Bravo i20100, c'est exactement ce que je cherchais.
Cependant je constate que je récupère uniquement des caractères codés. Sais tu de quoi il en retourne par hasard?
Je vais aller voir du côté de l'encodage Word cependant j'avoue naviguer à vue.
Merci encore pour cette étape décisive.
re,
J’ai essayé les 3 méthodes, et aucun résultat
TristateUseDefault -2 Ouvre le fichier en utilisant la valeur par défaut du système.
TristateTrue -1 Ouvre le fichier en tant que Unicode.
TristateFalse 0 Ouvre le fichier en tant qu'ASCII
Set oTxt = oFl.OpenAsTextStream(ForReading, TristateUseDefault)
re,
en enregistrant le fichier en format txt il n'y a pas de problème à le lire.
Sub SaveAs_txt()
Application.DisplayAlerts = False
nom = ActiveDocument.FullName
nom = Left(nom, Len(nom) - 4) & "txt"
ActiveDocument.SaveAs FileName:=nom, FileFormat:=wdFormatText
Application.DisplayAlerts = True
End Sub
Purée! Tu gères bien les stream!!!
J’essaie dès lundi. Merci beaucoup.
re,
à tester,
'ajouter les références :
'- Microsoft Scripting Runtime.
'- Microsoft Word xx.x Object Library
Sub LireFichierTexte()
Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.file
Dim oTxt As Scripting.TextStream
Dim MonDocument As Document
Dim i As Integer
Application.DisplayAlerts = False
'à adapter
Filename = "C:\Users\isabelle\Documents\Excel_Pratique_forum\Theophile69-TEST DEMDANDE.docx"
NewFilename = Split(Filename, ".")(0) & ".txt"
Set MonDocument = Documents.Open(Filename)
MonDocument.SaveAs Filename:=NewFilename, FileFormat:=wdFormatText
MonDocument.Close
Set oFSO = New Scripting.FileSystemObject
Set oFl = oFSO.GetFile(NewFilename)
Set oTxt = oFl.OpenAsTextStream(ForReading)
'Lire
While Not oTxt.AtEndOfStream
i = i + 1
Range("A" & i) = oTxt.ReadLine
Wend
Application.DisplayAlerts = True
End Sub
Bonjour i20100,
le debuger m'anonce "Erreur d'éxécution 429: un composant active X ne peut pas créer d'objet". Il bloque alors sur la ligne "Set monDocument = Documents.Open(strFileName)
.
As tu une idée de l'erreur, je peine à comprendre. Voici si besoin le code que j'ai adapté.
Attentif à ton retour si possible. Merci.
Sub testWordDOc(ByVal strFileName As String)
Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.File
Dim oTxt As Scripting.TextStream
Dim MonDocument As Word.Document
Dim i As Integer
Dim recupDonnnees(1000) As String
Dim NewFilename As String
Application.DisplayAlerts = False
'Changement de l'extension en ".txt"
NewFilename = Split(strFileName, ".")(0) & ".txt"
Set MonDocument = Documents.Open(strFileName)
MonDocument.SaveAs Filename:=NewFilename, FileFormat:=wdFormatText
MonDocument.Close
Set oFSO = New Scripting.FileSystemObject
Set oFl = oFSO.GetFile(NewFilename)
Set oTxt = oFl.OpenAsTextStream(ForReading)
'Obtention des données
While Not oTxt.AtEndOfStream
i = i + 1
recupDonnnees(i) = oTxt.ReadLine
Debug.Print recupDonnnees(i)
Wend
Application.DisplayAlerts = True
End Sub
re,
as-tu ajouté les 2 références ?
- Microsoft Scripting Runtime.
- Microsoft Word xx.x Object Library
Bonjour,
C'est bon j'ai trouvé.
Bêta que je suis, la fonction split venait sectionner le string sur un autre point que celui de l'extension. Donc le chemin devenait invalide.
Tout fonctionne parfaitement.
Une fois de plus je te remercie sincèrement pour ton aide!
Bonjour i20100,
peux tu m'éclairer sur quelque chose.
D'un coup ma macro ne fonctionne plus. J'avoue que je me perds et je voulais savoir si tu voyais quelque chose dans le code qui ne fonctionnerait plus??? Je me retrouve avec la même erreur "un objet activeX ne peut pas créer d'objet". Et pourtant le chemin du fichier est bon cette fois ci.
Seconde question si tu as le temps: pourquoi l'objet "documents" et sa méthode "open" ne passe passe par la déclaration d'un objet word.application en début de macro? Dans mon debbuger, après la déclaration Dim MonDocument As Document
l'inspecteur de variables dit que MonDocument est vide (c'est pour ça que j'ai tenté de préciser le type en word.document).
Je suis perdu.
Si tu as une lumière?
Merci.
[code]Sub testWordDOc()
Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.File
Dim oTxt As Scripting.TextStream
Dim MonDocument As Word.Document
Dim i As Integer
Dim recupDonnnees(1000) As String
Dim newFileName As String
Application.DisplayAlerts = False
strFileName = "C:\Users\confidentiel\Desktop\Demandes Individuelles\20190510_103105Demande_intervention.doc" ' A remplir
'Changement de l'extension en ".txt"
newFileName = Split(strFileName, ".")(0) & ".txt"
Set MonDocument = Documents.Open(strFileName)
MonDocument.SaveAs Filename:=newPathName, FileFormat:=wdFormatText
MonDocument.Close
Set oFSO = New Scripting.FileSystemObject
Set oFl = oFSO.GetFile(newFileName)
Set oTxt = oFl.OpenAsTextStream(ForReading)
'Obtention des données
While Not oTxt.AtEndOfStream
i = i + 1
recupDonnnees(i) = oTxt.ReadLine
Debug.Print recupDonnnees(i)
Wend
Application.DisplayAlerts = True
End Sub
/code]
re,
c'est quoi la variable newPathName
?
Bonjour i20100,
désolé mon précédent message était incomplet.
Voici la fonction que j'exploite dorénavant. J'avais donc omis la ligne pour newPathName
Ecoute c'est étonnant. Ça refonctionne d'un coup alors que ma seule manip fut d'avoir lancé précédemment une macro instanciant un objet word Set appWord = createobject("word.application")
Comme si l'objet Word restait dans le fond et permettait à présent à la macro de fonctionner.
Ne trouves-tu pas étonnant que dans ton code tu puisses assigner et ouvrir un objet document sans instancier Word? Ne l'aurais tu pas fais précédemment sur ta machine?
Qu'en penses tu?
J'avoue être assez décontenancé.
Merci.
Function wordExtensionModifyer(ByVal tempFolderPath As String, ByVal attachmentName As String, ByRef strFileName As String)
Dim MonDocument As Word.Document
Dim NewFilename, newPathName As String
'Reconstruction du nom de fichier en ".txt" et du nouveau chemin d'accès
If InStr(attachmentName, ".docx") <> 0 Then
NewFilename = Left(attachmentName, Len(attachmentName) - 5) & ".txt"
Else
NewFilename = Split(attachmentName, ".")(0) & ".txt"
End If
newPathName = tempFolderPath & "\" & NewFilename
'Ouverture et resauvegarde du document
Set MonDocument = documents.Open(strFileName)
MonDocument.SaveAs Filename:=newPathName, FileFormat:=wdFormatText
MonDocument.Close
'Vidage mémoire
'Set oWord = Nothing
Set MonDocument = Nothing
'Retour du chemin fichier
strFileName = newPathName
End Function
re,
je ne vois pas le rapport entre la macro testWordDOc et la function wordExtensionModifyer
puisque la function n'est pas utiliser dans la macro.