Verschillende functieknoppen combineren in 1 "Mega-knop"

  • Onderwerp starter Onderwerp starter LeeW
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

LeeW

Gebruiker
Lid geworden
6 jan 2016
Berichten
6
Ik heb nog niets gelijkaardigs op het forum gevonden, daarom hier mijn vraag: Ik probeer mij wat duidelijk te maken. Ik heb een database waarbij ik vanuit een form 3 verschillende reports kan afdrukken. Dit afdrukken is voor het report "A" specifiek op een netwerkprinter (die niet de standaardprinter is), voor het report "B" als PDF op een bepaalde netwerklocatie met een bepaalde naam (en gekoppelde datum) en voor report "C" onder nog een andere naam op nog een andere locatie (ook als PDF met datum).
Alles werkt perfect zolang men de "printknop" gebruikt die ik mee in het report heb gezet. Dus drie afzonderlijke "knoppen" elk in zijn eigen report. Als ik nu de drie "afdrukken" wil doen met 1 knop op het form zelf is er dan een manier om die 3 knoppen in 1 keer te activeren? (Uiteraard is alles in VBA.)
 
Tuurlijk, gewoon de codes combineren. Knippen en plakken dus.
 
Er is geen mogelijkheid om "gewoon" te zeggen: gebruik deze 3 functies/events (printknoppen) met deze éne knop?
Als ik ze knip en plak tot 1 commando loopt het steeds vast, terwijl ze afzonderlijk perfect werken.
 
Je kan uiteraard een nieuwe knop maken die de andere knoppen aanroept. Maar ik zie eerlijk gezegd het probleem niet. Uiteraard kunnen we véél meer zeggen als we de codes zien.
 
Laatst bewerkt:
OctaFish bedankt om je over mijn probleem te buigen. Ik begrijp dat het eenvoudiger is als je de code kan zien. Ik heb ze in een Word-bestand toegevoegd en heb de lijnen waar het op vastloopt in het rood gezet. Mijn hoofdbekommernis is uiteraard dat het geheel goed werkt dus als je in de code zaken tegenkomt waarvan je denkt "wat doet dat hier" sta ik open voor verbeteringen. Ik ben zeker geen pro, integendeel zelfs. Dus neem gerust de tijd om het rustig te bekijken. Beter een goede code die wat meer tijd vraagt dan een snelle halfbakken oplossing :thumb: Uiteraard is de mening van anderen ook nog steeds welkom.
Bekijk bijlage Code voor Mega_print.docx
 
Even je docx bekeken (is trouwens best gevaarlijk voor een gebruiker om zomaar en docx te aanvaarden, graag volgende keer je code gewoon tussen de Code tags)
Een paar opmerkingen:
Je kunt gerust al je verschillende combinaties in een soort pop-up formuliertjes onderbrengen onder een selectie functie met dan één algemene knop.
De zaak een beetje dynamischer maken; bv het pad hard coderen in de VBA code doe ik nooit; ik gebruik hiervoor een verwijzing naar een formulier waardoor de gebruiker die zelf kan invullen, aanpassen, etc... Als er een PDf gewenst is print ik steeds een PDF op de achtergrond vooraleer het eigenlijke afdrukvoorbeeld van een rapport getoond wordt; ik vraag dat nooit aan de gebruiker. Hier ook weer kan de gebruiker (of de admin gewoon daarvoor in een overzichtstabel van de rapporten een vinkje plaatsen als er een PDF moeten gemaakt worden of niet). Verder zet ik alle rapportnamen in een tabel en laat je daar bepalen wat er met dat rapport moet gebeuren.
Dat je daarin dan ver kunt gaan zie je bv in onderstaande printscreen; je hebt hier één "mega" knop met daaronder 35 rapporten die ik oproep via recordset's; de gebruiker vinkt de rapporten aan die hij al dan niet wenst te printen; hij kan er ook het aantal prints in aanduiden die hij wilt van ieder rapport; de printvolgorde bepalen waarin ze geprint worden; de vinkjes automatisch laten invullen volgens bepaalde profielen; etc... In een vakje rechts bepalen we ook de seconden printvertraging want zo'n "mega"print in één keer uitvoeren kan ons netwerkbuffer en/of printbuffer niet aan :-) en tevens kan de gebruiker van ieder rapport afzonderlijk een print maken rechtstreeks door dubbelklik (of een afdrukvoorbeeld) en de admin kan ze hier ook direct ontwerpen indien nodig.
 

Bijlagen

  • Knipsel11.jpg
    Knipsel11.jpg
    107,3 KB · Weergaven: 65
Laatst bewerkt:
Als we naar je specifieke code kijken, dan vallen wel een paar zaken op. Zo verbaas ik me altijd over deze vorm van declaraties:
Code:
Dim intYear, intMonth, intDay, intHour, intMin, intSec As Integer
Niet alleen wek je in de naamgeving de suggestie dat je getallen definieert (wat je in het gebruik niet doet), je definieert alle variabelen als Variant, en alleen de laatste (intSec) als Integer. Wil je ze allemaal als getal hebben, dan moet je ze allemaal apart als getal benoemen. Dus zo:
Code:
Dim intYear As Integer, intMonth As Integer, intDay As Integer, intHour As Integer, intMin As Integer, intSec As Integer
Maar zoals ik al zei: je gebruikt ze ook nog eens als tekst. Doe dat dan ook in de naamgeving:
Code:
Dim sYear As String, sMonth As String, sDay As String, sHour As String, sMin As String, sSec As String

