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.
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?
Synes godt om
Slettet bruger
11. juni 2008 - 11:38#2
jesperfjoelner>har du et eksempel, man kunne se?~)
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
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
'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
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
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"
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.
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.
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
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
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?
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.
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.
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.
Synes godt om
Ny brugerNybegynder
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.