Focus zetten op een bepaald subform veld in een tabblad

Status
Niet open voor verdere reacties.

jlebbink

Gebruiker
Lid geworden
15 feb 2010
Berichten
106
Ik heb een database met diverse tabbladen. Nu wil ik het zodanig hebben, dat bij het kiezen van een bepaald tabblad één bepaald veld in het subformulier de focus krijgt

Bijgevoegd een klein simpel opzetje van de situatie. Hier moet bij het kiezen van het tabblad "Logboek" de focus op het veld "txtFabrikaat" komt.

Bij voorbaat mijn dank
 

Bijlagen

  • Test.zip
    36,3 KB · Weergaven: 59
Tabcontrols zijn vervelend om acties achter te hangen. Het lijkt alsof je een Click event hebt voor elke tab, maar die doet eigenlijk niks. Je moet de CHANGE van de complete tabcontrol afvangen. Makkelijkste manier is iets als:

Code:
Private Sub tabReserveringen_Change()
Dim tabCtl As TabControl
Dim tabPage As Page
Dim ctlNaam As String

    Set tabCtl = Me.tabReserveringen
    Select Case tabCtl
        Case 0  'Eerste pagina
            ctlNaam = "Aanmelder"
        Case 1  'Tweede pagina
            ctlNaam = "ReserveringID"
       Case Else   'Geen pagina
        Exit Sub
    End Select
    Me(ctlNaam).SetFocus
    
End Sub
De SELECT CASE begint met 0, omdat dat het indexnummer van het eerste tabblad is.
 
Bijna.
Het betreffende tabblad krijgt de focus. nu alleen nog een specifiek veld de focus geven in het subformulier op dit tabblad.
In mijn database zitten onder voorwaarde een twintigtal verborgen velden. Als één van de velden de focus heeft en ik kom terug van een ander tabblad bestaat de kans, dat het veld met de focus verborgen dient te worden. Ik krijg dan de foutmelding, dat een veld wat de focus heeft niet invisible gemaakt kan worden. Om deze fout te vermijden wil ik bij keuze van het tabblad, dat de focus naar een ander, altijd visible, veld gaat. Overigens kan ik met deze code ook niet terug naar het eerste tabblad.

Code:
Private Sub MijnTabs_Change()
    Dim tabCtl As TabControl
    Dim tabPage As Page
    Dim ctlNaam As String
    
        Set tabCtl = Me.MijnTabs
        Select Case tabCtl
            Case 0  'Eerste pagina
                ctlNaam = "Besturing"
            Case 1  'Tweede pagina
                ctlNaam = "Logboek"
           Case Else   'Geen pagina
            Exit Sub
        End Select
        Me.Logboek.SetFocus
End Sub
 
Ik snap niet helemaal waarom je wel de variabelenaam gebruikt voor het te activeren tekstvak, maar in de laatste regel een vast object (Logboek) selecteert. Dat staat natuurlijk op een van de tabbladen, en daarmee wordt automatisch ook altijd dat tabblad geactiveerd, ongeacht wat je daarboven doet. Onzichtbare elementen kun je eerst zichtbaar maken. Ik heb uiteraard mijn eigen oplossing weer toegepast ;)

Code:
Private Sub MijnTabs_Change()
Dim tabCtl As TabControl
Dim tabPage As Page
Dim ctlNaam As String

    Set tabCtl = Me.MijnTabs
    Select Case tabCtl
        Case 0  'Eerste pagina
            ctlNaam = "Besturing"
        Case 1  'Tweede pagina
            ctlNaam = "Logboek"
       Case Else   'Geen pagina
        Exit Sub
    End Select
    If Me(ctlNaam).Visible = False Then Me(ctlNaam).Visible = True
    Me(ctlNaam).SetFocus

End Sub
 
Sorry, kleine layoutcorrectie

Misschien zijdelings een tip: om het even waar (op forms, in query's) kan je verwijzen naar velden in subformulieren, als je de volgende formulering respecteert:

Neem bvb. een veld op een subsubformulier (veldX op formC, dat op formB staat, dat weer op formA staat): [Forms]![formA]![formB].[Form]![FormC].[Form]![veldX]. Let erop: telkens geef je met .[Form] "dit is een subformulier", en daar MOET een punt voor staan géén uitroepteken! Je geeft dus eigenlijk het volledige pad aan, met de instructie dat Access niet moet zoeken naar een veld, maar naar een subformulier (dat een soort "superveld" is).

Je kan dan bvb. in een query, of in een stukje VBA in het formulier, voor een bepaald criterium de waarde van veldX ophalen en er iets mee doen; bvb. If Waarde > [Forms]![formA]![formB].[Form]![FormC].[Form]![veldX] Then MsgBox("Deze waarde is te groot"); Else: MsgBox("Deze waarde is OK").

Wat ik dan doe om dat OOK in een doorlopend formulier te laten weergeven - meestal is dat veel handiger dan een enkelvoudig:
1. In mijn query neem ik een aantal variabelen op die ik een waarde geef met dit soort berekeningen; dat zijn gewoon querykolommetjes waar ik geen veld in sleep, maar die ik als volgt invul: (bemerk: IIf = immediate if)
Variabele 1: TeGroot: IIf([Forms]![formA]![formB].[Form]![FormC].[Form]![veldX]>100;"TE GROOT";"") - dwz: als de voorwaarde vervuld is, heb ik een string "TE GROOT", anders een lege string
Variabele 2: OK: IIf([Forms]![formA]![formB].[Form]![FormC].[Form]![veldX]<=100;"OK";"") - idem, maar omgekeerd
Nu heb ik dus twee variabelen, die voor elke record zullen worden berekend.
2. Op mijn doorlopend formulier plaats ik nu deze "berekende velden" letterlijk bovenop elkaar, maar beide transparant; de ene geef ik een rode, de andere een groene letterkleur.
3. Mijn formulier zal in elk record de juiste "commentaar" geven: de ene blijft leeg en dus onzichtbaar, de andere is opgevuld en dus zichtbaar - geen achtergrondkleur, wel bvb; onderlijnen, vet, enz...; pas je in je formulier de uitgangswaarde aan waarop de berekening wordt uitgevoerd, dan is onmiddellijk ook de "commentaar" juist. Dat is een soort uitbreiding of alternatief van voorwaardelijke opmaak.

In het algemeen kan je zeggen dat dit soort truken het voor een minder ervaren VBA-programmeur makkelijker maken, vind ik ☺☺☺.
 
Laatst bewerkt:
En nog een kleine tip - aansluitend op de vorige: met
[Forms]![formA]![formB].[Form]![FormC].[Form]![veldX].SetFocus
verplaats je dus de focus, en je kan dat doen vanaf gelijk welke plaats, zolang formC maar openstaat, én veldX zichtbaar is (je kan niet verplaatsen naar een vebrorgen element).
 
Met wat zoeken in de behandelde onderwerpen en de boevenstaande codes is het mij gelukt.
Alles werkt zoals ik het wil.
We gaan weer verder.
De code is nu als volgt:

Code:
Private Sub MijnTabs_Change()
    Dim tabCtl As TabControl
    Dim tabPage As Page
    Dim ctlNaam As String
    
        Set tabCtl = Me.MijnTabs
        Select Case tabCtl
            Case 1  'Tweede pagina
                ctlNaam = "Logboek"
           Case Else   'Geen pagina
            Exit Sub
        End Select
        Me.Logboek.SetFocus
        Form![Liftboek].Form!txtFabrikaat.SetFocus
End Sub

Mijn dank is groot.
Case Closed
 
@ ZisDienst:
Ingewikkelde constructie; ik zou daar een geneste IIF van maken in één veld. Heb je ook niks te verbergen ;)
 
Laatst bewerkt:
@jlebbink:
Geen idee wat je nu aan het doen bent; je vult in de SELECT CASE een variabele als je op het tweede tabblad klikt, maar doet daar verder niks mee. Vervolgens (na de Select Case) activeer je eerst Me.Logboek.SetFocus, en vervolgens doe je: Form![Liftboek].Form!txtFabrikaat.SetFocus. Dat laatste haalt de focus af van Logboek, en de code is bovendien hetzelfde als: Me.txtFabrikaat.SetFocus.
Dus wat denk je dat er nu gebeurt in je formulier?
 
Code:
Private Sub MijnTabs_Change()
        Form![Liftboek].Form!txtFabrikaat.SetFocus
End Sub

Op deze toch wel eenvoudige manier werkt het prima.

Ik ben tevreden.
 
En dat is dus hetzelfde als:
Code:
     Me.txtFabrikaat.SetFocus
Gebruik alleen volledige formulierverwijzingen als je vanuit Formulier A iets moet doen op (sub)formulier B. Anders heb je straks problemen als je bijvoorbeeld je formulier wilt hernoemen. Met ME verwijs je naar het onderliggende object (in jouw geval dus het formulier <Liftboek> en dat is niet alleen veel korter typen, je kunt ook de objcten bibliotheek gebruiken. Dus dubbel gemak.
 
En dat is dus hetzelfde als:
Code:
     Me.txtFabrikaat.SetFocus
Gebruik alleen volledige formulierverwijzingen als je vanuit Formulier A iets moet doen op (sub)formulier B. Anders heb je straks problemen als je bijvoorbeeld je formulier wilt hernoemen. Met ME verwijs je naar het onderliggende object (in jouw geval dus het formulier <Liftboek> en dat is niet alleen veel korter typen, je kunt ook de objcten bibliotheek gebruiken. Dus dubbel gemak.

Dan krijg ik de foutmelding "Kan de methode of het gegevenslid niet vinden"
 
Dan heb je het tweede object op een subformulier staan, en daar heb je het niet over gehad :)
 
Mijn bijgevoegde minuscule database is met een subformulier. Maar maakt niet uit. Ik ben al met al toch goed geholpen.

Mijn dank daarvoor.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan