gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017
-
17 juin 2014 à 18:03
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 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
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 17 juin 2014 à 18:09
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 ?
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 18 juin 2014 à 13:29
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
jordane45
Messages postés37726Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention27 septembre 2023342 18 juin 2014 à 13:43
Bonjour,
Si tu ouvres, dans word, un document déjà ouvert (par toi où un autre utilisateur)... tu ne peux que l'ouvrir en lecture seul ( en faisant le choix A) en en ouvrir une "copie" (qui sera modifiable elle) ....
Si il reste des instances de ton document ouvertes... il te faut les killer manuellement via le gestionnaire des tâches windows.
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 18 juin 2014 à 16:53
Salut Jordane,
J'ai exécuté de nouveau le code ci-dessus.
Pour ce qui est du formulaire, c'est OK, il s'ouvre bien pour me demander Nom et Prenom. Il ouvre le document mais reste ensuite un peu comme un benêt...pour finalement m'afficher de nouveau " l'exception COMException n'a pas été gérée" au niveau de la ligne
puis en dessous, "Le membre de la collection requis n'existe pas."
Bref, y'a un problème...
jordane45
Messages postés37726Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention27 septembre 2023342 18 juin 2014 à 17:06
.... SignetNom .. c'est une variable qui contient le nom de ton signet....
1 - Tu l'initialise où ?
2 - Es-tu sûr que le signet (portant EXACTEMENT le nom que tu as mis) existe dans le document ?
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 18 juin 2014 à 17:13
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és37726Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention27 septembre 2023342 18 juin 2014 à 17:16
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..
cs_Le Pivert
Messages postés7899Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention21 septembre 2023137 18 juin 2014 à 17:40
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
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 18 juin 2014 à 17:46
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é.
cs_Le Pivert
Messages postés7899Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention21 septembre 2023137 18 juin 2014 à 17:51
Ce qui a changé est visible à l'oeil :
sélection du signet et le nom du signet et entre guillemet
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 18 juin 2014 à 18:55
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és18622Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention28 septembre 2023629 18 juin 2014 à 19:19
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 18 juin 2014 à 20:26
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
Whismeril
Messages postés18622Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention28 septembre 2023629 18 juin 2014 à 20:42
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
cs_Le Pivert
Messages postés7899Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention21 septembre 2023137 19 juin 2014 à 09:03
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.ActiveDocument.Close() oWord.Visible = False oWord.Quit() End Sub End Class
gregml
Messages postés89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 19 juin 2014 à 10:14
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.
cs_Le Pivert
Messages postés7899Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention21 septembre 2023137 19 juin 2014 à 10:22
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és89Date d'inscriptionsamedi 17 mai 2014StatutMembreDernière intervention16 juin 2017 19 juin 2014 à 10:36
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!