[VBA] Access met Word koppeling...

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • shorty
  • Registratie: Juli 2000
  • Laatst online: 06-11-2024

shorty

tralalalala!

Topicstarter
Ik heb een klein probleempje met de koppeling van een Access query naar een Word bestand. Ik doe een query in Access waar een aantal namen uit komen. Deze namen moeten dan weer in een brief worden gezet. Ik wil in 1 word document dus meerdere brieven hebben.

Ik heb de volgende code onder een knop staan:

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
29
Private Sub knpGenBrief_Click()
    
    Dim rstEmployees As New ADODB.Recordset
    Dim appWord As New Word.Application
    
    rstEmployees.Open "qryAfmeldenPraktijkopdracht", _
        CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        
    'If rstEmployees.RecordCount = 0 Then
        'DisplayMessage "Er zijn geen brieven te versturen!"
        'Exit Function
    'End If
    
   
        appWord.Documents.Add "F:\Blok 2\PRJBBR\doc06.doc"

    
    Do Until rstEmployees.EOF
        With appWord
            .ActiveDocument.ShowSpellingErrors = False
            .Selection.GoTo wdGoToBookmark, Name:="NaamOntvanger"
            .Visible = True
        End With
        appWord.Selection.TypeText _
        rstEmployees!Naam & " "
        rstEmployees.MoveNext
    Loop
    
End Sub


Met bovenstaande code krijg ik bijna wat ik wil maar net niet helemaal. Hij opent heel mooi een Word document en zet ook de gegevens erin maar alleen in de volgende uitvoer:

code:
1
Geachte <naam1> <naam2> <naam3> <naam4>


Nu wil ik het graag zo hebben dat ie binnen hetzelfde Word document op de volgende pagina nog een brief neerzet met <naam2> en op pagina 3 de naam met <naam3>. Weet iemand hoe ik dit aan kan pakken? Heb al zitten zoeken in m'n boeken en op inet maar niks passends gevonden.

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Je kan een nieuwe pagina invoegen via de volgende code:
Visual Basic:
1
appWord.Selection.InsertBreak wdPageBreak

Maar dit klinkt alsof je een mailmerge wilt doen. Met een mailmerge kan je dit soort dingen veel efficienter doen (ervan uitgaande dat iedere brief hetzelfde format heeft).

It’s nice to be important but it’s more important to be nice


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:33
Makkelijkst is om in Word een samenvoeg document te maken dat verwijst naar jouw query.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • shorty
  • Registratie: Juli 2000
  • Laatst online: 06-11-2024

shorty

tralalalala!

Topicstarter
StevenK schreef op dinsdag 11 januari 2005 @ 16:44:
Makkelijkst is om in Word een samenvoeg document te maken dat verwijst naar jouw query.
Hoe doe ik dat precies? En kan ik dat aanroepen vanuit Access? Dat is wel de bedoeling namelijk.

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
Ik heb ooit zoiets moeten doen en het lijkt op wat StevenK zegt:
Met [vb]DoCmd.OutputTo acOutputQuery, "qryQuery", acFormatRTF, strFileNaam, False[/vb] stop je het resultaat van een query in een rtf-bestand, wat de als data source dinet voor je brief template bij mail merge.

Hierna kun je met
[vb]
Call objWordApp.Documents.Open(strTemplateNaam)

' Mail merge
With objWordApp.ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
Call .Execute(Pause:=True)
End With

' Printen mail merge document
Call objWordApp.ActiveDocument.PrintOut

Call objWordApp.ActiveDocument.SaveAs(doe je ding.....)
[/vb]

De mail merge starten.

  • JJvG
  • Registratie: Juli 2003
  • Laatst online: 27-04 16:49
Je kan het inderdaad met een mailmerge doen, zoals hierboven is beschreven. Waar je wel aan moet denken is dat je Word document een bestaande query nodig heeft. Het gebruiken van specifieke WHERE statement per klant of per datum(middels formulieren of VBA code) is dan ook niet mogelijk. Het enige Enige plek voor een WHERE statement is je query-definitie. Het kan dus zijn dat je met een mailmerge niet kan doen wat je wil. In mijn eigen werk ben ik dit tegengekomen.

Alternatief dat ik heb verzonnen en hier dus kwijt wil als tip: Je kunt ook in Word (via VBA code) een template-document (.dot file) inserten. 't Is wel wat omslachtiger, maar het werkt dan als volgt:
- Maak een recordset
- Open word met het template-document
- Vervang in het templatedocument alle velden (door een zoek-vervangfunctie aan ter roepen die alle veldnamen uit je recordset opzoekt in je templatedocument en vervangt door de waarde uit het recordset)
- Voeg een nieuw template-document toe aan het document (bestaat dan uit n+1 pagina's)
- Herhaal het vervangen
- Opslaan/print van het document.

Op verzoek kan ik voorbeeldcode posten, maar dat heb ik nu niet bij me (ligt thuis)

  • Grote_Keizer
  • Registratie: Januari 2002
  • Laatst online: 11-09-2011
Omdat wij hier namens behoorlijk wat verschillende organisaties brieven versturen en dus verschillende opmaken nodig hebben maken we gebruik van een aantal word document templates met een koppeling naar een specifieke tabel. Deze tabel kan je vullen mbv simpele query en vervolgens kan je in word het document mergen (per record gewoon nette brief). Als je zelf veel met opmaak veranderingen te maken zult krijgen zou ik het op onze manier doen (dus vanuit word de koppeling maken en mergen)

  • shorty
  • Registratie: Juli 2000
  • Laatst online: 06-11-2024

shorty

tralalalala!

Topicstarter
Het is me inmiddels gelukt doormiddel van een aantal stukjes uit de voorgedragen oplossingen. Bedankt allemaal!

Loop nu weer tegen een ander probleem aan, iets met een query.

code:
1
2
3
Dim currOpdracht As Long
currOpdracht = rstEmployees!Opdrachtnummer
CurrentDb.Execute "UPDATE tblOpdracht SET Status = 'afgemeld' WHERE Opdrachtnummer = '" & currOpdracht & "'";


Ik krijg hierbij een "datatype mismatch". Dit terwijlj het veld "Opdrachtnummer" in de query een "lange integer" is en de variabele "currOpdracht" een "Long" is. Weet iemand wat hieraan te doen is?

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
...
Loop nu weer tegen een ander probleem aan, iets met een query.

code:
1
2
3
Dim currOpdracht As Long
currOpdracht = rstEmployees!Opdrachtnummer
CurrentDb.Execute "UPDATE tblOpdracht SET Status = 'afgemeld' WHERE Opdrachtnummer = '" & currOpdracht & "'";


Ik krijg hierbij een "datatype mismatch". Dit terwijlj het veld "Opdrachtnummer" in de query een "lange integer" is en de variabele "currOpdracht" een "Long" is. Weet iemand wat hieraan te doen is?[/quote]

Je stopt het opdrachtnummer in een long, maar gebruikt het in de query als string door het tussen quotes te plaatsen.

  • shorty
  • Registratie: Juli 2000
  • Laatst online: 06-11-2024

shorty

tralalalala!

Topicstarter
dus moet het tussen quotes uithalen?

als ik dat doe krijg ik de volgende foutmelding:

"Fout 3061 tijdens uitvoering: Too few parameters. Expected 1."

[ Voor 64% gewijzigd door shorty op 12-01-2005 22:55 ]


  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 16-02 09:59
In het algemeen krijg je die melding als je een spelfout hebt gemaakt t.a.v. veldnamen of zo.
Onderstaande code zou m.i. moeten werken, maar check ff de tabel- en veldnamen.

code:
1
2
3
Dim lngOpdrachtNr As Long
lngOpdrachtNr = rstEmployees!Opdrachtnummer
Call CurrentDb.Execute("UPDATE tblOpdracht SET Status = 'afgemeld' WHERE Opdrachtnummer = " & lngOpdrachtNr)
Pagina: 1