[VB.NET 2008] Word Automation - Procedure tekst invoegen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Wekkel
  • Registratie: Maart 2000
  • Laatst online: 14-08-2024

Wekkel

De downloadkoning

Topicstarter
Ik voel mij erg dom dat ik deze vraag stel, doch ik kom er echt niet verder mee.

Ik maak een programma met Visual Studio 2008 in Visual Basic, een Standaard Windows Form Application. De bedoeling van het programma is dat ik tekst kan invoegen in een formulier met textboxen. De inhoud daarvan wordt na het klikken van een button in een nieuw Word document gezet.

De korte samenvatting van mijn code is als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Imports Microsoft.Office.Interop

Public Class fmAutoText
    Dim wrdApp As Word.Application
    Dim wrdDoc As Word.Document

Private Sub btnOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOk.Click

       Dim wrdApp As New Word.Application
       Dim newDoc As Word.Document = wrdApp.Documents.Add
       wrdApp.Visible = True

            newDoc.ActiveWindow.Selection.Font.Bold = True     
            newDoc.ActiveWindow.Selection.TypeText(txtRpNaam.Text) 
            newDoc.ActiveWindow.Selection.Font.Bold = False
            writeintocells(", een ")
            writeintocells(cbRpVorm.Text)
       Me.Close()
End Sub

Private Sub writeintocells(ByVal textinput As String)
        wrdDoc = New Word.Document
        If textinput = "" Then
            textinput = "[   ]"
        End If
        wrdDoc.ActiveWindow.Selection.TypeText(textinput)
    
End Sub


Met de code
code:
1
newDoc.ActiveWindow.Selection.TypeText(txtRpNaam.Text)

kan ik teksten uit mijn textboxen in het Word document krijgen. Dit moet echter makkelijker kunnen met een Procedure. Dan kan ik immers eenvoudig toevoegen dat bij een lege textbox de inhoud "[ ]" moet worden.

Ik probeer dat te doen met de Procedure 'writeintocells', door hetzelfde commando te herhalen in de Procedure 'writecells'. Resultaat van bovenstaande gehele code is dat txtRpNaam.Text keurig in een nieuw Word document komt.
De Procedure 'writeintocells' doet echter niets.

Ik zie iets over het hoofd en kan hier helaas niets over vinden bij MSDN, diverse fora. In een Visual Studio Tools for Office kreeg ik een vergelijkbare procedure (met dezelfde insteek, maar dan als AddIn in Word) het wel aan de gang met het commando
code:
1
Globals.ThisAddIn.Application.ActiveDocument.ActiveWindow.Selection.TypeText(textinput)


Mijn vermoeden is dat de bijzonderheid gelegen is in het feit dat ik van de VB.NET applicatie naar de Word applicatie schakel en vice versa. Een andere mogelijke reden die ik kan bedenken is het feit dat ik in de button_click procedure een Word document aanroep en vervolgens in een andere procedure (writeincells) probeer een actie uit te voeren op hetzelfde document. Daar zou het ook mis kunnen gaan.

De 'handboeken' bieden geen ondersteuning, en vele dagen Google brengen ook geen verlichting. Frustrerend, omdat ik het met de VSTO benadering wel werkend kreeg.

Als iemand een minuut kan sparen om mee te denken, graag. Boeksuggesties zijn ook zeer welkom.


Ik leer VB.NET the hard way door veel te lezen en gewoon te proberen. Echter, Word Automation lijkt in mijn beleving een ondergeschoven kindje in alle Wrox/O'Reilly/Microsoft publicaties :o

[ Voor 4% gewijzigd door Wekkel op 21-03-2009 00:00 ]


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Word automation is dan ook VBA en geen VB.NET. Je verhaal is verder een beetje wazig, maar als ik het goed begrijp heb je een losse functie gebouwd die [...] moet invoegen als het vakje niet bestaat. Daar doe je vervolgens:

Visual Basic:
1
2
3
        wrdDoc = New Word.Document
(...)
        wrdDoc.ActiveWindow.Selection.TypeText(textinput)


oftewel: je opent een nieuw worddocument, en plaatst daar de tekst in. Wat je -neem ik aan- wilt, is de tekst in het bestaande worddocument zetten: daarvoor moet je het worddocument (of de selectie) doorgeven aan je functie.

Voor informatie over de API van de diverse officeprogramma's moet je altijd een beetje combineren: de helpdocumentatie van word, de object browser (in de VB-editor in word te vinden) en MSDN.

Als bovenstaande niet is wat je bedoelt, herformuleer dan even in een niet-technische manier wát je nu precies wilt. Dat is me namelijk niet geheel duidelijk uit je verhaal

Acties:
  • 0 Henk 'm!

  • Wekkel
  • Registratie: Maart 2000
  • Laatst online: 14-08-2024

Wekkel

De downloadkoning

Topicstarter
Ik zal het punt proberen dieper uit te leggen.

Met de volgende code kan ik de inhoud van mijn textboxen uit mijn Windows Form in een Word document laten schrijven. Dat gebeurt in de Sub procedure Button1_Click. De tekst komt dan in het Word document te staan.
code:
1
newDoc.ActiveWindow.Selection.TypeText(txtRpNaam.Text)


Dat werkt prima, maar ik zet voor elke actie 'tekst invoegen' dus deze regel neer. Ik denk dat dit korter kan door voor deze actie een aparte procedure te maken (een eigen private sub zal ik maar zeggen). Dan hoef alleen de procedure aan te roepen met als variabele mijn textbox.text (bv txtRpNaam.Text).

Dat probeer ik met de volgende Procedure
code:
1
2
3
4
5
6
Private Sub writeintocells(ByVal textinput As String)
        wrdDoc = New Word.Document
        If textinput = "" Then
            textinput = "[   ]"
        End If
        wrdDoc.ActiveWindow.Selection.TypeText(textinput)


Voordeel van deze benadering is dat ik extra logica in kan voegen (als de textbox leeg is, wordt de tekstbox inhoud '[ ]'). Dat kan ook met de andere code, maar dan doe ik voor iedere in te voegen textbox.text telkens hetzelfde. Ik probeer dus een stukje her te gebruiken code te creëren zodat de code slanker wordt (en beter hanteerbaar/geschikt voor hergebruik). Dat zou de procedure 'writeincells' moeten zijn.

Ik denk dat
daarvoor moet je het worddocument (of de selectie) doorgeven aan je functie
hier de crux moet zitten. Een waardevolle gedachte, daar ga ik verder op zoeken.

Acties:
  • 0 Henk 'm!

  • Wekkel
  • Registratie: Maart 2000
  • Laatst online: 14-08-2024

Wekkel

De downloadkoning

Topicstarter
Ik heb de code inmiddels veranderd.

Bezig met de plantjes in de tuin realiseerde ik mij dat ik hoe dan ook in de Button_Click procedure telkens een regel opschrijf die opdracht geeft tekst in het Word document te schrijven.
code:
1
newDoc.ActiveWindow.Selection.TypeText(txtRpNaam.Text)


Dat doe ik voor elke textbox, dus of dat nou een korte zin is of een wat langere, dat maakt niet uit. De lange zin kan immers ook korter worden opgeschreven met de juiste toevoegingen. In zoverre is mijn wens dus niet persé beter dan het huidige.

Ik ben dus afgestapt van het idee dat mijn aparte procedure ook de handeling moet verrichten van schrijven in het Word venster. Het maakt immers niet uit. De andere procedure (hernoemd van 'writeincells' naar 'preprocessbookmark') heb ik aangepast.
Belangrijkste punt wat ik niet goed had gedaan -> ByVal moest ByRef worden. Dus precies wat ValHallASW al zei ;)
code:
1
2
3
4
Private Sub preprocessbookmark(ByRef textinput As String)
        If textinput = "" Then
            textinput = "[   ]"
        End If


Het nadeel van deze structuur is dat ik wel alle textboxes door deze procedure moet halen, voordat ik aan de schrijfcommando's richting het Word venster toekom.
code:
1
2
3
4
5
6
7
        preprocessbookmark(txtRpNaam.Text)
        preprocessbookmark(txtRpZetel.Text)
        preprocessbookmark(txtRpPostcode.Text)
        preprocessbookmark(txtRpPlaats.Text)
        preprocessbookmark(txtRpAdres.Text)
        preprocessbookmark(txtRpKvK.Text)
        preprocessbookmark(txtRPCountry.Text)


Hoe dan ook, het werkt tenminste ;)
Schaven aan de code kan altijd nog.

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ValHallASW geeft je je fout op een presenteerblaadje en je negeert zijn opmerking compleet.

Volgens mij heb je dringend nood aan een goeie dosis koffie, de MSDN documentatie en een portie inzicht.
Als je telkens een nieuw document creert in je writeintocells is het nogal logisch dat het resultaat niet is wat je verwacht.

Ik kan het niet afleiden uit je TS maar om tekst in te voegen in Word ben je het best af door een template te maken met bookmarks. Van deze template maak je dan een document waarin je elke bookmark vervangt door de tekst uit je programma. Je bent dan compleet onafhankelijk van de layout die gekozen wordt door de persoon die de template maakt.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Wekkel
  • Registratie: Maart 2000
  • Laatst online: 14-08-2024

Wekkel

De downloadkoning

Topicstarter
H!GHGuY schreef op zondag 22 maart 2009 @ 11:25:
ValHallASW geeft je je fout op een presenteerblaadje en je negeert zijn opmerking compleet.
Ik begrijp je opmerking niet. Wellicht kan je mij dan een hint geven?

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Wekkel schreef op zondag 22 maart 2009 @ 15:12:
Ik begrijp je opmerking niet. Wellicht kan je mij dan een hint geven?
=>
ValHallASW schreef op zaterdag 21 maart 2009 @ 11:29:
Visual Basic:
1
2
3
        wrdDoc = New Word.Document
(...)
        wrdDoc.ActiveWindow.Selection.TypeText(textinput)


oftewel: je opent een nieuw worddocument, en plaatst daar de tekst in. Wat je -neem ik aan- wilt, is de tekst in het bestaande worddocument zetten: daarvoor moet je het worddocument (of de selectie) doorgeven aan je functie.

ASSUME makes an ASS out of U and ME

Pagina: 1