Hoe maak ik een Word-document actief vanuit Access?

Status
Niet open voor verdere reacties.

tomswaelen

Gebruiker
Lid geworden
8 dec 2004
Berichten
349
Ik heb een Word-document dat aangeroepen wordt vanuit een knop in Access via de functie Application.Followhyperlink . Het Word-document heet altijd hetzelfde en staat altijd op dezelfde plaats (het gaat om een mail merge die gebruik maakt van een query in Access).

Alleen zou ik ook willen dat dat Word-document direct na het klikken op de knop, naar boven komt, omdat de gebruiker nadien nog dingen met dat document wilt doen. De focus blijft echter op de Access-applicatie.

Ik heb al zitten Googlen, maar ik kom er niet uit. Wie kan mij helpen?

EDIT: dit mag voor mijn part trouwens ook vanuit Word, dat er bij het openen van het document iets aangeroepen wordt waardoor dat document de focus krijgt.
 
Laatst bewerkt:
Ik snap je probleem niet; als ik een Word document open met FollowHyperlink, wordt dat netjes met de focus geopend. Staat dus pontificaal in beeld :).
 
Ja, bij mij dus niet. Ik heb trouwens de laatste versies van Windows en Office, dus daar kan het niet aan liggen.

Nu moet ik wel zeggen dat het Word-document een macro bevat die automatisch de mail merge uitvoert wanneer het document wordt geopend (vandaar mijn vorige vraag). Misschien ligt het daaraan? Daarom dat ik ook zei dat het eventueel ook vanuit die Word-macro mag, dat dat venster actief wordt gemaakt.
 
En je document opent wél op de voorgrond als je de macro niet uitvoert?
 
Net geprobeerd, met een gewoon document. Daar doet hij het wel.

Ik heb ook nog een andere database die een Word-document (wel met mail merge maar zonder automatische macro) opent, daar komt het Word-document ook gewoon op de voorgrond.

Het zal dus aan de macro liggen. Maar er moet toch ergens een code bestaan die dat venster automatisch op de voorgrond brengt?

Je kunt natuurlijk ook gewoon de mail merge handmatig uitvoeren, maar ik wil zoveel mogelijk automatiseren.
 
Laat die macro dan maar eens zien, ook al is dit niet het Word forum :)
 
Bij deze. Deze macro voert dus een mail merge uit (via e-mail), drukt dan diezelfde mails nog eens af (is ter archivering), en opent daarna een tweede document. Het is uiteindelijk de bedoeling dat dat tweede document een zelfde soort macro gaat bevatten. Omslachtig, ik weet het, maar ik weet geen andere manier. Maar het probleem is dus dat de focus niet verplaatst wordt naar het Word-document dat hij eerst moet openen.

Code:
Private Sub Document_Open()


'
' MailmergeNL Macro
'
'
    Windows("Document1.docm").Activate
    With ActiveDocument.MailMerge
        .Destination = wdSendToEmail
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = wdDefaultFirstRecord
            .LastRecord = wdDefaultLastRecord
        End With
        .Execute Pause:=False
    End With
    With ActiveDocument.MailMerge
        .Destination = wdSendToPrinter
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = wdDefaultFirstRecord
            .LastRecord = wdDefaultLastRecord
        End With
        .Execute Pause:=False
    End With
    Documents.Open FileName:="Document2.doc", _
        ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, _
        PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
        WritePasswordDocument:="", WritePasswordTemplate:="", Format:= _
        wdOpenFormatAuto, XMLTransform:=""

End Sub
 
Maar als je alles automatisch laat lopen, dan hoeft er toch niks getoond te worden? :) Overigens heb je deze regel ( Windows("Document1.docm").Activate) volgens mij niet nodig; zodra je de code uitvoert krijgt dat document immers al de focus. Misschien moet je de volgorde eens omgooien. Dus eerst afdrukken en dan mailen.
 
Net geprobeerd, maakt geen verschil.

Het rare is, als ik het Word-document zelf open (dus niet via de Access-knop die ik gemaakt heb), wordt de macro perfect uitgevoerd. Alleen als ik het Word-document open vanuit Access, lukt het niet. Dan voert hij de laatste stap van de macro (Documents.Open FileName:="Document2.doc", enzovoort) zelfs niet uit. Misschien moet ik het Word-doc op een andere manier aanroepen? Ik heb ergens gelezen dat je dat ook kunt via een Shell-commando in de VBA-code, maar daar ken ik de details niet van.
 
ik heb de volgende code in gebruik. Misschien dat je daarmee iets kan.
Code:
Private Sub Knop16_Click()
Refresh
'medingen uitzetten
    DoCmd.SetWarnings False

'tabel maken met de brief gegevens
    DoCmd.OpenQuery "QryVerzendBrief"

 
'testhuisstijl2 openen
    Dim WordApp As Object
        Set WordApp = CreateObject("word.Application")
        WordApp.Documents.Open "G:\x\Secretariaat\TestHuisstijl2.doc"
        WordApp.Visible = True

'MailMerge selected records from table to Word document
    With WordApp
        .ActiveDocument.MailMerge.OpenDataSource _
            Name:="G:\x\Secretariaat\brieven\Adressen.mdb", _
            LinkToSource:=True, Connection:="TblVerzendPostnr", _
            SQLStatement:="SELECT * FROM [TblVerzendPostnr]"
        .ActiveDocument.MailMerge.Execute
       ' .Close 0 hiermee wordt de opslag niet uitgevoerd.
    End With
'Name:="G:\x\Kwaliteitssysteem\Databases\Adressen.mdb", _
'nieuwe bestand opslaan
'brief gegevens ophalen om in titel te bewaren

    Dim rs As Recordset
    'Dim sql As String
    Dim Referentie As String
    Dim db As Database
    Dim OmschrijvingPost As String
    Dim filenaam As String

    Set db = CurrentDb()

    With CurrentDb.OpenRecordset("TblVerzendPostnr")
            Referentie = !OnzeReferentie
            OmschrijvingPost = !OmschrijvingPost
            filenaam = Referentie & "_" & OmschrijvingPost
            
    End With
    DoCmd.Echo False, "Bezig met opslaan van adressenlijst"

      WordApp.Application.ActiveDocument.SaveAs ("G:\x\Secretariaat\brieven\" & filenaam & ".doc")
      WordApp.Quit SaveChanges:=False

     
        Set WordApp = Nothing
        DoEvents
        DoCmd.Echo True

 
'nieuwe document openen

Dim WordApp2 As Object
Set WordApp2 = CreateObject("word.Application")
WordApp2.Documents.Open "G:\x\Secretariaat\brieven\" & filenaam & ".doc"
WordApp2.Visible = True
Set WordApp2 = Nothing

DoCmd.DeleteObject acTable, "tblverzendpostnr"






End Sub
 
Ik vrees dat mijn VBA-kennis veeeel te beperkt is om die code te kunnen aanpassen :) Ik kan ongeveer lezen wat hij doet, maar helemaal begrijp ik hem toch niet.

Eigenlijk heb ik een knop nodig die een vaste mail merge (vaste query in Access, telkens zelfde docnaam) uitvoert via e-mail, en daarna diezelfde merge afdrukt.
 
Maar waarom moet dat dan zichtbaar?
 
Wel, het vreemde is dat de laatste stap van die macro in Word (het openen van een ander document) nooit uitgevoerd wordt als ik het document open vanuit Access. Als ik het Word-document rechtstreeks open, wel. Dit heeft dan toch te maken met de focus, zou ik denken... Niet? :)
 
Ik ben ondertussen nog wat aan het prutsen geweest met een minder functionele macro. De bedoeling is nu gewoon om als het Word-doc vanuit Access geopend wordt, een mail merge uit te voeren en het Word-doc dan te saven.

De code loopt echter vast op dit: With ActiveDocument.MailMerge (staat in het geel in de VBA-editor)

De foutmelding heb ik niet meegenomen, maar het komt er op neer dat hij zegt dat het document niet actief is.

Aan het screenshot hieronder kan je ook zien dat het Word-doc inderdaad niet actief is. Hoe kan ik dit actief maken?

Capture.JPG

Hier nog de code, die ik een Document_Open heb staan:

Code:
Private Sub Document_Open()

    With ActiveDocument.MailMerge
        .Destination = wdSendToPrinter
        .SuppressBlankLines = True
        With .DataSource
            .FirstRecord = wdDefaultFirstRecord
            .LastRecord = wdDefaultLastRecord
        End With
        .Execute Pause:=False
    End With
    
    Application.Quit SaveChanges:=SaveChanges
    
End Sub
 
misschien geen elegante oplossing maar je zou met send key een alt-tab kunnen sturen waardoor word misschien actief wordt. maar er kunnen dan ook hele rare dingen gebeuren.
 
Eigenlijk heb ik een knop nodig die een vaste mail merge (vaste query in Access, telkens zelfde docnaam) uitvoert via e-mail, en daarna diezelfde merge afdrukt.
Dat kan toch? Dat doet volgens mij de code van jwaque prima. En je hóeft daar Word helemaal niet voor op het scherm te zien; je wint daar volgens mij niks mee. Het gaat tenslotte om de output; als die gestandaardiseerd gemaakt wordt (en dat moet volgens jouw gegevens kunnen) is er weinig mis mee als het allemaal op de achtergrond wordt uitgevoerd. Dus waarom wil je het Word dan toch kunnen zien?
 
Je hebt uiteraard gelijk, het gaat om de output. Alleen ken ik nog helemaal niet genoeg van VBA om die code naar eigen noden aan te passen... Dus ik was op zoek naar de ogenschijnlijk simpelere methode om het Word-document actief te maken.
 
We kunnen die code best voor je aanpassen, maar dan moeten we wel de parameters weten.
 
Tof :)

Wat moet je allemaal weten? De Word-bestandsnamen, neem ik aan? Naam van de query?

De mail merge moet telkens hetzelfde doen, namelijk op basis van de Access-query een mail merge uitvoeren naar de printer, en nadien Word sluiten (bestand opslaan mag, maar hoeft niet). De code hierboven voelt precies aan alsof ze veel meer doet :)
 
eens kijken of het mij lukt mijn eigen code beter uit te leggen. Anders wil octafish het vast aanvullen zodat we het voor je werkend krijgen. ik hoop dat je verder komt. als je jou gegegevens: querynaam, wordnaam en opslag kunnen we hem alvast wat aanpassen.
Code:
Private Sub Knop16_Click()
Refresh                                                                         'om op te slaan wat je misschien nog niet heb opgeslagen.

DoCmd.SetWarnings False                                              'medingen uitzetten zoals wilt u de query draaien etc.


DoCmd.OpenQuery "QryVerzendBrief"                              'tabel maken met de brief gegevens. hier wordt de query geopend met de gegevens voor in de brief. hier moet dus jou querynaam worden ingevuld. ik schrijf de gegevens weg in een tabel tblverzendpost nr. dat zou in theorie misschien niet nodig zijn om dit eerst in een tabel op te slaan maar ik wist niet hoe te mailmerge naar een query dus heb ik deze tussen oplossing gekozen.

 
Dim WordApp As Object                                                  'variable defineren als object
Set WordApp = CreateObject("word.Application")             'zorgen dat de variable  een word application is.
WordApp.Documents.Open "G:\x\Secretariaat\TestHuisstijl2.doc"                 'de naam van het te openen document defineren. bij mij heet het document 'testhuisstijl2 en staat op G:\x
WordApp.Visible = True                                                                              'word zichtbaar maken ik wil later het word document nog bewerken

'MailMerge selected records from table to Word document
    With WordApp
        .ActiveDocument.MailMerge.OpenDataSource _                                    'hier wordt de mail merge gestart. TblVerzendPostnr bevat dus de gegevens die later in de merge gebruikt moeten wordne. misschien kan je hier ook direct je query naam zetten.
            Name:="G:\x\Secretariaat\brieven\Adressen.mdb", _
            LinkToSource:=True, Connection:="TblVerzendPostnr", _
            SQLStatement:="SELECT * FROM [TblVerzendPostnr]"
        .ActiveDocument.MailMerge.Execute
       ' .Close 0 hiermee wordt de opslag niet uitgevoerd.
    End With
'Name:="G:\x\Kwaliteitssysteem\Databases\Adressen.mdb", _
'nieuwe bestand opslaan
'brief gegevens ophalen om in titel te bewaren

    Dim rs As Recordset                                                              dit stukje is om wat variable te defineren waarmee de naam van het document wordt opgebouwd.
    'Dim sql As String
    Dim Referentie As String
    Dim db As Database
    Dim OmschrijvingPost As String
    Dim filenaam As String

    Set db = CurrentDb()

    With CurrentDb.OpenRecordset("TblVerzendPostnr")
            Referentie = !OnzeReferentie
            OmschrijvingPost = !OmschrijvingPost
            filenaam = Referentie & "_" & OmschrijvingPost                  'hier is de filenaam voor het word document.
            
    End With
    DoCmd.Echo False, "Bezig met opslaan van adressenlijst"

      WordApp.Application.ActiveDocument.SaveAs ("G:\x\Secretariaat\brieven\" & filenaam & ".doc")           'word document opslaan
      WordApp.Quit SaveChanges:=False

     
        Set WordApp = Nothing                'variable leeg maken.
        DoEvents
        DoCmd.Echo True

 
'nieuwe document openen zodat het bewerkt kan gaan worden.

Dim WordApp2 As Object
Set WordApp2 = CreateObject("word.Application")
WordApp2.Documents.Open "G:\x\Secretariaat\brieven\" & filenaam & ".doc"
WordApp2.Visible = True
Set WordApp2 = Nothing

DoCmd.DeleteObject acTable, "tblverzendpostnr"                    'hier wordt de tijdelijke tabel weer verwijderd.






End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan