Word-gegevens in Excel macro.

Status
Niet open voor verdere reacties.

MDN111

Gebruiker
Lid geworden
13 aug 2007
Berichten
503
Hello !

Zou het mogelijk zijn om in een Excel macro gegevens op te halen uit een Word-bestand?

Bijvoorbeeld iets in de zin van (wat nu volgt is zware fantasie):

Code:
Sub Excelmacro()
dim cString as string, oWord as object, oFile as object
set oWord = Word.application
set oFile = oWord.OpenFile ("Myfile.doc")
cString = oFile.Bookmark.Myref.value
...
'Hier gaan we met cString verder om te doen we we nodig hebben in de Excel-toepassing.
...
oFile.Close
set oWord = Nothing
End sub

Ik herhaal het nogmaals, bovenstaande code is puur imaginair en dient slechts om mijn probleem enigszins te verduidelijken. Ik moet er nog wel bij vermelden dat het Word-bestand invulvelden bevat.

Bij voorbaat dank & groeten,
MDN111.
 
Nogmaals Hello !

Ik was een beetje snel om de vraag te posten. Na een uurtje zoeken ben ik zelf al een flink eind op weg geraakt omdat ik kennis gemaakt heb met de functie GetObject(). Die levert mij een Word-bestand met alle properties er op en er aan.

Groeten,
MDN111
 
En als je via extra/verwijzingen MS Word Object toevoegd, dan kun je ook nog intellisense gebruiken bij je Word Object.
Nadeel is dan dat als de target PC een andere Word versie heeft je mogelijk een foutmelding krijgt. Ik gebruik tijdens ontwikkelen de early binding (via exta/verwijzingen) en voor deployment de late binding versie.
 
Hallo Mr. Dirks,

Bedankt voor uw reactie !

Zoals ik reeds meldde was ik ook nog verder op zoek gegaan en daarbij op een interessante link gestuit: http://word.mvps.org/FAQs/InterDev/EarlyvsLateBinding.htm

Maar in feite is mijn probleem eenvoudiger:

Er is een Word-bestand met daarin een invoerveld en vanuit een Excel-macro wil ik de waarde ophalen die in dat veld staat. Niets meer dan dat.

Ik heb een functie gevonden die mij blijkbaar een object teruggeeft met daarin een Word-document en waarvan ik via de gepaste property kan terugvinden wat ik wens. Dat leidde tot de hiernavolgende code:

Code:
Function ImportNohg(ByVal cFile As String) As String
Dim DocObject As Object
Set DocObject = GetObject(ThisWorkbook.Path & "\" & cFile)
ImportNohg = DocObject.FormFields("hgnr").Result
Set DocObject = Nothing
End Function

Deze Udf werkt wel, maar er blijven nogal wat tijdelijke bestanden achter van het type ~$.....doc. Dat is vervelend want als men nadien Word opent, begint de recovery procedure te lopen, enz.

Ook een toewijzen van Nothing aan het object juist voor het beëindigen van de Udf brengt geen soelaas.

Enige suggestie ?

Groeten,
MDN111.
 
Deze Udf werkt wel, maar er blijven nogal wat tijdelijke bestanden achter van het type ~$.....doc. Dat is vervelend want als men nadien Word opent, begint de recovery procedure te lopen, enz.

Ook een toewijzen van Nothing aan het object juist voor het beëindigen van de Udf brengt geen soelaas.

DocObject refereert neem ik aan naar Word.Document. Dan is het nog erger dan alleen tijdelijke bestanden. Als je bij je processen kijken (ctrl-alt-del, taakbeheer) dan zul je zien wat Winword.exe ook nog gewoon op de achtergrond draait en dus ook resources in beslag neemt... op het moment dat je de docobject=nothing uitvoert wordt de verwijzing opgeruimd, maar de server die het wordobject levert draait gewoon nog. Je zult met DocObject.close het object moeten sluiten. Als je intellisense gebruikt (early binding dus) dan kun je zien welke parameters daar bij horen

Ik dacht dat je een true of false moest opgeven om aan te geven of er gesaved moest worden. Als DocObject niet naar het document wijst maar naar een Word object dan moet het DocObject.Documents.Close worden
 
Hallo Mr. Dirks,

Nogmaals dank.

Inderdaad. Na toevoegen van de methode DocObject.Close zijn de problemen opgelost. DocObject is een Word-Document en de Close methode kwam voor in het intellisense-tabelletje.

Dat van het gebruiken van Early Binding bij het ontwikkelen en Late Binding voor de productie-toepassing, doe je dat telkens manueel of doe je dat met conditional compiling (#If expression Then) ?

Groeten,
MDN111.
 
Vaak doe ik dat idd met conditional compiling, behalve dan het toevoegen van de referentie. Dit kan in principe ook nog automatisch (weet even niet uit m'n hoofd welk object dat zo is, maar volgens mij in het application object).
Als de applicatie in VBA geschreven is hou ik het meestal op Early binding - de applicatie is dan vaak voor een bepaalde klant geschreven, en dan is het altijd makkelijk om de referentie aan te passen. Is het echter een programma in VB dan ligt het wat anders - ik zou dan een nieuwe executable moeten genereren en da's natuurlijk niet echt gebruikersvriendelijk
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan