Een bepaald UserForm een PDF van maken.

Status
Niet open voor verdere reacties.

DutchOirs

Gebruiker
Lid geworden
30 sep 2009
Berichten
891
Goedemorgen,

Dit is een vervolg van een bepaald UserForm Printen.

Om een bepaald UserForm te printen zijn we uit gekomen (zie draadje een bepaald UserForm Printen)

Aansluitend om van ditzelfde UserForm een PDF te maken zijn we uiteindelijk ook uitgekomen, maar
er doet zich wel een raar fenomeen voor.

Als ik een snapshot maak van het UserForm en deze vervolgens wil omzetten naar een PDF, komt er iedere keer
het snapshot van vorige keer uit.

Als ik opstart en een 1e maal een snapshot maak, maakt hij wel het PDF, maar daar staat dus niets in.
Bij de 2e keer, als je hetzelfde UserForm weer een snapshot van maakt komt er wel het goede uit.
Maar eigenlijk is dit het snapshot van vorige keer.

Zal de macro neer zetten en mocht iemand een idee hebben, gaarne.
Code:
Private Sub PDFUserFormBut_Click()
  Dim hWnd As Long, xlTypePDF, pdfjob As Object, sPDFName As String, ePDFPath As String, Bestand As String, txt As String, fName As String, wsTemp As Worksheet
  
  Sheets("Behang").Unprotect                                   ' haalt de beveiliging van het blad
  hWnd = FindWindow("ThunderDFrame", PAA_APLFrame.Caption)
  SetForegroundWindow hWnd
  keybd_event VK_SNAPSHOT, 1, 0, 0      ' maakt een printscreen van dit Userform
  
  DoEvents
  With Worksheets("Behang").ChartObjects.Add(140, 35, PAA_APLFrame.Width + 120, PAA_APLFrame.Height + 50)
    .Chart.ChartArea.Border.LineStyle = xlNone
    .Activate
    .Chart.Paste
  End With
  
  Set wsTemp = Sheets("Behang")
  With wsTemp
     With .PageSetup                                         ' Height * 0,7 kan je aanpassen kleiner of groter
       .LeftMargin = Application.InchesToPoints(0.3)         ' small margins
       .RightMargin = Application.InchesToPoints(0.3)
       .TopMargin = Application.InchesToPoints(0.3)
       .BottomMargin = Application.InchesToPoints(0.3)
       .Orientation = xlLandscape                            ' most important setting here
     End With
  End With

  fName = ActiveWorkbook.Worksheets("Control").Range("AC73") & ActiveWorkbook.Worksheets("Control").Range("D20") & Format(ActiveWorkbook.Worksheets("Control").Range("E16"), "mmmm") & ".xls" ' Path en Naam  + extensie
  MijnNaam = fName
  
  sPDFName = IIf(MijnNaam = "", "GeenNaam", MijnNaam) & ".xls"       ' sPDFNaame = Als MijnNaam = "" dan "GeenNaam" anders MijnNaam & xls
  ePDFPath = ThisWorkbook.Sheets("Control").Range("Q73 ")            ' ePath is het path voor het opslaan van PDF-AAA
  Bestand = ePDFPath & sPDFName                                                                         ' Bestand = Path + sPDFName
  Application.DisplayAlerts = False

  Set pdfjob = CreateObject("PDFCreator.clsPDFCreator") ' objectverwijzing naar pdfjob
  With pdfjob
    If .cStart("/NoProcessingAtStartup") = False Then   ' als pdfjob niet wil starten
      MsgBox "Can't initialize PDFCreator.", vbCritical + vbOKOnly, "PrtPDFCreator"         ' https://www.google.nl/search?source=hp&ei=ZggfXYzSKdL5kwW0lLeoBQ&q=.cOption+%28%22UseAutoSave%22%29+-+1+++&oq=.cOption+%28%22UseAutoSave%22%29+-+1+++&gs_l=psy-ab.3..0i22i10i30.11086.11086..17811...0.0..0.98.98.1......0....2j1..gws-wiz.....0.pX0AorYfMgU
      Exit Sub                                                                              ' https://www.cimaware.com/expert-zone/printing-worksheets-to-a-pdf-file-using-early-binding
    End If
    .cOption("UseAutoSave") = 1                         ' gebruik Autosave aan
    .cOption("UseAutosaveDirectory") = 1                ' gebruik Autosave Directory aan
    .cOption("AutosaveDirectory") = ePDFPath            ' AutosaveDirectory = SPDFPath
    .cOption("AutosaveFilename") = sPDFName             ' AutosaveFileName = SPDFName
    .cOption("AutosaveFormat") = 0                      ' 0 = PDF
    .cClearCache                                        '
  End With
  ActiveSheet.Range("D4:R45").PrintOut copies:=1, ActivePrinter:="PDFCreator"   ' maakt een PDF-file
  
  Do Until pdfjob.cCountOfPrintjobs = 1                 ' wait until the print job has entered the print queue
    DoEvents
    With Worksheets("Behang").ChartObjects
      .Delete                                           ' haalt grafisch Userform weg van wb Behang
      MsgBox ("   <<<<><<<<<<<<<<<<< Message Box >>>>>>>>>>>>><>>>>" & vbNewLine & vbNewLine & "Er is een PDF gemaakt van het UserForm, Deze is terug te vinden op:" & vbNewLine & vbNewLine & ActiveWorkbook.Worksheets("Control").Range("Q73") & vbNewLine & vbNewLine & "Onder de naam:  " & ActiveWorkbook.Worksheets("Control").Range("AC73") & " met 'jaar en maand'" & vbNewLine & vbNewLine & vbNewLine & "_______________________________________________________ Geef OK & Doorgaan")
    End With
  Loop
  pdfjob.cPrinterStop = False
  Do Until pdfjob.cCountOfPrintjobs = 0                 ' wait until PDF creator is finished then release the objects
    DoEvents
  Loop
  pdfjob.cClose
  Set pdfjob = Nothing
  Sheets("Behang").Protect DrawingObjects:=True, contents:=True, Scenarios:=True     ' beveilig blad weer
  
  PAA_APLFrame.Hide
End Sub

Doe er ook het vb-tje bij waarmee ik bovenstaande gemaakt hebt.

Let op de 1e keer dat je het maakt heeft ie dus niets gemaakt, omdat er nog geen vorige snapshot was.

Probleem zit hem in het geheugen??

Vr. Gr.

Dutch
 

Bijlagen

Goede morgen AHulpje,
Bedankt voor het meedenken.

Vergat erbij te vermelden dat het gemaakt was in excel 2003.
Heb het even overgezet en enige aanpassingen moeten doen, maar blijft steken op de foutmelding:

Fout 1004 tijdens uitvoering
Methode PasteSpecial van klasse Worksheet is mislukt.
Code:
Public Sub FormToPDF()
    Dim pdfName As String, xlTypePDF, xlQualityStandard
    pdfName = ActiveWorkbook.Path & "\PDFprintje.pdf"
    
    Application.SendKeys "(%{1068})" 'Alt-PrintScreen
    
    DoEvents
    
    Sheets("Control").Activate
    Range("A1").Select
    DoEvents
   [COLOR="#FF0000"] Sheets("Control").PasteSpecial Format:="Bitmap", Link:=False, DisplayAsIcon:=False[/COLOR]
    Application.CutCopyMode = False 'clear the clipboard
    
    With Sheets("Control").PageSetup
        .PrintArea = Range("$A$1:$N$37").Address
        .FitToPagesTall = 1
        .FitToPagesWide = 1
        .LeftMargin = Application.InchesToPoints(0.5)
        .RightMargin = Application.InchesToPoints(0.5)
        .TopMargin = Application.InchesToPoints(1)
        .BottomMargin = Application.InchesToPoints(1)
        .Zoom = False
    End With
    
    Sheets("Control").ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=pdfName, _
    Quality:=xlQualityStandard, _
    IncludeDocProperties:=False, _
    IgnorePrintAreas:=False, _
    OpenAfterPublish:=False
    'Opruimen
    Sheets("Control").Shapes(1).Delete

    MsgBox "PDF aangemaakt" & vbCrLf & pdfName
End Sub
VB-tje hierbij.
 

Bijlagen

P.S. 2 toegevoegd

Je PC is niet snel genoeg ;)
Laat de macro even pauzeren tot de PrintScreen op het klembord staat, een seconde is waarschijnlijk genoeg.
De DoEvent's kunnen er wel uit.
Plaats direct onder SendKeys:
Code:
Application.Wait (Now + TimeValue("0:00:01"))

P.S.
xlTypePDF en xlQualityStandard zijn constantes met de waarde 0 (nul).

P.S. 2
Druk na de foutmelding op F8 en de macro loopt ook door.
 
Laatst bewerkt:
Al die pagina-instellingen blijken geen effekt te hebben voor het PDF-bestand.
Verwijder Blad2
Maak Blad1 leeg
Verwijder je macromodule en zet gewoon in het Userform:

Code:
Private Sub PDFBut_Click()
    Application.SendKeys "(%{1068})"
    DoEvents
    With Blad1
        .Paste .Cells(1)
        .ExportAsFixedFormat 0, "G:\OF\UF.pdf"
        .Shapes(1).Delete
    End With
    Hide
End Sub
 
@snb
Het kan inderdaad iets compacter, maar heb je dat getest?:rolleyes:
 
Goedenavond,

Had geantwoord vanmiddag, maar zie het niet staan hier.

Dus alsnog.

AHulpje, heb de TimeValue ingebouwd met zelfs 20 sec, maar krijg dezelfde foutmelding.

Mijn PC was/is een behoorlijke snelle jonge, dus denk dat het niet daaraan ligt.

Zie vb-tje
 

Bijlagen

Goedemorgen AHulpje.

Heb de laatste versie van je geprobeerd, maar ook deze werkt niet.

Helaas, zoals ik al eerder zei gebruik 2003 versie en deze is niet compatibel helemaal met 2021 versie.
 
@Dutch

Exportasfixedformat is pas in Exel 2007 geïntroduceerd.
Dat blijkt uit de beschrijving in de hulpfunktie van VBA-Excel.
 
Laatst bewerkt:
Thanks snb,

Heb de versie van 2019 op m'n andere pc.
Dat is de laatste versie (begrijp ik) die 100% compatibel met 2003 is.
Moet overstappen maar kom er steeds niet toe.
 
Dan zul je de hier aangereikte suggesties op de PC met versie 2019 moeten testen.
Compatibiliteit en overstappen doen hier niet terzake.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan