Printknop in navigatieformulier met meerdere tabbladen

  • Onderwerp starter Onderwerp starter SA3
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.
Het db-bestand (TEST.accdb) kon ik niet uploaden. Na zippen lukte dat wel.
Als ik in het bericht op TEST.zip klik, wordt deze gedownloaded. Wat gaat er nu fout?
 
Het bestand is veel te klein voor een database. Ik zie de naam wel,staan, maar de db zelf werkt dus niet. Hoe groot is het bestand op je schijf?
 
OK, we're in business :). Ik kijk er even naar!
 
Een eerste (snelle, en uiterst onbetrouwbare) oplossing kan deze zijn:
Code:
Private Sub Knop11_Click()
    Select Case Screen.PreviousControl.Name
        Case "navActieveLeden"
            DoCmd.OpenReport "Actieve leden", acViewPreview, WindowMode:=acDialog
        Case "navProjectLeden"
            DoCmd.OpenReport "Project leden", acViewPreview, WindowMode:=acDialog
    End Select
End Sub
Paar opmerkingen:
1. Combineer nooit macro's met VBA want daar word je helemaal gek van. Ik heb in mijn hele leven nog nooit een (echte) macro gemaakt, ik doe alles met VBA.
2. Geef objecten een logische naam, zodat je weet wat ze doen en waar ze voor staan. Een query met de naam "Project leden" en een rapport met de naam "Project leden" zul je bij mij nooit tegenkomen.
3. Geef objecten op een formulier logische namen. Code op basis van Navigatieknop7 en Navigatieknop9 zegt totaal niks. Ik heb, zoals je kunt zien, de tabjes dus een fatsoenlijke en herkenbare naam gegeven.

De reden dat het een quick-and-dirty methode is ligt besloten in het Screen object. Daarmee kun je afvangen waar je op klikt bijvoorbeeld. Meestal heb je daar niet zoveel aan (dat weet je namelijk al), maar vaak wil je weten wat actief was voordat je op de knop klikte. En dat leer je met Screen.PreviousControl. Dus als je op een tabblad klikt en daarna op de knop Knop11 (zie je hoe logisch dat is? Ik zou de knop dus cmdRapport noemen) dan krijg je de naam van het tabblad terug. En op basis van die waarde open je dan het rapport dat bij het tabblad hoort.
 
Dat van de naamgeving begrijp ik, maar wat bedoel je met "uiterst onbetrouwbaar"?
 
Op het moment dat je ergens op klikt en er gaat code draaien, heb je geen controle meer over wat er nu precies actief is. De voorbeeldcode doet het doorgaans prima als je hem op een zelfstandig formulier draait, maar als je tegelijkertijd ook een (al dan niet onzichtbaar) formulier met een timer hebt draaien, dan kan het heel goed dat dat formulier tijdens de uitvoer de focus overneemt. En dan is het tabblad dus niet meer de PreviousControl. Ook kun je de macro niet debuggen, want als je de code vanuit het VBA venster draait, is het tabblad dus nooit meer de PreviousControl; dat is je VBA venster. Dus debuggen is er ook niet meer bij. Nou is daar nog wel een mouw aan te passen, door pas te debuggen nadat de PreviousControl gedraaid heeft.
 
Printen en saven heb ik voor elkaar.
Heb nog een vraag over PreviousControl. Nadeel van PreviousControl is dat als je in het navigatie-formulier één van de knoppen hebt bediend en je wil dit een tweede keer doen, dat je even moet switchen van tabblad. Anders werkt het niet.
Dit kan voor de gebruiker verwarrend zijn. Is er een andere methode?
 
Ja; zet de naam van de control in een variabele en gebruik de variabele in de Select Case. Nadeel hiervan: die variabele kan ook weer wisselen als je hem steeds opnieuw vult, dus in eerste instantie schiet dat niet op. Je zult de variabele dus moeten controleren op inhoud. Snap je nu wat ik bedoel met 'onbetrouwbare methode'?
 
Ik begrijp je niet. Dit is mijn code. Wil je aangeven wat je bedoelt? (het voorbeeldbericht ziet er anders uit dan ik heb ingetikt)

Private Sub Print_Click()
Printer.Orientation = acPRORPortrait
Select Case Screen.PreviousControl.Name
Case "navActieveLeden"
DoCmd.OpenReport "rptActieveLeden", aciewPreview, WindowMode:=acDialog
DoCmd.PrintOut acPrintAll
MsgBox "Het rapport Actieve leden wordt geprint"
Case "navProjectLeden"
DoCmd.OpenReport "rptProjectLeden", acViewReport, WindowMode:=acDialog
DoCmd.PrintOut acPrintAll
MsgBox "Het rapport Project leden wordt geprint"
End Select
End Sub
 
Ik bedoel zoiets:
Code:
Option Compare Database
Dim sControl As String

Private Sub Print_Click()
bCheck As Integer
    If Not Screen.PreviousControl.Name = sControl Then
        bCheck = MsgBox("Wil je " & sControl & " gebruiken?", vbYesNo)
        If bCheck = vbNo Then sControl = Screen.PreviousControl.Name
    ElseIf sControl = "" Then
        sControl = Screen.PreviousControl.Name
    End If
    Printer.Orientation = acPRORPortrait
    Select Case sControl
        Case "navActieveLeden"
            DoCmd.OpenReport "rptActieveLeden", aciewPreview, WindowMode:=acDialog
            DoCmd.PrintOut acPrintAll
            MsgBox "Het rapport Actieve leden wordt geprint"
        Case "navProjectLeden"
            DoCmd.OpenReport "rptProjectLeden", acViewReport, WindowMode:=acDialog
            DoCmd.PrintOut acPrintAll
            MsgBox "Het rapport Project leden wordt geprint"
    End Select
End Sub
Geen idee of het zo werkt, want ik heb je db niet. Uitproberen dus :)
 
Volgens mij kun je de hele procedure vervangen door dit:
Code:
Option Compare Database
Dim sControl As String

Private Sub navActieveLeden_Click()
    sControl = Me.navActieveLeden.Caption
End Sub

Private Sub navProjectLeden_Click()
    sControl = Me.navProjectLeden.Caption
End Sub

Private Sub Print_Click()
    Printer.Orientation = acPRORPortrait
    DoCmd.OpenReport "rpt" & Mid(sControl, 4, Len(sControl) - 3),  acViewNormal
End Sub

Zoals je ziet: geen PreviousControl meer te bekennen. Want, heb ik al eerder gezegd, zo onbetrouwbaar als de gemiddelde VVD politicus op Justitie :).
 
Ziet er goed uit. Hier kan ik mee verder.
Heb nog twee vragen:
- Printer.Orientation werkt niet. Alles wordt landscape uitgeprint. Wat kan dit zijn?
- ik ben op zoek naar een goed boek met een overzicht van alle VBA-commando's en functies. Kort beschreven zodat je inzicht wat mogelijk is.
De functie in detail vind ik dan wel op internet.
 
Ik hou me niet zo met printers bezig; in Access onthoudt het rapport de layout dus je hoeft dat helemaal niet met VBA in te stellen. Dus waarom zou je dat doen?
Puntje 2: geen enkel boek behandelt alle opdrachten, en als dat er al zou zijn, kan het nooit volledig zijn. Gelukkig hebben we het WWW als vraagbaak :). Zelf haal ik hier alles wel zo'n beetje vandaan, zeker als het gaat om de algemene insteek van een procedure heb je hier al een hoop aan.
 
Je hebt me goed geholpen, OctaFish. :thumb: Hartelijk dank. Ik stop met dit item.
 
Da's mooi, dan mag je de vraag op <Opgelost> zetten!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan