Avatar billede lbthomsen Nybegynder
11. juni 2008 - 10:26 Der er 36 kommentarer

Knap til fletning med word

Hej,

Når i en formular eller rapport (access 2003) har fundet en kunde frem, vil jeg gerne have en Command-knap til at flette den enkelte kundes data ind i et eksisterende fletdokument evt. vha. en makro.
Dette skal ske i stedet for at gå ind i fletbrevet og derefter søge på kundenummeret.
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 11:31 #1
Det kan laves på et par måeder. En fin måde synes jeg, er at have en word-skabelon, hvor der i forvejen er indsat en række bogmærker, der hvor du vil have dine datastumper.
Word-skabelonen skal så ligge f.eks. i samme mappe som databasen, åbnes når du trykker på knappen og dine data indsættes.
Er det en acceptabel løsning for dig?
Avatar billede Slettet bruger
11. juni 2008 - 11:38 #2
jesperfjoelner>har du et eksempel, man kunne se?~)
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 11:44 #3
jesperfjoelner - Det vil være en fin løsning - Hvis den ved åbning også kan finde samme kundenummer, som man har bladret frem til i formularen/rapporten
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 11:48 #4
Ja jeg har et eksempel øjeblik...
Avatar billede Slettet bruger
11. juni 2008 - 11:59 #5
spg.eksperten@gmail.com
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 12:05 #6
Der er vedlagt en hjælpefunktion "insertTextAtBookMark".
Jeg antager at du har en wordskabelon med navnet "kundeprofil.dot" liggende i samme mappe som din database.
Jeg har bruget NZ() nogle steder for at funktionen ikke fejler, selv om værdien er null i tabellen.


Kopier dette ind i et modul:
---------------------------------

Sub UdskrivKundeprofil(kundeID As Long)

'Brug Late Binding som standard, det er mere stabilt og virker selv om databasenbrugeren ikke har sat
'en reference til Word under Tools > References.

'Early binding kan bruges hvis man har sat en reference til Word under Tools > references og har brug
'for at kunne se Words intellisense når man opbygger koden.


'Dim oDoc            As Word.Document            'early binding
'Dim oword          As Word.Application        'early binding
Dim oDoc            As Object                  'late binding
Dim oword          As Object                  'late binding

Dim skabelon        As String          'word-skabelon, der indeholder de bogmærker der skal bruges
Dim db              As DAO.Database
Dim rs              As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM tblKunder WHERE kundeID = " & kundeID)

skabelon = "kundeprofil.dot"

'Åbner word
Set oword = CreateObject("word.application")    'bruges til både late binding
'Set oWord = New Word.Application              'early binding

oword.Visible = True    'true hvis dokumentopbygning skal være synlig mens der udskrives

Set oDoc = oword.Documents.Add(Application.CurrentProject.Path & "\" & skabelon)
oword.Visible = True

'Indsætter
sInsertTextAtBookmark oword, "kundenr", Nz(rs!kundenr, "")
sInsertTextAtBookmark oword, "navn", Nz(rs!navn, "")
sInsertTextAtBookmark oword, "adresse", Nz(rs!Adresse, "")
sInsertTextAtBookmark oword, "postby", Nz(rs!Postnr, "") & " " & Nz(rs!Bynavn, "")
sInsertTextAtBookmark oword, "land", Nz(rs!land, "")

'oprydning
rs.Close
Set rs = Nothing
Set db = Nothing

End Sub


Sub sInsertTextAtBookmark(obj As Object, sBookmark As String, sText As String)
'Dette er hjælpefunktionen der indsætter tekst ved bogmærker.
If obj.ActiveDocument.Bookmarks.Exists(sBookmark) = True Then
    obj.ActiveDocument.Bookmarks(sBookmark).range.Text = "" & sText & ""
End If
End Sub
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 12:08 #7
Jeg glemte at sige at koden under din knap skal så være:

UdskrivKundeprofil me!kundeID

hvis dit f.eks. dit kundeID-felt på formularen hedder sådan.

Eksempel kan hentes her:
http://www.medicinskedatabaser.dk/opdatering/wordeksport.zip
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 13:31 #8
det er sådan noget jeg skal ud i! Det er bare lidt for teknisk.

Hvis vi starter fra jeg står i en formular og laver kommandoknappen - hvilke egenskaber giver jeg så den.

Der skal hentes data fra en forespørgsel som hedder "Eksport mail" fra kolonnerne "Aftalenummer", "Navn" og "Adresse" i første omgang.

Det dokument der skal flettes til hedder "Rykkermail.doc" - Dette dokument er i forvejen flettet med forespørgslen "Eksport mail"
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 13:39 #9
Jeg ikke om du nåede at hente filen med det samme, men jeg har lagt en formular i zip-filen som virker som du ønsker.

Egenskaber for din knap:
Under Hændelser > VedKlik > tryk på ...
og vælg Kodegenerator

og i koden skal du noget i stil med:

Private Sub cmdDinKnap_Click()
  UdskrivKundeprofil Me.kundeid
End Sub

er du vant til at bruge VBA-kode?

Herudover skal du have modul-koden ind i et kodemodul.

Alternativt kan jeg rette det til for dig, hvis du sender mig din db og skabelon til:
jesperfjoelner snabela hotmail punktum com
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 13:59 #10
Jeg har nu et modul6 med flg. kode:


Option Compare Database
Option Explicit
Sub sInsertTextAtBookmark(obj As Object, sBookmark As String, sText As String)
If obj.ActiveDocument.Bookmarks.Exists(sBookmark) = True Then
    obj.ActiveDocument.Bookmarks(sBookmark).range.Text = "" & sText & ""
End If
End Sub
Sub UdskrivKundeprofil(kundeid As Long)


'Brug Late Binding som standard, det er mere stabilt og virker selv om databasenbrugeren ikke har sat
'en reference til Word under Tools > References.

'Early binding kan bruges hvis man har sat en reference til Word under Tools > references og har brug
'for at kunne se Words intellisense når man opbygger koden.


'Dim oDoc            As Word.Document            'early binding
'Dim oword          As Word.Application        'early binding
Dim oDoc            As Object                  'late binding
Dim oword          As Object                  'late binding

Dim skabelon        As String          'word-skabelon, der indeholder de bogmærker der skal bruges
Dim db              As DAO.Database
Dim rs              As DAO.Recordset

Set db = CurrentDb

Set rs = db.OpenRecordset("SELECT * FROM stamdata WHERE Aftalenummer = " & Aftalenummer)

skabelon = "Rykkermail.doc"

'Åbner word
Set oword = CreateObject("word.application")    'bruges til både late binding
'Set oWord = New Word.Application              'early binding

oword.Visible = True    'true hvis dokumentopbygning skal være synlig mens der udskrives

Set oDoc = oword.Documents.Add(Application.CurrentProject.Path & "\" & skabelon)
oword.Visible = True


'Indsætter
sInsertTextAtBookmark oword, "Aftalenummer", Nz(rs!kundenr, "")
sInsertTextAtBookmark oword, "navn", Nz(rs!navn, "")
sInsertTextAtBookmark oword, "adresse", Nz(rs!Adresse, "")
sInsertTextAtBookmark oword, "postby", Nz(rs!Postnr, "") & " " & Nz(rs!bynavn, "")
sInsertTextAtBookmark oword, "land", Nz(rs!land, "")


'oprydning
rs.Close
Set rs = Nothing
Set db = Nothing

End Sub

og en formular med denne kode:

Private Sub Command2850_Click()
On Error GoTo Err_Command2850_Click


    PrintKundeprofil Me.Aftalenummer
   
End Sub

Det er den engelske version jeg har.

Hvordan er kommandoknappen forbundet med modulet??

Jeg er ikke vant til VBA så det ville være bedst hvis det kunne holdes på alm. brugerniveau :-)
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 14:14 #11
Ok, det er rigtig fint.

Jeg skal lige høre - er det et dokument som allerede er åbent?
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 14:15 #12
som du vil have indsat flere data i?

Var det nemmere at lave nogle flere flet-felter og nogle flere felter i forespørgslen og på den måde få dataene ind i dokumentet?
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 14:17 #13
Dokumentet er ikke åbent i forvejen, men er et dokument, som indeholder fletfelter fra en anden tabel og gerne skal hente nogle data, som ikke vises i formularen, men som ligger i tabellen "stamdata"
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 14:18 #14
Den nævnte løsning åbner et separat dokument og indsætter nogle data. Ellers skal vi lige have modificeret det lidt, hvis dokumentet allerede er åbent.
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 14:24 #15
Hvis den bare kan åbne dokumentet "Rykkermail.doc" vil dataene nok selv blive flettet ind, da dette dokument i forvejen hænger sammen med databasen.
Så skal den bare sørge for, at det pågældende aftalenummer findes frem i det flettede dokument.
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 14:30 #16
Jamen så tror jeg det virker.

Under din knap skal du bruge hændelsen (Events) "OnClick".
I designvisning skal du højreklikke på knappen > Generér hændelsesprocedure (eller hvad det nu hedder på engelsk Generate procedure?)

Du kommer nu ind i vba-koden.

Indsæt følgende:

Private Sub cmdDinKnap_Click()
  UdskrivKundeprofil Me.kundeid  'ret til navnet på feltet, hvor dit kunde ID
End Sub

Husk at rette koden så denne sektion

sInsertTextAtBookmark oword, "Aftalenummer", Nz(rs!kundenr, "")
sInsertTextAtBookmark oword, "navn", Nz(rs!navn, "")
sInsertTextAtBookmark oword, "adresse", Nz(rs!Adresse, "")
sInsertTextAtBookmark oword, "postby", Nz(rs!Postnr, "") & " " & Nz(rs!bynavn, "")
sInsertTextAtBookmark oword, "land", Nz(rs!land, "")

passer med dine feltnavne.

Har du oprettet bogmærker i dokumentet på de rigtige steder?
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 14:56 #17
Nu åbner den fint dokumentetet ved tryk på knappen, men den fanger ikke den reference, som er fundet i formularen, tager blot den første i rækken af kunder.

Koden er sådan:



Option Compare Database
Option Explicit
Sub sInsertTextAtBookmark(obj As Object, sBookmark As String, sText As String)
If obj.ActiveDocument.Bookmarks.Exists(sBookmark) = True Then
    obj.ActiveDocument.Bookmarks(sBookmark).range.Text = "" & sText & ""
End If
End Sub
Sub UdskrivKundeprofil(Aftalenr As Long)


'Brug Late Binding som standard, det er mere stabilt og virker selv om databasenbrugeren ikke har sat
'en reference til Word under Tools > References.

'Early binding kan bruges hvis man har sat en reference til Word under Tools > references og har brug
'for at kunne se Words intellisense når man opbygger koden.


'Dim oDoc            As Word.Document            'early binding
'Dim oword          As Word.Application        'early binding
Dim oDoc            As Object                  'late binding
Dim oword          As Object                  'late binding

Dim skabelon        As String          'word-skabelon, der indeholder de bogmærker der skal bruges
Dim db              As DAO.Database
Dim rs              As DAO.Recordset

Set db = CurrentDb

Set rs = db.OpenRecordset("SELECT * FROM stamdata kunde WHERE Aftalenr = " & Aftalenr)

skabelon = "Rykkermail.doc"

'Åbner word
Set oword = CreateObject("word.application")    'bruges til både late binding
'Set oWord = New Word.Application              'early binding

oword.Visible = True    'true hvis dokumentopbygning skal være synlig mens der udskrives

Set oDoc = oword.Documents.Add(Application.CurrentProject.Path & "\" & skabelon)
oword.Visible = True


'Indsætter
sInsertTextAtBookmark oword, "Aftalenr", Nz(rs!Aftalenr, "")
sInsertTextAtBookmark oword, "Fornavn", Nz(rs!Fornavn, "")


'oprydning
rs.Close
Set rs = Nothing
Set db = Nothing

End Sub

________________________________

Private Sub Command2850_Click()

  UdskrivKundeprofil Me.Aftalenr  'ret til navnet på feltet, hvor dit kunde ID
End Sub
Avatar billede jesperfjoelner Nybegynder
11. juni 2008 - 15:09 #18
Skal det her

Set rs = db.OpenRecordset("SELECT * FROM stamdata kunde WHERE Aftalenr = " & Aftalenr)

mon være

Set rs = db.OpenRecordset("SELECT * FROM [stamdata kunde] WHERE Aftalenr = " & Aftalenr)

Jeg bliver da i tvivl om et flet-dokument automatisk fanger de data det skal, når det åbnes på denne måde.

Jeg skal på arbejde nu, jeg må desværre vente og vende tilbage til dig i morgen.
Avatar billede lbthomsen Nybegynder
11. juni 2008 - 15:20 #19
Det gav ingen ændring -
Den åbner vist bare dokumentet.

Jeg venter til i morgen - Tak
Avatar billede jesperfjoelner Nybegynder
12. juni 2008 - 14:54 #20
Hvordan går det med det? Når du åbner dokumentet fletter den så dataene som den gjorde før? Er den stoppet med at flette?
Er det lykkedes at få bogmærkerne til at virke?
Avatar billede lbthomsen Nybegynder
17. juni 2008 - 11:30 #21
Jeg har ikke lige kigget på den siden, men er på den i dag igen.

Når jeg bare åbner word-filen, henter den data ind fra Access.
Men når jeg åbner via min formular og kommandoknap, åbner den dokumentet uden at indsætte data og uden sammenfletning.
Avatar billede jesperfjoelner Nybegynder
17. juni 2008 - 12:30 #22
Hvis du i forvejen fletter data ind i worddokumentet, kan du så ikke bare flette nogle flere data ind i nogle flere fletfelter?
Avatar billede lbthomsen Nybegynder
17. juni 2008 - 12:39 #23
Jo, men problemet er at når filen åbnes via databasen, fletter den ikke
Avatar billede jesperfjoelner Nybegynder
17. juni 2008 - 13:07 #24
Så du skal faktisk bare have åbnet din wordfil via knappen?

Denne kode kan gøre det:

Shell "C:\Programmer\Microsoft Office\OFFICE11\winword.exe "fuldStiTilDinWordfil", vbNormalFocus

Koden skal ligge under din knap.

men så skal du kende stien til Word-programmet. Kan det bruges?
Der findes også en måde at åbne en fil med det program, der som standard, hører til.
Avatar billede lbthomsen Nybegynder
17. juni 2008 - 13:56 #25
Jeg har nu denne linie.

Shell "C:\Program Files\Microsoft Office\Office12\WINWORD.EXE", vbNormalFocus

Og den åbner word.

Jeg kan ikke på den måde du beskriver få den til at åbne filen.
Avatar billede jesperfjoelner Nybegynder
17. juni 2008 - 14:28 #26
Du mangler stien til din wordfil. F.eks. således:

Shell "C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" "D:\dokumenter\kundeprofil.doc", vbNormalFocus
Avatar billede lbthomsen Nybegynder
17. juni 2008 - 14:38 #27
Så har jeg denne -

Shell "C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" "C:\Documents and Settings\lbt.BOVC\My Documents\domme.doc", vbNormalFocus

Den melder "Compile error: Syntax error"
Avatar billede jesperfjoelner Nybegynder
17. juni 2008 - 14:51 #28
Dette her virker for mig.
Bemærk de ændrede anførselstegn.

Shell "C:\Programmer\Microsoft Office\OFFICE11\winword.exe D:\dokumenter\filnavn.doc", vbNormalFocus

Obs. den melder fejl, hvis der er mellemrum i filnavnet, men ellers åbner den dokumentet som den skal. Det hele skal på een linje.
Avatar billede lbthomsen Nybegynder
17. juni 2008 - 15:01 #29
Hej,

Nu kører det :-)

Det ville nu være lige i øjet hvis den så kunne finde det aftalenummer i det flettede dokument, som man står på i formularen når der trykkes på kommandoknappen.
Avatar billede jesperfjoelner Nybegynder
17. juni 2008 - 15:30 #30
Hej hej jeg vender lige tilbage lidt senere, det kan bestemt lade sig gøre.
Avatar billede lbthomsen Nybegynder
17. juni 2008 - 15:43 #31
Bare i orden
Avatar billede lbthomsen Nybegynder
19. juni 2008 - 11:44 #32
Er du på i dag?
Avatar billede jesperfjoelner Nybegynder
19. juni 2008 - 13:37 #33
jep, jeg har kigget lidt på det, er ikke helt klar med det endnu. Vender tilbage her i løbet af eftermiddagen.
Avatar billede jesperfjoelner Nybegynder
19. juni 2008 - 18:01 #34
Kunne du sende mig dit fletdokument?
Avatar billede lbthomsen Nybegynder
02. juli 2008 - 10:51 #35
Yes - hvor skal jeg sende det hen?
Avatar billede jesperfjoelner Nybegynder
04. juli 2008 - 10:44 #36
Du må gerne sende den til jesperfjoelner AT hotmail PUNKTUM com

men jeg kan desværre først kigge på det efter min ferie, så der går et par uger.
Måske kan andre hjælpe dig her igennem inden da, men ellers ser jeg gerne på det, men det går så noget tid.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester