06. maj 2011 - 13:43Der er
12 kommentarer og 1 løsning
Gemme Word dokument som PDF fra Access
Jeg har en applikation hvor jeg har lavet en masse automatisering af Word fra Access (en form for dokumentstyringssystem) Men nu ville jeg gerne kunne gemme et Worddokument som en PDF fil. Nogen der har prøvet det og kan fortælle hvordan.
Det er jo normalt ikke noget probelm at gemme f.eks. en rapport som PDF - acFormatPDF (Kræver en plugin i Access 2007, men er standard i 2010 versionen)
Hvad skulle det lige hjælpe? PDF formatet er indbygget i Office 2010 og hvis jeg skal bruge en PDF printer så skal jeg være sikker på at alle brugere har den installeret o.s.v.
Hvis brugerne skal kunne gemme Worddokumentet til pdf - uafhængig af Wordversion - tror jeg ikke, at du kan komme uden om at sikre dig, at de har "noget" installeret ud over Word - f.eks. en pdf-printer.
Jeg ved at de har Office 2010 (skulle der gemme sig en enkelt i et mørkt kontor, så har de Office 2007 + SaveAsPDFandXPS udvidelsen) og der er en indbygget måde i Access' DoCmd.Output der kan bruge acFormatPDF så f.eks. en rapport gemmes som en PDF fil - det virker fortrinligt og jeg bruger det rigtig meget.
I mit system har jeg en funktion hvor man kan vælge at sende et dokument via mail og her vil jeg gerne kunne omdanne dokumentet til en PDF fil først så det bliver vanskeliggjort at ændre i det.
Altså tage fat i dokumentet, gemme det som PDF - alt gjort fra Access og helst uden at brugeren ser andet end måske lige Word åbnet i et blink.
Hvis man slår wdFormatPDF op på Google, så findes den også. Så det må kunne lade sig gøre på en måde.
Synes godt om
Slettet bruger
09. maj 2011 - 13:11#5
optag det, at gemme som pdf i word, og brug vba koden i access vba koden.
Synes godt om
Slettet bruger
09. maj 2011 - 13:12#6
optag det, at gemme som pdf, som makro i word; og brug vba koden i access vba koden.
Jeg har lavet følgende funktion som gør det jeg gerne vil have den til og hvis det gør godt returnerer den navnet på den dannede PDF
fhpFilePart er en funktion der kan returnere en bestemt del af et filnavn.
Public Function fhpWordToPDF(aDocument As String) As String ' ----------------------------------------------------------------------------------- ' Purpose : Knoverterer et Worddokument til PDF ' Parameters : ' Returns : String ' Created : 08-05-2011 ' Modified : ' Remarks : ' ----------------------------------------------------------------------------------- On Error GoTo Error_fhpWordToPDF Dim aPDF As String Dim appWord As Object
Error_fhpWordToPDF: fhpWordToPDF = "" Select Case Err.Number Case 3021 Case 2501 Case Is < 0 Case Else MsgBox Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error in procedure 'fhpWordToPDF'" fhpError_Display "modOffice", "fhpWordToPDF" End Select Resume Exit_fhpWordToPDF
End Function
Synes godt om
Slettet bruger
09. maj 2011 - 22:42#8
OK - så fik vi den - ser at brugeren lige skal briefes (visible=true). Er den 'select case' starten på noget mere udbygget?
Ja Visible kunne godt være false - det var bare for at jeg kunne se om der nu også skete noget
Hvis der er Select Case Err.Number du mener, så er det bare for at undgå diverse uinteressante fejl (2501 er noget med at Open was canceled, 3021 kan jeg ikke huske hvad betyder) Det er noget jeg begyndte med for mange år siden da jeg fik min første version af FMS codetools. fhpError_Display er min egen fejlroutine der viser en form hvor brugeren kan taste nogle ekstra oplysninger som gemmes i en logfil, som så senere kan sendes til mig for fejlsøgning.
Synes godt om
Slettet bruger
11. maj 2011 - 14:39#10
Gør 'select Case Err.Number's afslutning med en 'case else' ikke hele select'en overflødig? - bortset fra som skabelon for rettelser hvor man så fjerner 'case else' og tilføjer under de enkelte cases.
Jeg bruger også masser af små funtioner - ikke kun for at undlade at genskrive de samme ting gang på gang - men også fordi vba er så lowlevel at man tvinges ud i variabel gymnastik omkring detaljer. Det gør programmering kedeligt og skjuler gennemsigtigheden af løsningslogikken på anvendelsplanet.
Eksempel på en 'one-liner', der 'sparer' kravet om tilstedeværelse af en variabel.
Function leftOfInstrRev(str, stringMatch): leftOfInstrRev = Left(str, InStrRev(str, stringMatch) - 1): End Function
så kan kilden til brug til extension skift af et filnavn både angives litteralt eller som sammensat udtryk eller angivet af variabel:
leftOfInstrRev(wordfile,".") & ".pdf"
En anden dejlig vba feature er 'unnamed variables' som også virker på objekter
with CreateObject("Word.Application") if val(.version) >= 10 then ...
Gør 'select Case Err.Number's afslutning med en 'case else' ikke hele select'en overflødig?
Det mener jeg absolut ikke den gør - hvis de fjernes så får jeg uønskede fejlmeddelelser smidt i hovedet for 2501 og 3021 og 'Application specific' som er < 0
Jeg har altid lært at hvis man skal referere til noget mere end 1 gang, så brug en variabel for at minimere risikoen for fejl. aPDF kunne godt være skiftet med fhpFilePart(aDocument, hpFile_Path) & fhpFilePart(aDocument, hpFile_Base) & ".pdf" Men da den bruges 2 gange så siger min barnelærdom mig at man laver en variabel. Men det er selvfølgelig 30 år siden jeg lærte det, så det kan da godt være gammeldags :-)
Synes godt om
Slettet bruger
11. maj 2011 - 20:07#12
Jeg tog fejl af noget så simplet som 'select case' syntaksen - forvekslede med switch i C og Java - du har naturligvis ret.
Ingen kan betvivle hvad du skriver om variable anvendelse.
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.