Creer un doc a partir de VB.net : options setup et position

Résolu
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013 - 8 juil. 2011 à 19:57
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013 - 9 juil. 2011 à 09:20
( je suis un peu perdu dans le fatras de code sur ce sujet , et ne parviens pas à comprendre la logique, le mécanisme. Beaucoup sur google et autres, mais pas clair pour moi - ma faute sans doute ).

Question 1 :
comment faire les choix de font size, fontname, marges, etc, ET L'APPLIQUER A TOUT LE DOC.

Mon code ( brouillon ) et j'explique
Dim objword As Word.Application
Dim docword As Word.Document
Dim opara1 As Word.Paragraph
objword = CreateObject("word.application") 
docword = objword.Documents.Add

With docword
.PageSetup.PaperSize = Word.WdPaperSize.wdPaperA4
.PageSetup.Orientation = Word.WdOrientation.wdOrientLandscape
.PageSetup.LeftMargin = 60
.PageSetup.RightMargin = 50
.PageSetup.TopMargin = 50
.PageSetup.BottomMargin = 50
End With

opara1 = docword.Content.Paragraphs.Add
opara1.Range.Font.Size = 9
opara1.Range.Font.Name = "courier new"
opara1.Range.Font.Bold = False
opara1.Range.Text = "123456789012345678901234567890123456789012345678901234567890" & _
"123456789012345678901234567890123456789012345678901234567890123456789012"
opara1.Format.SpaceAfter = 1
opara1.Range.InsertParagraphAfter()
opara1 = docword.Content.Paragraphs.Add
opara1.Range.Text = "------------------------------------------------------------" & _
"------------------------------------------------------------------------"
opara1.Format.SpaceAfter = 2
opara1.Range.InsertParagraphAfter()
opara1.Range.Text = "un texte range start 72"
opara1.Format.SpaceAfter = 2
opara1.Range.InsertParagraphAfter()
docword.SaveAs(FileName:="c:\mondocu.doc")
docword.Close()
docword = Nothing
objword = Nothing


- ma ligne avec 123456789123... etc a le bon format "courier new size = 9.

Je m'attends à ce que la ligne suivante avec les traits en soulignement ---- conserve le même format. Et bien non : il passe en font12, Times new Roman ???
Pourquoi? je n'ai rien changer entre les deux lignes.
N'y a til pas moyen d'appliquer les choix sur tous le document?

Question 2 : je ne comprends vraiment pas le code avec Range.
Par exemple je code cedi sans comprendre :

"opara1 = docword.Content.Paragraphs.Add"

Ni les sections, ni les signets?
Y a t il un endroit où trouver une bonne explication à ces éléments du langage?

Où toutes les options sont clairement définies.

Et un bon exemple complet d'une programmation d'une creation de doc word via VB.Net

Merci de me guider.

Pierre

14 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2011 à 21:13
Bonjour,
Rien d'étonnant !
tu ajoutes par ton code
opara1 =  docword.Content.Paragraphs.Add

un paragraphe pour lequel ( LUI SEUL ) tu définis des propriétés de texte
puis tu passes à UN AUTRE paragraphe : ton second :
opara1  = docword.Content.Paragraphs.Add

qui, LUI, ne subit pas les propriétés du premier !
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2011 à 22:41
Oui, mais que crois-tu donc que fait aussi :
opara1.Range.InsertParagraphAfter()

?
A mon avis : Ce qu'en dit MSDN



____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2011 à 23:13
alors en sortie sur la ligne du document je n'ai plus que la dernière ligne soulignée et non plus la ligne avec les 1234567.... ligne qui a été écrasée !!!!

