Avatar billede tjeppsson Nybegynder
16. maj 2007 - 13:06 Der er 11 kommentarer og
1 løsning

Makro til direkte "print" til PDF fra Excel

Jeg har et ønske om at kunne gemme hvert ark i et excel-ark som seperate PDF-sider. Jeg kan gøre det manuelt og det giver et perfekt PDF-output, men det er mange sider det drejer sig om, så en makro ville være perfekt.

Jeg er kommet så langt:
Sub Makro3()
'
   
   
    Sheets("tj").Select
    Range("A1:I36").Select
    Application.ActivePrinter = "PDF995 på Ne01:"
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Printtofile:=True, Prtofilename:="s:s0book\test.pdf", Collate:=True
    Sheets("Test").Select
End Sub

Men når makroen er kørt, får jeg følgende fejl, når jeg prøver at åbne pdf-dokumentet:
Adobe kunne ikke åbne filen "test.pdf fordi filtypen ikke understøttes.

Er der nogen, der har en løsning?
Avatar billede word-hajen Nybegynder
16. maj 2007 - 14:04 #1
Ja. Du kan ikke lave en pdf-fil direkte, men skal danne en postscript-fil, der derefter konverteres til en pdf.

Se http://www.eksperten.dk/spm/773430, tidspunkt 16/04-2007 11:27:33
Avatar billede tjeppsson Nybegynder
16. maj 2007 - 14:22 #2
Jeg har nu prøvet din makro fra dit tidligere svar, men får følgende fejl i din 'create postscript file:
"Compile error - named argument not found", med følgende markeret: "outputfilename:="
Avatar billede falster Ekspert
16. maj 2007 - 15:41 #3
Jf. word-hajen:

Det er dig, som har "tvunget" filen til at hedde test.pdf. Hvis du åbner den i f.eks. notepad, vil du i første linje se noget, der ligner "%!PS-Adobe-3.0". Dvs. at det ikke er en pdf, men en postscript-fil (test.ps).

Jeg tror heller ikke, at du kan automatisere sådan med PDF995. Den kræver ligesom den pause, som "Gem som"-dialogen giver. Efter tryk på "Gem-knappen" konverterer PDF995 ps-filen til pdf.

Men jeg lytter gerne med.
Avatar billede bak Forsker
16. maj 2007 - 16:23 #4
Her er lidt kode.
Den indsættes i et alm. modul, og kaldes så når der skal printes


Option Explicit

'Read INI settings
Declare Function GetPrivateProfileString Lib "kernel32" Alias _
                                        "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
                                                                    ByVal lpKeyName As Any, ByVal lpDefault As String, _
                                                                    ByVal lpReturnedString As String, ByVal nSize As Long, _
                                                                    ByVal lpFileName As String) As Long

'Write settings
Declare Function WritePrivateProfileString Lib "kernel32" Alias _
                                          "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _
                                                                        ByVal lpKeyName As Any, ByVal lpString As Any, _
                                                                        ByVal lpFileName As String) As Long

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub pdfwrite(outputfile As String, rng As Range)

    Dim syncfile As String, maxwaittime As Long
    Dim iniFileName As String, tmpPrinter As String
    Dim x As Long
    Dim tmpoutputfile As String, tmpAutoLaunch As String

    ' set the location of the PDF995.ini and the pdfsync files
    iniFileName = "C:\Program Files\pdf995\res\pdf995.ini"
    syncfile = "c:\documents and settings\all users\application data\pdf995\res\pdfsync.ini"
   
    Application.Goto rng
    ' save current settings from the PDF995.ini file
    tmpoutputfile = ReadINIfile("PARAMETERS", "Output File", iniFileName)
    tmpAutoLaunch = ReadINIfile("PARAMETERS", "Autolaunch", iniFileName)

    ' remove previous pdf if it exists
    On Error Resume Next
    Kill outputfile
    On Error GoTo Cleanup

    ' setup new values in PDF995.ini
    x = WritePrivateProfileString("PARAMETERS", "Output File", outputfile, iniFileName)
    x = WritePrivateProfileString("PARAMETERS", "AutoLaunch", "0", iniFileName)

    ' change the default printer to PDF995
    ' if running on Access 2000 or earlier, comment out the next two lines
    tmpPrinter = Application.ActivePrinter
    Application.ActivePrinter = "PDF995 on Ne06:"
   
  Selection.PrintOut Copies:=1, Collate:=True

    ' cleanup delay to allow PDF995 to finish up. When flagfile is nolonger present, PDF995 is done.
    Sleep (10000)
    maxwaittime = 300000        'If pdf995 isn't done in 5 min, quit anyway
    Do While ReadINIfile("PARAMETERS", "Generating PDF CS", syncfile) = "1" And maxwaittime > 0
        Sleep (10000)
        maxwaittime = maxwaittime - 10000
    Loop

    ' restore the original default printer and the PDF995.ini settings
Cleanup:
    Sleep (10000)
    x = WritePrivateProfileString("PARAMETERS", "Output File", tmpoutputfile, iniFileName)
    x = WritePrivateProfileString("PARAMETERS", "AutoLaunch", tmpAutoLaunch, iniFileName)
    x = WritePrivateProfileString("PARAMETERS", "Launch", "", iniFileName)
    On Error Resume Next
    Application.ActivePrinter = tmpPrinter

End Sub

Function ReadINIfile(sSection As String, sEntry As String, sFilename As String) As String
    Dim x As Long
    Dim sDefault As String
    Dim sRetBuf As String, iLenBuf As Integer
    Dim sValue As String
    sDefault$ = ""
    sRetBuf$ = String$(256, 0)        '256 null characters
    iLenBuf% = Len(sRetBuf$)
    x = GetPrivateProfileString(sSection, sEntry, _
                                sDefault$, sRetBuf$, iLenBuf%, sFilename)
    ReadINIfile = Left$(sRetBuf$, x)

End Function




---------------------------------------
For at kalde PDF-printet gøres således

Sub WRITE_MY_PDF_FILE()
    pdfwrite "c:\test3.pdf", Sheet1.Range("A1:G25")
End Sub
Avatar billede passiflora Juniormester
16. maj 2007 - 16:28 #5
I stedet for at lave pdf'er med adobe kunne man jo f.eks bruge win2pdf ... og her spiller klaveret bare ...

Søren
Avatar billede bak Forsker
16. maj 2007 - 16:40 #6
Det kunne se ud til at spørgeren bruger PDF995 og ikke Adobe. Derfor den lidt lange kode
Avatar billede passiflora Juniormester
16. maj 2007 - 16:42 #7
Ja, pdf995 kender jeg ikke ...

Men for win2 pdf fylder den ...

Sub Makro1()
  Range("a1:F12").Select
  Application.ActivePrinter = "Win2PDF på Ne00:"
  ActiveWindow.SelectedSheets.PrintOut Copies:=1, Printtofile:=True, Prtofilename:="c:\etellerandet.pdf", ActivePrinter:="Win2PDF på Ne00:", Collate:=True
End Sub
Avatar billede word-hajen Nybegynder
16. maj 2007 - 20:30 #8
Jeg var så ikke lige opmærksom på, at det ikke var Adobe (sikkert en "vane-tankegang").
Avatar billede tjeppsson Nybegynder
21. maj 2007 - 08:56 #9
Tusind tak for jeres svar - Bak, dit fungerede lige i øjet, så det var helt perfekt... Nåede at blive så frusteret over Excel inden da, at jeg fandt en måde at få Excel til at lave billeder i stedet...

Hvis nogen skulle være interesseret, er koden til det her:
Dim outputnavne(20)
Dim i, strGIFFileName, ctoTheChartHolder, chtTheChart, picThePicture, sglWidth, sglHeight, blnRet
outputnavne(0) = "DagensKommentar"
strGIFFileName = "q:\s&m\salgsfokus\output\uge19-23\" & outputnavne(0) & ".gif"

                '  Copy the selection to the clipboard as a picture
                Range(outputnavne(0)).CopyPicture Appearance:=xlScreen, Format:=xlPicture
               
                '  Add a chart object to the activesheet
                Set ctoTheChartHolder = ActiveSheet.ChartObjects.Add(0, 0, 800, 800)
                Set chtTheChart = ctoTheChartHolder.Chart
                ctoTheChartHolder.Activate
                With chtTheChart
                .ChartArea.Select
                .Paste
                Set picThePicture = .Pictures(1)
                End With
                                           
                With picThePicture
                    .Left = 0
                    .Top = 0
                    sglWidth = .Width + 7
                    sglHeight = .Height + 7
                End With
                                 
                With ctoTheChartHolder
                    .Border.LineStyle = xlNone
                    .Width = sglWidth
                    .Height = sglHeight
                End With

                blnRet = chtTheChart.export(FileName:=strGIFFileName, _
                            Filtername:="GIF", Interactive:=False)
                ctoTheChartHolder.Delete
                Set ctoTheChartHolder = Nothing

Tak for jeres hjælp...
Avatar billede tjeppsson Nybegynder
21. maj 2007 - 13:01 #10
Hej Bak,

Tak for dit svar, men jeg kom vist til at give pointene til wordhajen... :-) (tak for din tid, også, mr. Haj)

Men BAK, kan du ikke lige svare på: http://www.eksperten.dk/spm/779393, så er der også point til dig...
Avatar billede word-hajen Nybegynder
21. maj 2007 - 15:57 #11
Du har nu givet pointene til dig selv ;-)

ps! fru Haj
Avatar billede tjeppsson Nybegynder
22. maj 2007 - 09:02 #12
Dét er fløjteme smart.... Sorry... Håber bare Bak finder linket...
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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