Manipulation d'un document Word avec VB.Net [Résolu]

Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
- - Dernière réponse : gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
- 19 juin 2014 à 10:36
Bonjour à tous,

Je procède actuellement à un dérouillage en règle de mes vieilles neurones usées ... exercice particulièrement éprouvant et me remplissant d'humilité...

Je tente vainement de réaliser une petite application consistant à renseigner un formulaire contenant deux "Textbox", appelant à y intégrer le Nom et le Prénom d'une personne. Ceci fait, on valide ces données avec un Bouton "Valider".
Cette validation va ouvrir un document Word, avec un chemin spécifique, où se trouvent dans le corps du document les deux signets à renseigner, comme ceci :

Document Word (à l'adresse : C:\Users\greg\Desktop\DocumentProjetSimplifie.docx):

Projet simplifié de remplissage de signets

Nom : (emplacement du signetNom)
Prénom : (emplacement du signetPrenom)



J'ai donc créé mon formulaire "Form1", contenant 1 label 'Nom' et une Textbox + 1 label 'Prenom' et une autre Textbox et un bouton 'Valider'

J'ai ensuite écrit le code suivant :


Option Strict On
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim ValeurNom As String

        ValeurNom = Me.TextBox1.Text

    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Dim ValeurPrenom As String

        ValeurPrenom = Me.TextBox2.Text
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        Dim oWord As New Word.Application

        oWord.Documents.Open(C:\Users\greg\Desktop\DocumentProjetSimplifie.docx)
        'Ouvrir un  document
        'oWord.Documents.Open("chemin document.doc")
        'rendre le document word visible
        oWord.Visible = True
        oWord.Selection.Bookmarks(SignetNom).Range.text = ValeurNom

        oWord.Selection.Bookmarks(SignetPrenom).Range.text = ValeurPrenom



        oWord.ActiveDocument.Close() 'on ferme le document
        oWord.Visible = False
        oWord.Quit() 'on ferme Word
    End Sub

End Class
Afficher la suite 

Votre réponse

12 réponses

Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
J'ai cliqué sur je ne sais quel bouton et cela m'a immédiatement enregistré ma question sans que je n'ai pu terminé mon explication.
Bref, à l'issue de l'écriture de ce code, qui me semblait pourtant suffisant pour ce que je cherchais à réaliser, VB.net :
1) me renvoie à la ligne "oWord.Documents.Open (C:\Users\greg\Desktop\DocumentProjetSimplifie.docx) que C n'est pas déclaré. Il peut être inaccessible en raison de son niveau de protection.

2) De même, il me renvoie les mêmes erreurs pour 'SignetNom', 'ValeurNom', 'SignetPrenom' et 'ValeurPrenom' aux lignes oWord.Selection.Bookmarks...

Quelqu'un pourrait=il m'aider à résoudre ce petit problème ?

Merci, Grég
Commenter la réponse de gregml
Messages postés
14317
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
10 décembre 2018
0
Merci
Si tu actives "Option Strict" et "Option Explicit", tu auras un message d'erreur t'indiquant la source de ton problème ;)
NHenry
Messages postés
14317
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
10 décembre 2018
-
J'oubliais, il manque aussi les " pour entourer le nom du fichier.

Regardes bien les messages d'erreurs.
Commenter la réponse de NHenry
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Merci NHenry,
J'ai déjà trouvé qu'il me manquait des guillemets pour l'ouverture du document Word.

Je continue à chercher, Greg
Commenter la réponse de gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Bonjour,

Je reviens vers tout le monde car j'ai un peu avancé...
Je n'ai plus d'erreur (avant débogage). Par contre, à l'exécution du programme, un message apparaît avant la fermeture du document Word :
" L'exception COMException n'est pas gérée."

Ainsi donc, à l'exécution :
1) Mon formulaire Nom Prenom apparaît correctement et me demande un Nom puis un Prénom.

2) Je peux valider en cliquant sur le Bouton 'Valider'

3) Une petite fenêtre s'ouvre : DocumentSimplifie.docx est vérouillé pour modification par 'greg'.
Voulez=vous :
a) Ouvrir une copie en lecture seule
b) Créer une copie locale et fusionner les modifications ultérieurement
c) Recevoir une notification quand la copie d'origine est disponible.

Ne sachant pas, je clique sur la première.

4) Le document DocumentSimplifie.docx s'ouvre mais affiche 'Lecture seule Ce document est verrouillé pour modification par un autre utilisateur'

5) Je ferme 'manuellement' le document et je me retrouve dans le code avec :
" L'exception COMException n'est pas gérée."

Voilà...Donc plus d'erreur dans la fenêtre d'erreurs mais pas de résultats pour autant ...

J'envoie le nouveau code à la suite et je vous remercie par avance si vous pouviez m'aider à résoudre mon problème.

Option Strict On
Option Explicit On
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word

Public Class FormNomPrenom
    Dim ValeurNom As String
    Dim ValeurPrenom As String
    Dim SignetNom As Bookmark
    Dim signetPrenom As Bookmark

    Private Sub FormNomPrenom_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        

    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        ValeurNom = Me.TextBox1.Text
        
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        ValeurPrenom = Me.TextBox2.Text
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim oWord As New Word.Application


        oWord.Documents.Open("C:\Users\greg\Desktop\DocumentProjetSimplifie.docx")

        oWord.Visible = True
        oWord.Selection.Bookmarks(SignetNom).Range.Text = "ValeurNom"

        oWord.Selection.Bookmarks(signetPrenom).Range.Text = ValeurPrenom



        oWord.ActiveDocument.Close()
        oWord.Visible = False
        oWord.Quit()
    End Sub

End Class


Merci, Grég
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Merci de me répondre Jordane...

En fait, j'ai attribué la valeur "SignetNom" dans le document même, celui qui a pour nom : DocumentSimplifie.docx
Je n'ai en revanche pas initialisé la variable SignetNom (d'ailleur SignetPrenom non plus)... car je n'y ai pas pensé... et que je ne vois pas comment faire...

Merci encore, Grég
jordane45
Messages postés
23570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
-
et que je ne vois pas comment faire...
Déjà...
Dim SignetNom As Bookmark
    Dim signetPrenom As Bookmark

A remplacer par STRING
Dim SignetNom As String
    Dim signetPrenom As String


Et ensuite... ben il suffit de leur donner comme valeur.. le nom de tes signets..

 SignetNom = "NomdeMonSignetNom"
signetPrenom  = "NomdeMonSignetPreNom"
jordane45
Messages postés
23570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2018
-
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Oui, je n'ai pas oublié qu'il me l'avait proposé mais je n'ai jamais réussi à la faire tourner. Ca bloque dès la déclaration de la Classe GestionWord... et j'ai pas osé le déranger, trouvant son geste particulièrement élégant.
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Après, ça me rend un peu dingue de ne pas comprendre ces histoires de signets car vraiment je comprends pas grand chose.
J'ai nommé mes signets dans mon document Word SignetNom et SignetPrenom, j'ai fait comme tu m'as dit, en déclarant SignetNom et SignetPrenom comme String.

J'ai attribué comme valeurs à ces SignetNom et SignetPrenom les valeurs que tu as donnés mais rien n'y fait, je me retrouve à chaque fois avec la même erreur...
Commenter la réponse de gregml
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
Bonjour,

Essaie ceci:

Option Strict On
Option Explicit On
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word
Public Class Form1
    Dim ValeurNom As String
    Dim ValeurPrenom As String
    Dim SignetNom As String
    Dim signetPrenom As String

   

    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
        ValeurNom = Me.TextBox1.Text

    End Sub

    Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
        ValeurPrenom = Me.TextBox2.Text

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim oWord As New Word.Application
        oWord.Documents.Open("C:\Users\greg\Desktop\DocumentProjetSimplifie.docx")

        oWord.Visible = True
        oWord.Selection.GoTo(Name:="SignetNom")
        oWord.Selection.Bookmarks("SignetNom").Range.Text = ValeurNom
        oWord.Selection.GoTo(Name:="signetPrenom")
        oWord.Selection.Bookmarks("signetPrenom").Range.Text = ValeurPrenom
        

        oWord.ActiveDocument.Close()
        oWord.Visible = False
        oWord.Quit()

    End Sub
End Class

Commenter la réponse de cs_Le Pivert
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Un très très très grand merci cs pivert...
Figure-toi que ça fonctionne.
Franchement, j'en ai presque la larme à l'oeil parce que j'ai vraiment galéré.

J'ai pas compris ce qui a vraiment changé, je vais m'y pencher. Mais je vous remercie tous deux pour m'avoir aidé.

MERCI A VOUS DEUX,
Greg
Commenter la réponse de gregml
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
Ce qui a changé est visible à l'oeil :

sélection du signet et le nom du signet et entre guillemet

oWord.Selection.GoTo(Name:="SignetNom")
Commenter la réponse de cs_Le Pivert
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Merci encore.

J'apprécie vraiment votre générosité.

Je vais ouvrir une nouvelle discussion concernant cette fois les classes. Mais avant toute chose, je me pose une question : peut-on gérer avec VB.net des PDF, comme on vient de la faire avec un document Word ?

Grég
Whismeril
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
-
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Salut Whismeril,

Merci pour ton code concernant les Pdf. Tu as raison, n'allons pas trop vite. Je conserve en réserve ce code pour plus tard toutefois, car une partie du projet est en Pdf.
Après, avoir désormais une solution qui fonctionne pour remplir les signets est une véritable satisfaction.

Sinon, j'ai une question plutôt théorique:
on peut bien faire d'un document type (un modèle de fax par exemple, un document (plutôt un modèle d'ailleurs) Word avec des signets à remplir, un PDF avec des signets à remplir...) une classe dont les objets seront pour chaque personne son objet issu du modèle de fax, son objet issu du document Word, son objet issu du Pdf ?
J'ai bien compris ?
MErci, Grég
Commenter la réponse de gregml
Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
0
Merci
Heu... Je n'ai pas compris ta question.
Et comme je le mettais plus haut tu changes de sujet.
Il est de bon goût d'ouvrir un nouveau sujet ou tu détailleras un peu plus ta question
Commenter la réponse de Whismeril
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
0
Merci
Ok.
Commenter la réponse de gregml
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
Depuis Office 2007 on peut enregistrer un document Word: extension .doc seulement en PDF

Essaie ce code:

Option Strict On
Option Explicit On
Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Word
Public Class Form1
Dim ValeurNom As String
Dim ValeurPrenom As String
Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
ValeurNom = Me.TextBox1.Text
End Sub
Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
ValeurPrenom = Me.TextBox2.Text
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim oWord As New Word.Application
oWord.Documents.Open("C:\Users\greg\Desktop\DocumentProjetSimplifie.doc") 'document en .doc

oWord.Visible = True
oWord.Selection.GoTo(Name:="SignetNom")
oWord.Selection.Bookmarks("SignetNom").Range.Text = ValeurNom
oWord.Selection.GoTo(Name:="signetPrenom")
oWord.Selection.Bookmarks("signetPrenom").Range.Text = ValeurPrenom
'enregistre en pdf
oWord.ActiveDocument.ExportAsFixedFormat(OutputFileName:= _
"C:\Users\greg\Desktop\DocumentProjetSimplifie.pdf", ExportFormat:=WdExportFormat.wdExportFormatPDF, _
OpenAfterExport:=False, OptimizeFor:=WdExportOptimizeFor.wdExportOptimizeForPrint, _
Range:=WdExportRange.wdExportAllDocument, From:=1, To:=1, Item:=WdExportItem.wdExportDocumentContent, _
IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=WdExportCreateBookmarks.wdExportCreateHeadingBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False)

oWord.ActiveDocument.Close()
oWord.Visible = False
oWord.Quit()
End Sub
End Class
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Salut,
J'ai bien essayé le code que tu m'as gentiment proposé.
2 choses :
- d'une part, à l'égard de mon projet global, il ne s'agissait pas (forcément) de partir d'un document Word pour le sauvegarder en format PDF mais plutôt d'agir directement sur un PDF désigné par l'utilisateur (maintenant, faudrait voir comme dit l'autre, mais cela demanderait à ce que je scanne le PDF ou que je le reproduise très fidèlement...pas simple non plus)

- d'autre part, l'exécution du code agit bien sur les signets. On va bien "remplir" les signets avec les données entrées par l'utilisateur et on sauvegarde effectivement en format PDF.

Merci, Grég
Commenter la réponse de cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
Si c'est pour agir directement sur un pdf, c'est une autre paire de manche!

enfin tu sais que tu peux le faire à partir de Word au cas ou!

bonne programmation
gregml
Messages postés
89
Date d'inscription
samedi 17 mai 2014
Dernière intervention
16 juin 2017
-
Merci.
Maintenant, si c'est vraiment trop difficile d'agir directement sur un PDF, je peux toujours faire comme tu le fais et sauvegarder en format PDF voire même faire juste une impression papier et ça passera comme une lettre à la Poste si la reproduction est fidèle... Bast!

Greg
Commenter la réponse de cs_Le Pivert

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.