Tu m'en diras tant ! C'est ton code, qui l'écrase, puisque tu redéfinis la valeur du texte (et la dernière valeur est donc la seule gardée) !


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2011 à 23:40
regarde mon dernier message et attarde-toi sur vbLF (la constante vbLF)
Si pas vbLF, essaye VbNewLine

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013
8 juil. 2011 à 22:30
OK mais si je fais
opara1 = docword.Content.Paragraphs.Add
opara1.Range.Font.Size = 9
opara1.Range.Font.Name = "courier new"
opara1.Range.Font.Bold = False
opara1.Range.Text = "123456789012345678901234567890123456789012345678901234567890" & _
"123456789012345678901234567890123456789012345678901234567890123456789012"
opara1.Format.SpaceAfter = 1
opara1.Range.InsertParagraphAfter()
'opara1 docword.Content.Paragraphs.Addopara1.Range.Text "------------------------------------------------------------" & _
"------------------------------------------------------------------------"
opara1.Format.SpaceAfter = 2
opara1.Range.InsertParagraphAfter()


que je mets donc en commentaire mon Add paragrahs, celui juste avant le text "----"
Même effet.
Je le jure.

Encore quelque chose qui m'échappe !!
Vendredi soir?? Peu-être !!
Retour à une question aussi : existe t il de la documentation sur ces paramètres?


Merci

Pierre
0
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013
8 juil. 2011 à 22:57
Complètement perdu.
Si je supprime cette ligne, et même si je retiends la ligneopara1.Format.SpaceAfter = 1
opara1.Format.SpaceAfter = 1

pour executer ceci
opara1 = docword.Content.Paragraphs.Add
opara1.Range.Font.Size = 9
opara1.Range.Font.Name = "courier new"
opara1.Range.Font.Bold = False
opara1.Range.Text = "123456789012345678901234567890123456789012345678901234567890" & _
"123456789012345678901234567890123456789012345678901234567890123456789012"
opara1.Format.SpaceAfter = 1
opara1.Range.Text = "------------------------------------------------------------" & _
"------------------------------------------------------------------------


alors en sortie sur la ligne du document je n'ai plus que la dernière ligne soulignée et non plus la ligne avec les 1234567.... ligne qui a été écrasée !!!!
Comme si "opara1.Format.SpaceAfter = 1" spaceafter de 1 ne fonctionne pas !!

Cela veut dire que je dois définir un nouveau range à chaque ligne !!!! et remettre chaque fois les attributs ????

et puis la doc que tu renseignes semble dire qu'il y a une expansion des attributs?? Ou je me trompe?


Bon je vais lire la référence que tu donnes et remonter un peu dans les principes.
Mais je ne comprends pas la mécanique... pas encore.

Merci

Pierre
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2011 à 23:09
et puis la doc que tu renseignes semble dire qu'il y a une expansion des attributs?? Ou je me trompe?


Ben ...

After this method is applied, the range expands to include the new paragraph.


Ne se traduit pas comme tu l'interprètes, mais par ainsi :
"Une fois cette méthode appliquée, la plage est étendue et inclut le nouveau paragraphe"
Ce n'est pas parce que la plage inclut le nouveau paragraphe, que tu n'as pas un paragraphe (nouveau) distinct !
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 juil. 2011 à 23:33
ce devrait être du genre (je n'ai pas Word sous la main ===>> à vérifier donc) !
opara1.Range.Text = "123456789012345678901234567890123456789012345678901234567890" & _
"123456789012345678901234567890123456789012345678901234567890123456789012"

opara1.Range.Text = opara1.Range.Text & vbLF & "------------------------------------------------------------" & _
"------------------------------------------------------------------------"


vbLF devrait de mémoire être la constante VB de Word pour le passage )à la ligne.
____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013
8 juil. 2011 à 23:37
D'accord, mais alors quelle est l'instruction qui "dépose" le texte sur la ligne du document !!
pour que je puisse pas à une autre ligne.

pseudo code
line = "line1"
write line on current line of doc
skip 1 line
line = "line2"
write line on current line of doc
skip 1 line
.....

Je sais "j'étonne" mais je viens de langages comme le Cobol, le PL/I ou l'assembleur... j'ai donc à apprendre de la programmation par événements. Désolé.


Pierre
0
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013
8 juil. 2011 à 23:50
( J'ai envoyé ma réponse avant de recevoir ton dernier message )

Oui vbLF ( line Feed ... (carriage return ))
est bon.

Ta solution
opara1.Range.Text = "123456789012345678901234567890123456789012345678901234567890" & _
"123456789012345678901234567890123456789012345678901234567890123456789012"

opara1.Range.Text = opara1.Range.Text & vbLF & "------------------------------------------------------------" & _
"------------------------------------------------------------------------


est bonne aussi.
Mais est elle applicable à un document de, mettons, 500 lignes.
Cela m'obligerait à accoler 500 chaines de valeur reliées par des & et vbLF.
Cela est il supportable par VB et dans la gestion de mon programme?

Disons que cela me paraissait si simple de définir le range sur tout le document, au départ et éventuellement juqu'à la prochaine modification ( un peu comme en HTML )
D'annoncer les attributs de fontsize, fontname, etc tant qu'on n'en a pas des
autres.

Sans doute un raison cachée, mais cela paraît bizarre à première vue.

Y a t il beaucoup de gens qui crée du Word en VB comme moi? ou y a t il d'autres façons de le faire?



Pierre
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 juil. 2011 à 07:08
Disons que cela me paraissait si simple de définir le range sur tout le document, au départ et éventuellement juqu'à la prochaine modification ( un peu comme en HTML )
D'annoncer les attributs de fontsize, fontname, etc tant qu'on n'en a pas des
autres.

Mais bien évidemment !
Mais c'est toi, qui a deécidé de limiter la mise en forme à UN paragraphe (ton objet opara1) par tes lignes :
opara1.Range.Font.Size = 9
opara1.Range.Font.Name = "courier new"
opara1.Range.Font.Bold = False

Alors que tu peut définir cette mise en forme dès le départ pour la totalité du document.
Je me suis même dit que tu devais avoir tes raisons de formater différemment chaque paragraphe et ai respecté scrupuleusement cette volonté apparente

____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 juil. 2011 à 07:32
Je pense en fait que tes difficultés résultent principalement d'une connaissance insuffisante de Word. Pour piloter convenablement un logiciel, il est évident qu'il faut bien le connaître.
Je te suggère de commencer au moins par ce Genre de lecture qui, bien que non destinée à remplacer l'apprentissage de VBA/Word (ce n'est jamais qu'un exemple assez réduit de pilotage), te mettra sur une voie plus éclairée. Tu y trouveras de surcroît la réponse à ton problème.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 juil. 2011 à 07:49
Je te suggère également de t'intéresser de près à la méthode InsertAfter de VBA/Word.
Tu trouveras ICI l'exposé qu'en fait MSDN, de manière assez claire et complète.


____________________
Utiliser le bouton "REPONSE ACCEPTEE" sur une réponse exacte facilite les recherches ultérieures d'autres forumeurs. PENSEZ-Y SVP
0
cs_PeD Messages postés 63 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 13 avril 2013
9 juil. 2011 à 09:20
Mais c'est toi, qui a deécidé de limiter la mise en forme à UN paragraphe (ton objet opara1) par tes lignes 

J'y avais pensé ( pas encore tout à fait nul ) et c'est pour cela que j'ai tenté quelque chose comme
Dim opara1 as Word.Document
à la place de Word.Paragraph. Mais je n'ai pas réussi à initialiser cet élément avec "opara1 = docword.Content. ????" puis rien à disposition.
Donc je ne sais pas comment étendre opara1 à tout le document.

Mais évidemment que je veux apprendre et comprendre.
Donc je plonge dans la documentation que tu donnes.
Je voulais avoir quelques pistes et ces références.
Je reviendrai ici lorque j'aurai résolu ce problème.

Grand merci.
Bon week-end

Pierre
0
Rejoignez-nous