[VB.NET -> VBA]Ecrire en continu dans un ContentControl de Word

Signaler
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour à tous,


J'ai un petit soucis, depuis peu, que vous aller probablement considérer comme débutant, mais j'ai cherché un peu partout et essayé un tas de choses mais malheureusement cela ne marche pas comme je voudrais...

Voici mon problème :

J'aimerais écrire dans un document word préexistant à un endroit où il existe des paragraphes avant et après.
Pour me faciliter la vie j'y ai créé un ContentControl pour y écrire dedans (ainsi je sais où démarrer et je ne risque pas décraser les paragraphes déja existant à la fin). Existe-t-il une meilleure solution ou suis-je bien occupé?

Si la solution est la bonne j'ai tout de même un problème c'est de pouvoir écrire en continue avec un titre en Style1, un sous-titre en Style2 et le texte en normal.

Pour un exemple sous VBA et sans contentControl ça donnerait ceci:

wrdApp.Selection.MoveDown Unit:=wdLine, Count:=19
wrdApp.Selection.style = wrdDoc.Styles("Titre 2")
wrdApp.Selection.TypeText text:="Produits"
wrdApp.Selection.TypeParagraph
wrdApp.Selection.style = wrdDoc.Styles("Titre 3")
wrdApp.Selection.TypeText text:="Produit 1"
wrdApp.Selection.TypeParagraph
wrdApp.Selection.style = wrdDoc.Styles("Normal")
wrdApp.Selection.TypeText text:="Text 1"
wrdApp.Selection.TypeParagraph
wrdApp.Selection.TypeText text:="Text 2" 

Et ainsi de suite...
Pour le ContentControl ce que j'ai essayé en dernier c'est ceci :

With tfDocx.BodyCC("startFormulas").Range
    .Style = tfDocx.Doc.Styles("Titre 2")
    .Text = "Produits BENOR"
End With
With tfDocx.BodyCC("startFormulas").Range.Characters.Last
    .InsertParagraphAfter()
    .Style = tfDocx.Doc.Styles("Titre 3")
    .Text = "essais"
End With 

Malheureusement ça ne marche pas comme désiré. (tfDocx.BodyCC("startFormulas") = fait appel au contentcontrol dans le document word)

Quelqu'un serait-il m'aiguiller? Voir me proposer des lignes de codes pour écrire l'exemple ci-dessus?

Merci d'avance

15 réponses

Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
et allons-y
VB Net n'est pas VBA

Marre de ceux qui ne savent pas dans quel langage exactement ils programment !


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Bonjour Ravens28.

Il me semble que le plus simple serait d'ouvrir manuellement votre document, puis de cajoler votre beau clavier et votre mignonne souris. Mais apparemment, vous trouvez cela trop simple. Alors, si vous tenez à utilisez vb.net, faites donc un programme qui ouvre votre document. C'est juste un peu moins simple, et peut se justifier dans certains cas. Et cela vous éviterait d'être gourmandé par les bénévoles qui en ont
marre de ceux qui ne savent pas dans quel langage exactement ils programment !


Et comme je les comprend !

Étant illettré, je signe d'une croix : ×
Pardon. Vilaine faute d'orthographe. Il manque un s à comprend.


Étant illettré, je signe d'une croix : ×
Loin de moi de vouloir vous offenser mais c'est en VB.net que je programme!
Je viens d'un code en VBA (que j'ai mis en exemple et pour lequel j'ai prévenu que c'était du VBA!).
Je suis en train de transposer ce code en VB.Net (je pense même pas que Visual Studio autorise le VBA!) en ouvrant une fenêtre Word via VB (comme tu le proposes) à l'aide de Microsoft.Office.Interop.Word.
Mais bon désolé d'avoir posé une question de débutant dans la section débutant... Il semblerait que cela ne se fasse pas.

Bien à vous,
Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Pour info VBA = Visual Basic Application ( et se rapporte à Microsoft Office : Excel,Word, etc .....)

Si tu avais spécifié que tu voulais piloter Word depuis VB net cela aurait été plus juste !
Impossible de t'aider : je ne connais point VBA

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Merci mais la définition de VBA je la connais et pour préciser ça ne fait pas que se rapporter à Microsoft office mais aussi à d'autres... Sa permet de "remplacer et d'étendre les macros".

Mais bon soit, j'ai eu un oublie de préciser que je voulais piloter word depuis vb étant le nez dedans depuis plusieurs semaines... Mais j'aurais pu te le dire si tu avais demandé plus de détails au lieu de m'envoyer directement sur les roses.
Du moins c'est comme ça que j'aurais fait avec un débutant plus débutant que moi. J'ai l'impression qu'ici on est pas trop les bienvenus.

Bien à toi,
Désolé. Sa = ça...
Vu. Alors je ne comprends pas pourquoi, lorsque vous avez ouvert Word, vous n'ouvrez pas votre document, et ce de manière automatique (connaissant le chemin d'accès dudit document bien sûr).

Quant à la convivialité de ce forum, je dois vous dire que j'y ai toujours été le bienvenu, avec même parfois des parties de rigolade (mais si, mais si). Une seule exception, la première fois. Je n'avais pas lu le règlement, et j'ai commis une sottise.

Cordialement.


Étant illettré, je signe d'une croix : ×
C'est fait le j'ouvre le document automatiquement en même temps que l'ouverture de Word. Je n'ai aucun soucis avec l'ouverture de mon document simplement de pouvoir y écrire de manière continue dans le ContentControl avec des styles différents à divers paragraphes...

Bonjour,

Je suis en train de transposer ce code en VB.Net (je pense même pas que Visual Studio autorise le VBA!) en ouvrant une fenêtre Word via VB (comme tu le proposes) à l'aide de Microsoft.Office.Interop.Word.


Tu peux piloter Word par automation avec VB.net de la même manière que tu pilotes Word par automation avec VBA. En gros, dépendant de ta version de VB.net, tu peux établir ta référence directement avec l'application Word, comme avec VBA. Dans ce cas, VB.net va soit créer lui-même la dll Microsoft.Office.Interop.Word ou (VB 2010, VB 2012) utiliser directement les Primary Interop Assemblies d'Office, si tu les as installés sur ta machine. Pour toutes les versions de VB,net, tu peux aussi établir directement la référence avec les PIA, si tu les as sur ta machine. Quoi qu'il en soit, sauf horreur de ma part tu devrais instancier ton objet Word d'une manière similaire à celle-ci:

Dim wrdapp as new Microsoft.Office.Interop.Word


Et établir ton objet WordDocument à partir wrdapp.

Et, en théorie, tes lignes:

wrdApp.Selection.MoveDown Unit:=wdLine, Count:=19
wrdApp.Selection.style = wrdDoc.Styles("Titre 2")
wrdApp.Selection.TypeText text:="Produits"
wrdApp.Selection.TypeParagraph
wrdApp.Selection.style = wrdDoc.Styles("Titre 3")
wrdApp.Selection.TypeText text:="Produit 1"
wrdApp.Selection.TypeParagraph
wrdApp.Selection.style = wrdDoc.Styles("Normal")
wrdApp.Selection.TypeText text:="Text 1"
wrdApp.Selection.TypeParagraph
wrdApp.Selection.TypeText text:="Text 2" 


devraient soit fonctionner telles quelles; ou bien être adaptées pour utiliser un objet Document au lieu de l'objet Application. Mais le principe est le même dans la mesure ou tu crées ton objet Document à partir de ton objet application.



Mais comme tu ne dis rien de ton ContentControl, cela reste difficile d'en dire plus.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
Je ne cesserai jamais, quant à moi, de scinder ;
- la question "pilotage" qui nécessite principalement la création des objets que l'on veut utiliser de l'application pilotée. Celle-là seule concerne VB.Net
- les instructions, fonctions, propriétés, etc... que l'on manipule dans l'application pilotée (en utilisant les objets créés à cette fin). Cette seconde partie n'a rien à voir avec VB.Net et TOUT à voir avec le langage de développement (VBA/Word, ici) de l'application pilotée.
Dans ces conditions :
1) ou l'on sait atteindre le but recherché directement depuis l'application "pilotée" (VBA/Word, ici) et on montre le code qu'on écrirait alors directement. Notre intervention se limiterait alors à corriger les éventuelles erreurs de "pilotage" (utilisation des objets créés)
2) ou on ne sait pas le faire directement dans l'application (VBA/Word) et la discussion est alors à ouvrir dans la section Langages dérivés > VBA.
Le fait d'utiliser VB.Net n'affranchit nullement de cette nécessité : la connaissance de VBA/Word en ce qui concerne le présent problème.
Voilà ce que j'en pense.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.

Bonjour,

Et puis, pour Word 2007 et suivants, on peut utiliser OpenXML pour modifier le fichier .docx directement, sans utiliser Word.
Il semble que j'ai vraiment du mal m'exprimer dans mon premier message. Je tiens à m'en excuser, car je vous mène sur le mauvais chemin à chercher de résoudre un problème que je n'ai pas

Concernant l'ouverture et le pilotage tout est ok. Voici mon code afin de p-e mieux introduire la suite :

tfDocx = New WordDocument(fileName, False, internalMode, richEditWindow)


Dont "WordDocument" est une classe contenant principalement ceci :

Dim isProcessOpen() As Process = Process.GetProcessesByName("WinWord")
   If isProcessOpen.Length = 0 Then
        wrdApp = New Word.Application
        wrdDoc = wrdApp.Documents.Open(fileName)
        wrdApp.Visible = True
   Else
        wrdApp = Marshal.GetActiveObject("Word.Application")
        wrdDoc = wrdApp.Documents.Open(fileName)
        wrdApp.Visible = True
   End If


Ensuite le coeur de mon problème modifié pour pouvoir être reproduit sans mes fonctions propres. Lorsque je tape le code suivant tout se passe comme désiré. C-à-d écrire une ligne où est écrit le mot "Produit" dans le style "Titre 2" et ce à l'intérieur du contentControl de mon document Word ouvert.
with wrdDoc.SelectContentControlsByTitle("startFormulas).Item(1).range
        .Style = tfDocx.Doc.Styles("Titre 2")
        .Text = "Produits"
end with


Par contre quand, dans le même contentControl, je veux écrire un sous-titre "essais" dans le style "Titre 2" ça merde... J'utilise le code suivant :
with wrdDoc.SelectContentControlsByTitle("startFormulas).Item(1).range
        .Style = tfDocx.Doc.Styles("Titre 2")
        .Text = "Produits"
end with
with wrdDoc.SelectContentControlsByTitle("startFormulas).Item(1).range.Characters.Last
        .InsertParagraphAfter()
        .Style = tfDocx.Doc.Styles("Titre 3")
        .Text = "essais"
End With


Ce qui se produit c'est que l'insertParagraphAfter n'est pas pris en compte et que les deux mots s'écrivent sur la même ligne et ce dans le style normal (pas du tout demandé)...
J'espère avoir été plus clair.
Sorry j'ai mis le mauvais smiley... ça aurait du être un truc du genre :
Et concernant la manière d'instancier mes objets je le fais comme suite :
Private wrdApp As Word.Application = Nothing
    Private wrdDoc As Word.Document = Nothing
    Private wrdPara As Word.Paragraph = Nothing


Désolé pour le double poste mais je n'ai pas trouvé la fonction éditer le post...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Il semble que j'ai vraiment du mal m'exprimer dans mon premier message. Je tiens à m'en excuser, car je vous mène sur le mauvais chemin à chercher de résoudre un problème que je n'ai pas

Jer pense que tu t'étais bien exprimé, mais peut-être moi insuffisamment.
Nous allons formuler autrement :
Oublie VB.Net et va directement sous Word.
Qu'y écrirais-tu (code VBA) qui atteint ton but ?
Si tu le sais ===>> montre
Si tu n'y parviens pas non plus depuis VBA/Word, ton problème n'est pas le pilotage, mais un problème VBA/Word, à savoir d'abord traiter (hors pilotage) en VBA et devant donc faire l'objet d'une discussion Langages dérivés > VBA.
On ne peut "piloter" que ce que l'on saurait faire directement