Het leuke is: je hebt ze niet eens nodig; je kunt ze gewoon weglaten. Daar wordt je code ook gelijk een stuk korter door. Dit:
Code:
  intYear = Year(Now)
  intMonth = Format(Month(Now), "00")
  intDay = Format(Day(Now), "00")

  strFileName = "Richtlijnen PA actueel van "
  strFileName = strFileName & intYear & intMonth & intDay
  strFileName = strFileName & ".pdf"
doet hetzelfde als dit:
Code:
  strFileName = "Richtlijnen PA actueel van " & Format(Date, "yyyymmdd") & ".pdf"

Da's toch niet echt een ingewikkelde regel :).

Verder moet je, als je codes gaat samenvoegen, er op letten dat je geen rare sprongen maakt in je code. Of de procedure op een verkeert moment stopt. Zoals hier, in het begin van je code:
Code:
    DoCmd.RunCommand acCmdPrint
    DoCmd.Close acReport

Exit_Point:
    Exit Sub

Na het afdrukken van het eerste rapport wordt er niet omgeleid naar een andere sub, dus komt de code vanzelf bij Exit_Point terecht. En stopt de routine.
 
JohanRVT en OctaFish, bedankt voor jullie input :thumb:. @ JohanRVT, sorry van het word-bestand, niet bij stil gestaan. Ik wilde duidelijk aangeven (in rood) waar het bij mij mis loopt. De reden dat ik het pad en de naam hard codeer is omdat de PDF's die gecreëerd worden in een archief terecht komen waar alle werknemers ze kunnen lezen. De reden dat ik de keuze geef om wel of niet een PDF op te slaan, is dat er wel meermaals een print mag gemaakt wordt maar er niet steeds een PDF moet bijkomen in de doelmap. @ OctaFish, alvast bedankt om de code te vereenvoudigen. De procedure stopt echter niet op de Exit_Point maar loopt wel degelijk verder (maar als het overbodig is kan het er uiteraard wel uit). Waar het wel misloopt, is op het stuk waar het wegschrijven van een PDF (doordat er al 1 met dezelfde naam open staat) misloopt. Normaal (en in de "deelcode" doet hij het ook) moet er dan een alternatieve naam gevormd worden waarbij het tijdstip van opslagen nog extra bij de naam komt. Zodoende kan dit kleine euvel later in het archief manueel terug recht gezet worden (kan ik op de tijd zien wat de recentste is). Indien jullie nog hints en tips willen geven, kan ik nog meegeven dat er gewerkt wordt op 8 PC's in een netwerk met een 30-tal users (allemaal verschillende userID's en logins).
 
Laatst bewerkt:
Ik ben zelf nog eens opnieuw begonnen met de tips die ik gekregen heb.
Het terug opbouwen vanaf 0 heeft gewerkt. Ik zal dit weekend in een volgende post de uiteindelijke code doorgeven voor mensen die iets gelijkaardigs willen maken. Ik kan nu echter access niet openen om de code te kopiëren (ik kan momenteel niet op mijn windows PC). :D
 
Door ziekte toch nog wat later geworden dan het weekend, maar hier is de code die werkt.
Als er mensen zijn die er nog wijzigingen op willen suggereren, dat is altijd welkom.

Code:
Private Sub Mega_print_Click()
    
    'Juist rapport openen om te kunnen printen vanuit formulier 'Richtlijn lezen'
Dim strWhere As String
DoCmd.OpenReport "Rpt_Richtl", acViewPreview, strWhere
    
PrintSpecial:
'Bij het afprinten moet de mogelijkheid geboden worden om (naast de gewone afdruk) ook een PDF versie van het verslag te bewaren.
Dim ReplyPDF
Dim strFileName As String
Dim strPath As String

'Eventuele filename voor PDF samenstellen
  strFileName = "Richtlijnen PA actueel van " & Format(Date, "yyyymmdd") & ".pdf"
  
  strPath = "\\Lbeantsfp05.emea.ads.lanxess\Capro\Documentenbeheer Productie PA6\3. Documenten Archief PA6\Richtlijnen PA6 (n.g.)\01 Richtlijnen PA"
  
'Pop-up: PDF versie bewaren of niet
  ReplyPDF = MsgBox("Wil u dit als PDF bewaren?     " & vbCrLf & "'" & strFileName & "' zal dan worden opgeslagen in  '" & strPath & "'.", vbYesNo, "PDF aanmaken")
  If ReplyPDF = vbYes Then
    'PDF versie proberen bewaren
       On Error GoTo PrintError
       DoCmd.OutputTo acOutputReport, stDocName, acFormatPDF, strPath & strFileName
   Else
    'Er wordt geen PDF versie aangemaakt.
   End If
'Verslag afdrukken op standaardprinter
  On Error GoTo Err_DrukRapport_Click
  DoCmd.OpenReport "Rpt_Richtl", acViewPreview, , , , "1"
  GoTo Print_Special
  
PrintError:

'Nieuwe naam indien aanmaak PDF mislukt
  strFileName = "Richtlijnen PA actueel van " & Format(Now, "yyyymmdd - hhmmss") & ".pdf"

   MsgBox "De PDF-versie met deze voorgestelde naam staat waarschijnlijk nog bij iemand open en kon daarom niet worden opgeslagen onder deze naam. " & vbCrLf & _
      "Deze huidige PDF-versie van dit bestand zal daarom worden opgeslagen met de naam: " & strFileName, vbOKOnly, "PDF Print"
   DoCmd.OutputTo acOutputReport, stDocName, acFormatPDF, strPath & strFileName
    
Resume Next
'''
Exit_DrukRapport_Click:

    Exit Sub

Err_DrukRapport_Click:
    
    Resume Exit_DrukRapport_Click
    
Print_Special:
'Bij het afprinten moet de mogelijkheid geboden worden om (naast de gewone afdruk) ook een PDF versie van het verslag te bewaren.

'Juist rapport openen om te kunnen printen vanuit formulier 'Richtlijn lezen'
Dim strWhere_ As String
DoCmd.OpenReport "Rpt_Richtl_Labo", acViewPreview, , , , "1"
    
Dim ReplyPDF_
Dim strFileName_ As String
Dim strPath_ As String

'Eventuele filename voor PDF samenstellen
  strFileName_ = "Richtlijnen labo actueel van " & Format(Date, "yyyymmdd") & ".pdf"
  
  strPath = "\\Lbeantsfp05.emea.ads.lanxess\Capro\Documentenbeheer Productie PA6\3. Documenten Archief PA6\Richtlijnen PA6 (n.g.)\01 Richtlijnen PA"
  
'Pop-up: PDF versie bewaren of niet
  ReplyPDF_ = MsgBox("Wil u dit als PDF bewaren?     " & vbCrLf & "'" & strFileName_ & "' zal dan worden opgeslagen in  '" & strPath & "'.", vbYesNo, "PDF aanmaken")
  If ReplyPDF_ = vbYes Then
    'PDF versie proberen bewaren
       On Error GoTo PrintError_
       DoCmd.OutputTo acOutputReport, stDocName, acFormatPDF, strPath_ & strFileName_
   Else
    'Er wordt geen PDF versie aangemaakt.
   End If
'Verslag afdrukken op standaardprinter
  On Error GoTo Err_DrukRapport_Click_
  DoCmd.OpenReport "Rpt_Richtl_Labo", acViewPreview, , , , "1"
  GoTo Print_RL_SL
  
PrintError_:

'Nieuwe naam indien aanmaak PDF mislukt
  strFileName_ = "Richtlijnen labo actueel van " & Format(Now, "yyyymmdd - hhmmss") & ".pdf"

   MsgBox "De PDF-versie met deze voorgestelde naam staat waarschijnlijk nog bij iemand open en kon daarom niet worden opgeslagen onder deze naam. " & vbCrLf & _
      "Deze huidige PDF-versie van dit bestand zal daarom worden opgeslagen met de naam: " & strFileName_, vbOKOnly, "PDF Print"
   DoCmd.OutputTo acOutputReport, stDocName, acFormatPDF, strPath_ & strFileName_
    
Resume Next

'''
Exit_DrukRapport_Click_:
    Exit Sub
   
    
Err_DrukRapport_Click_:
    
    Resume Exit_DrukRapport_Click
    
'dit stuk is om het report "Rpt_Richtl_ShiftLabo" af te drukken in Labo Zuid

Print_RL_SL:
DoCmd.OpenReport "Rpt_Richtl_ShiftLabo", acViewPreview

    On Error GoTo Error_Handler:
    Dim strDeviceName As String
    strReport = "Rpt_Richtl_ShiftLabo"
    ' Selecteer de alternatieve printer voor dit rapport/formulier
    Set Reports!Rpt_Richtl_ShiftLabo.Printer = Application.Printers("\\LBEANTSFP06\lbeap071")
    DoCmd.OpenReport strReport, acViewPreview, acWindowNormal, acHidden
    MsgBox "Richtlijnen voor Shiftlaborant in Labo Zuid - De standaardprinter in Labo Zuid is 'lbeap071'", _
    vbExclamation, "Printen naar Labo Zuid"
    DoCmd.RunCommand acCmdPrint
    DoCmd.Close acReport

Exit_Point:
    Exit Sub

'dit behandelt de Sub als er een printerfout is
Error_Handler:
    If Err.Number = 5 Then
        MsgBox "Printerprobleem, los dit op of probeer vanaf een andere locatie.", _
        vbExclamation, "Printerprobleem"
    End If

'Sub voor printen naar Labo Zuid loopt tot hier
    
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan