Een bepaald UserForm printen

Status
Niet open voor verdere reacties.

DutchOirs

Gebruiker
Lid geworden
30 sep 2009
Berichten
891
Goedemorgen,

Zit met een vraagje.

Het probleem is als volg.
Heb een UserForm openstaan met allerlei gegevens.

Wil de mogelijkheid maken om van dit UserForm een print te kunnen maken. Wel die mogelijkheid is er en werkt.
Maar achterliggend zijn er meer mogelijkheden, dus kwam tot het volgende:
Heb 4 mogelijkheden om te printen en 4 mogelijkheden om een PDF te maken.

Dacht slim te zijn om deze mogelijkheden (8) in een apart PrintPDF UserForm te zetten en van hieruit uit te voeren.
Probleem is dat als ik dit vanuit dit PrintPDF UserForm uitvoer, hij dus een snapshot maakt van dit PrintPDF UserForm en niet het oorspronkelijke UserForm.

Dacht slim te zijn door vlak voor de opdracht dit PrintPDF UserForm op visible op false te zetten.
Helaas dit werkt niet.
Heeft iemand hier ervaring mee?

De macro maakt een snapshot van het userform met:
Code:
    keybd_event VK_SNAPSHOT, 1, 0, 0
Is er een mogelijkheid in bovenstaande dat jehet snapshot kan aansturen naar het bepaalde UserForm?"
Van alles geprobeerd, maar helaas.

Om het kort te zeggen. Vanuit een Userform een snapshot van een ander Userform maken, kan dat?

Many thanks

Dutch
 
Laatst bewerkt:
Je zou ondertussen moeten weten dat we véél meer kunnen doen/zeggen als je er een bestandje bijdoet. Er zullen weinig mensen zin hebben om de situatie eerst na te bouwen. Daarnaast heb ik geen idee over welk programma we het hier hebben…
 
De code die je laat zien doet hetzelfde als Ctrl-Print Screen.
Dan moet je dus eerst het gewenste userform actief maken.
 
Laatst bewerkt:
Goedemorgen Edmoor,

Dat was ook mijn insteek.
Heb geprobeerd om het betreffende UserForm weer active te maken, maar helaas werkte niet.
Ook geprobeerd om het PrintUserForm onzichtbaar te maken, maar dat werkt ook niet.
Is echt dat vanuit het UserForm, waaruit je de opdracht geeft, deze een screenshot van maakt.

Zal de code erbij zetten welke ik gebruikte.
Code:
Private Sub Print1But_Click()               ' Print huidig UserForm
'PrintPDFUserForm.Activate
'PrintPDFUserForm.Visible = False
  
  VarWIK = 3
  Text1 = " Weet u zeker dat u dit UserForm wilt Printen voor een overzict voor later?"
  Text2 = " Geef een keuze: _____>>>>>>>>>> _________________________________________ Ok Ja & Doorgaan  of  Nee Annuleren."
  Text3 = " Info #011"
  WIKUserForm.Show
  If Deur1 = 0 Then Exit Sub        ' Nee
  If Deur1 = 1 Then                 ' Ja
    Deur1 = 0
    Dim wsTemp As Worksheet
Nogmaals:
    If PAA_APLFrame.NrCB = "" Then
      VarWIK = 1
      Text1 = " U heeft geen NrCB activiteit nummer gekozen! Overnieuw en voer een activiteit nummer in!"
      Text2 = " Geef een keuze: _____>>>>>>>>>> _________________________________________ Ok Ja & Doorgaan  of  Nee Annuleren."
      Text3 = " Info #011"
      WIKUserForm.Show
      Exit Sub
    End If
    If PrinterReady(Sheets("Control").Range("AJ4")) Then             ' checkt of je standaard printer[wb Control D4] aan staat
      Application.ScreenUpdating = False                            ' tegen flikkeren van beeldscherm
      keybd_event VK_SNAPSHOT, 1, 0, 0
      Set wsTemp = Sheets.Add(after:=Sheets(Sheets.Count))
      With wsTemp
        Application.Wait Now + TimeValue("00:00:01")
        .PasteSpecial Format:="Bitmap", Link:=False, DisplayAsIcon:=False       'paste the userform in the temporary file
        .Shapes(1).Height = .Shapes(1).Height * 0.7                              'reduce the bitmap picture to fit on 1 page
        With .PageSetup                                        ' Height * 0,7 kan je aanpassen kleiner of groter
          .Orientation = xlLandscape                                          'most important setting here
          .LeftMargin = Application.InchesToPoints(0.5)                       'small margins
          .RightMargin = Application.InchesToPoints(0.5)
          .TopMargin = Application.InchesToPoints(1)
          .BottomMargin = Application.InchesToPoints(1)
          .LeftHeader = "Printed on: " & Date
        End With
        .PrintOut
        Application.DisplayAlerts = False
        .Delete
        Application.DisplayAlerts = True
      End With
      Application.ScreenUpdating = True
      NoodExit = 1                      ' om te voorkomen dat sub activate actief wordt
    Else
      VarWIK = 1
      Text1 = " De Printer staat uit. Zet deze eerst aan voor u verder gaat om de documenten te Printen en gegevens verlies te voorkomen! "
      Text2 = " Geef OK & Doorgaan na het aanzetten van de Printer. _____________________________________________ Ok en Doorgaan"
      Text3 = " Fout #064"
      WIKUserForm.Show
      VarWIK = 3
      Text1 = " Wilt u nog steeds dit Userform printen?"
      Text2 = " Geef een keuze: _____>>>>>>>>>> _________________________________________ Ok Ja & Doorgaan  of  Nee Annuleren."
      Text3 = " Info #011"
      WIKUserForm.Show
      If Deur1 = 0 Then Exit Sub        ' Nee
      If Deur1 = 1 Then                 ' Ja
        GoTo Nogmaals
      End If
    End If
  End If
'PrintPDFUserForm.Visible = True

End Sub

Sorry OctaFish, zal proberen vanmiddag als ik wat tijd heb om een voorbeeldje te maken.
Kan helaas niet m'n hele prog. hier neerzetten.. (26 Mb)
 
Laatst bewerkt:
Je kan alleen meerdere userforms tegelijk op je scherm hebben wanneer je ze (op de laatste na) "modeless" opent.
Kijk in je klembord om te kijken welke afbeeldingen daar komen na het klikken op de buttons.
Gemaakt en getest met windows11en en office2007nl.
 

Bijlagen

Laatst bewerkt:
Goedemorgen,

Weer even tijd om verder te gaan.
Wordt toch behoorlijk ingewikkeld om vanuit een bepaald Userform, een ander Userform te printen.
Heb het toch maar eenvoudig gehouden en in dat bepaalde Userform (welke geprint moest worden) een knop gemaakt met de optie om dit Userform te printen.
Tot dusver allemaal gelukt.

2e optie is om van dit Userform een pdf te maken.
Heb het een en ander gevonden op internet, maar werkt niet allemaal.
Hier bijgevoegd het voorbeeldje waar ik mee experimenteer.
Helaas kom er niet uit.

Heeft iemand hier ervaring mee?

Vr. Gr.
Dutch
 

Bijlagen

Klik op de knop "UserForm1".
Klik op de knop "Print to PDF".
Kijk in dezelfde map waar je dit bestand opgeslangen hebt en zoek naar "<datum> userform.pdf".
Gemaakt en getest met excel2007nl en windows11en.
 

Bijlagen

Laatst bewerkt:
Goedenavond alphamax,

Ben bang dat het niet zal lukken, gebruik namelijk excel 2003.

Enige foutmeldingen en aangepast, maar loopt vast op moment dat ik in het UserForm1 Print to PDF opdracht geef.
Hij geeft dan als fout de melding 'Fout 438'
Deze eigenschap of methode wordt niet ondersteund door dit object.

Hij loopt hier op vast:
Code:
        .Chart.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & Format(Now, "yyyymmdd") & " userform.pdf"
 
Hoi Edmoor,

Gebruik al jaren een PDFCreator.
Werkt perfect.
Om een Excel sheet om te zetten naar PDF werkt.
Maar een UserForm is toch iets anders (dacht ik)
 
Afdrukken naar die PDF printer maakr er een PDF van.
Wat je afdrukt maakt niet uit.
 
Ok begrijp ik en weet ook hoe je het van een Word document of Excel document moet aansturen,
maar hik tegen het fenomeen UserForm aan.

Weet zo ff niet hoe ik dit moet aansturen.
 
Ik weet niet of Excel 2003 dat al kent, maar gebruik dit voor het afdrukken van een Userform:
Code:
UserForm1.PrintForm
 
Stel dan je PDFCreator in als standaard printer.
 
zo even wat gemaakt.

maar loopt vast op volgende:
Code:
  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("A1:AV344").PrintOut copies:=1, ActivePrinter:="PDFCreator"   ' maakt een PDF-file
  UserForm1.[COLOR="#FF0000"]PrintOut[/COLOR] copies:=1, ActivePrinter:="PDFCreator"   ' maakt een PDF-file
  
  Do Until pdfjob.cCountOfPrintjobs = 1                         ' wait until the print job has entered the print queue
    DoEvents
  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 = Nothin

Geeft compileer fout.
Kan de methode of het gegevenslid niet vinden.
 

Bijlagen

Wat 'ie al zegt, de methode PrintOut bestaat niet voor het Userform object.
 
daar zit het probleem?

weer terug bij af.

Vraag: kan je een UserForm op een werkblad zetten?

Zoja hoe?

Kijk het werkblad kunnen we een PDF van maken.
 

Bijlagen

Laatst bewerkt:
Wel, na enig stoeiwerk het volgende gevonden.
Misschien niet de mooiste oplossing, maar werkt wel.
1e zet Userform op werkblad neer.
2e en maakt van dit werkblad een pdf-file.
3e haalt het Userform weer van het werkblad af.

en voila het werkt.
Code:
Private Sub PDFCharge()
  Dim hWnd As Long, xlTypePDF
  hWnd = FindWindow("ThunderDFrame", UserForm1.Caption)
  SetForegroundWindow hWnd
  keybd_event VK_SNAPSHOT, 1, 0, 0      ' maakt een printscreen van dit Userform
  DoEvents
  With Worksheets("Blad1").ChartObjects.Add(130, 30, UserForm1.Width + 15, UserForm1.Height + 15)
    .Chart.ChartArea.Border.LineStyle = xlNone
    .Activate
    .Chart.Paste
  End With

  MijnNaam = "HelpMij Screenshot #5"
  
  Dim pdfjob As Object, sPDFName As String, ePDFPath As String, Bestand As String, txt As String

  sPDFName = IIf(MijnNaam = "", "GeenNaam", MijnNaam) & ".xls"       ' sPDFNaame = Als MijnNaam = "" dan "GeenNaam" anders MijnNaam & xls
  ePDFPath = ThisWorkbook.Sheets("Control").Range("Q3 ")             ' ePath is het path voor het opslaan van PDF-Servicekosten
  Bestand = ePDFPath & sPDFName                                                                         ' Bestand = Path + sPDFName
  Application.DisplayAlerts = False

'  If Dir(Bestand) <> "" Then
'    txt = MsgBox("Bestand: " & Bestand & " bestaat al! " & vbCrLf & "Wilt u deze overschrijven? ", vbYesNo, "Check File")
'    If txt <> vbYes Then Exit Sub
'  End If
  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("A1:N33").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("Blad1").ChartObjects
      .Delete
    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
  
  UserForm1.Hide
End Sub

Als iemand een mooiere oplossing heeft hoor ik het gaarne.

doe het voorbeeldje erbij met de mogelijkheid om:
- een Userform te Printen
- van een Userform een PDF te maken

Groet Dutch
 

Bijlagen

Goedemiddag,

Kom toch nog twee probleempjes tegen.
1e:
Blijkt dat als hij een 'snapshot' maakt v/h Userform, iedere keer één stap achter loopt.
Dus hij gebruikt dat wat hij al in z'n geheugen heeft. (dus als laatste heeft genomen)

Vraag: hoe kan ik in bovenstaande code het zo maken dat hij, met het snapshot uptodate neer zet?

Dus hij zou eerst z'n geheugen moeten opschonen, voordat hij een nieuwe snapshot maakt...

2e: Hoe kan ik het zo maken dat hij het UserForm (dus de snapshot) op een Landscape zet in plaats van Portrait.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan