Focus terugzetten

Status
Niet open voor verdere reacties.
Dan zou ik in de msgbox zelf Cancel = True moeten zetten.

De Cancel = False zou dan in de rest van de code niet hoeven dacht ik.
 
En hier blijven we "dienen' ;)
 
Cancel = False is de standaard waarde.
 
Yep hier blijven we dienen..... alleen wel leuk als ze je nog herkennen.... dan kijken ze om zich heen en dan is het zoals velen zien en noemen.. vriendjespolitiek. Wel in dit soort gevallen is het dan. Als er niets is gebeurd dan krijg je het vriendschappelijk advies:" Laat de auto staan en ga verder lopen anders moet ik helaas echt maatregelen nemen." Als er wel iets is gebeurd dan ga je dubbel. (Iets wat de "burger" dan niet ziet).
 
De "burger" vind het niet leuk om op een fout te worden aangesproken en helaas zijn er teveel die daar totaal verkeerd op reageren.
 
Maar mijn bedtijd nu. Was gezellie :) En voor de moderator, vergeef ons het chat gedrag tijdens een late poging om tijdens een biertje elkaar van dienst te zijn :D
 
Ja dat zeker. Ik zeg altijd maar. Blijf rustig, erken je fout, want wij zijn allen mens en mensen maken fouten (bewust of onbewust), en accepteer dat "wij" dan gewoon ons werk doen. Men maakt het soms voor zichzelf zo moeilijk en dan gebeuren er zaken die men liever niet heeft en "wij" ook niet.

Ik vergeet nooit meer de posters... vandaag ben je held, morgen ben je een ********.
 
Cancel = False is inderdaad de standaard waarde. Daarom schreef ik dus dat ik dan de melding in de msgbox op True moet zetten. Ik ga daar weer even mee verder puzzelen. Nu ik hier weer aan ben herinnert, kan ik weer een codes inkorten en sommige dingen aanpassen naar wat ik wel wilde doen. Ik gebruikte nu ook telkens AfterUpdate. Dat kan ik nu allemaal weglaten en in de _Exit plaatsen.

Blijft leuk VBA. In de paar jaar dat ik er nu mee bezig ben, begin ik langzaam de taal te begrijpen. Een aantal jaar geleden wilde ik er niet aan en nu ben ik er gewoon als hobby mee bezig en pas ik mijn complete bestanden aan. Ook al is er nog een lange weg te gaan en weet je nog niet alles. Soms voor een simpele oplossing, die je eigenlijk al kent, zoek je toch de moeilijke oplossing waardoor je aan de simpele oplossing niet meer denkt...
 
Ja inderdaad. Bijna vergeten. De moderator. De politie al hier. Sorry !!! Ach moet soms eens kunnen.

Weltrusten Edmoor en weer bedankt.

Vraag als OPGELOST gemarkeerd.
 
Laatst bewerkt:
Even terugkomend op het probleem voor de Reset knop..

Zet de TakeFocusOnClick in eigenschappen voor de commandbutton op waarde: False

Zo blijft de knop gewoon werken als de focus op de textbox blijft staan. Alleen ik moet nu wel even kijken waar de rest fout gaat, want nu volgt een foutmelding over de focus op de combobox, omdat de focus nog steeds op de textbox staat. Zodra ik de focus op de combobox weglaat... dan springt de focus naar de volgende textbox.

Dus als ik de RESET aanklik vanuit textbox7 dan gaat de focus naar textbox8.

Blijft leuk. Vraag dus weer als onopgelost gemarkeerd.
 
Laatst bewerkt:
Ik probeer het gebruik van SetFocus altijd zoveel mogelijk te vermijden omdat het al gauw problemen geeft. Plaats anders je document eens, dan wil ik wel even mee kijken.
 
Oke het heeft voor zover ik zie te maken met de AutoTab van de Textboxen. Deze staan op True om de invoer te vergemakkelijken. Zodra er 2 karakters zijn ingevoerd gaat deze automatisch de volgende textbox. Dat gaat goed. Alleen zodra ik van mijn toetsenbord op de toets TAB klik, omdat er dan maar 1 cijfer in staat dan krijgt het cijfer een voorloopnul. Tot daar gaat het goed, alleen begint hier het kleine probleem. De focus schiet niet zoals bij de AutoTab naar de volgende, maar naar die erna. Dus met AutoTab gaat de focus van 2 naar 3, maar zonder en met de TAB toets op het toetsenbord gaat de focus van 2 naar 4.

Omdat de Reset knop te alle tijden moet kunnen worden gebruikt en om de focus van de actieve textbox te halen, heb ik de TakeFocusOnClick van de Resetknop uitgeschakeld en heb ik de cancel methode gebruikt bij het event _Exit. Als ik dan naar de eerste coderegel kijk in het event _Exit (ByVal Cancel as.........

Code:
 If TextBox2.Value = vbNullString Then Cancel = False: Exit Sub

    If TextBox2.Value < 1 Or TextBox2 > 31 Then
        MsgBox ("Onjuiste ingave van daginvoer." & vbNewLine & vbNewLine & "Kies een waarde tussen de 1 en 31"), vbInformation, ""
        TextBox2.Value = vbNullString
        Cancel = True
    End If
    
    TextBox2.Value = Format(TextBox2.Value, "00")

dan zie ik waar het fout gaat. Immers de textbox heeft geen waarde en zal meteen Exit volgen waarna de focus naar textbox 4 gaat.

Ik zat te denken om dit als onderstaand op te vangen. Geen Waarde in textbox aanwezig dan gebeurd er niets, maar zodra de Resetknop wordt aangeklikt dan Exit en Cancel.

Code:
    If TextBox2.Value = vbNullString Then
        If cb_Reset_Click Then Cancel = False: Exit Sub
    End If

Er zit een fout in het controleren of er op de cb_Reset_Click is geklikt. Ik weet even niet meer of ik nu met Dim ... as Boolean moet werken of dat ik dat anders kan opvangen. Hoe dan ook. Ik heb het ooit eens voor elkaar gekregen, maar door een wijziging is die code in een ander bestand verloren gegaan. Deze manier staat helaas dus niet in mijn archief.

Wie o wie is de eerste in lijn die mij hier kan corrigeren.
 
Je hebt met allerlei events te maken die middels bovenstaande niet te volgen zijn. Je kan beter je document of een gelijk voorbeeld plaatsen.
 
He Edmoor. Klopt ik heb met verschillende events te maken. Ik heb al gezien dat er ook "foutjes" in de instellingen staan van een paar objecten. Ik ga dat eerst in orde maken. Ik vermoed alleen dat dit niet veel zal uitmaken, maar ieder klein dingetje kan een verschil maken.

Voor wat betreft de events van de textboxen. Ik gebruik bij de textboxen waar ik nu mee aan het stoeien ben hooguit de Exit bij. Die andere 2 textboxen daar gebruik ik ook nog een Enter bij, maar die wil ik ook in de Exit van de voorgaande textbox plaatsen. De Reset knop maakt hooguit de Textboxen 2, 3, 4, 5, 6 en 7 leeg. Middels het Callen van Standaardwaarden wordt de rest teruggezet. Vanuit de Initialize van het userform wordt daar ook meteen naar gestuurd. Dit om de Reset mogelijk te maken. Verder wordt na Standaardwaarden de focus gezet op Combobox1. Dat is eigenlijk alles. Het is niet veel bijzonders, maar er zit wel veel code achter daar het formulier wel het 1 en ander aan verwerkingen heeft.

Het probleem zit hem nu enkel in de AutoTab versus de bij geen waarde bevatten van een textbox de Cancel en Exit Sub. Zodra de waarde in de textbox zeg maar 1 is dan moet er komen te staan 01. Dus via Format "00" heb ik dit gerealiseerd. Daarnaast is de maximale lengte 2 karakters. Dus na het invoeren van 2 karakters gaat de focus naar de volgende textbox. Dat gaat dan goed, maar zodra ik 1 karakter invoer dan moet ik via Tab de focus verplaatsen. Ik heb al geprobeerd om via Textbox_Change de voorloopnul erbij te laten zetten. Dat werkt wel, maar door die maximale lengte zit ik meteen aan 2 karakters zodra ik de eerste invoer. Dit resulteert dus meteen al tot het verplaatsen van de focus of dat er meteen niets meer kan worden ingevoerd. Er bestaat een manier om de voorloopnul ook nog te laten wijzigen, maar kan even dat puzzelstukje niet leggen. Application.Wait heb ik ook niets aan en is overigens niet hiervoor bedoelt en die heb ik er overigens toen ook niet in gebruikt. Ik had bij die code toen allemaal nullen geplaatst en tijdens het invoeren als ik bijvoorbeeld 0123 moest hebben gebeurde er als volgt en ging middels Change.

Standaard stond er 0000
Bij het intikken van het cijfer 1 stond er 0001
Bij het intikken van het cijfer 2 stond er 0012
Bij het intikken van het cijfer 2 stond er 0123

Dus ik zoek nog even naar een andere mogelijkheid. Ik weet wel dat het in die code mogelijk is om een extra voorwaarde te koppelen voordat de Cancel en Exit wordt uitgevoerd. Dat heb ik op een andere manier al geprobeerd. Vandaar dat ik dus vroeg om een code die bij een combinatie vbNullString en het aanklikken van de Resetknop de Cancel en Exit uitvoert. Hoewel ook hier dan nog een paar aanpassingen nodig zijn omdat anders de msgbox wordt uitgevoerd. Hieraan staat namelijk de voorwaarde bij minder dan 1 of groter dan 31. Daar vbNullstring hier ook onder valt laat het weinig te raden wat er dan ook kan gebeuren. Dat is dus mede een reden dat ik kijk naar een extra voorwaarde. De code die gebruikt wordt staat in #32.

Kijk maar even wat je hiermee doet. Gezien de omvang van het programma kan ik je desnoods het userform toezenden die je dan plakt in een blad van Excel. Dat moet volgens mij ook werken. Immers alle bewerkingen en berekeningen vinden plaats via het formulier.
 
Ik heb nooit setfocus nodig en gebruik zelden andere gebeurtenissen dan de _change gebeurtenis.
VBA is niet consistent in de volgorde van afhandeling van userform- of Active X-control gebeurtenissen.
Daardoor raak je van de regen in de drup (je gaat steeds meer code / meer gebeurtenissen toevoegen).
 
Laatst bewerkt:
Daarom had ik ook al gezegd setfocus niet te gebruiken maar gebruik te maken van events die er speciaal voor zijn. Leg de controles op de juiste plek, daarmee voorkom je veel problemen. Zodra je met setfocus aan de slag gaat begeef je je in een wespennest.
 
Beste Snb. Ik probeer dat ook zoveel mogelijk te vermijden. Daar was ik een aantal projecten achter gekomen. Toen gaf jij ook al aan om de Tabvolgorde goed te zetten. Dat heb ik in deze ook geprobeerd te doen. Alleen heb ik dit voor in het begin nog niet voor elkaar gekregen. Ik zat zelf te denken aan de TabStop op False te zetten, maar ik heb het nog niet uitgeprobeerd. Immers ze moeten wel te bereiken zijn wat overigens wel handmatig kan.

Persoonlijk vind ik nog niet dat ik veel events heb gebruikt. Het zal ongetwijfeld anders kunnen en zeker gezien jou ervaring hierin geloof ik jou al blind. Hoe ik dit dan allemaal in change moet zetten, weet ik niet, maar ik denk dat ik dan alles opnieuw moet gaan opzetten. Tevens kan ik volgens mij de focus met change niet terugzetten op de textbox als daar iets mis in gaat. Maar mijn ervaring met jou, leert mij dat ik heel voorzichtig moet zijn met die uitspraken. Jij trekt even een trukendoos open en hoppa. Dat is het voordeel als je de ins en outs kent.

Maar heel brutaal.... weet jij hier een antwoord op. Ik ben al bezig om even de boel apart te zetten zodat ik deze hier kan plaatsen zodat er meegekeken kan worden. Ik zal ongetwijfeld wel te moeilijk denken waardoor ik het simpele over het hoofd zie.

Ik durf trouwens bijna mijn hand er voor in het vuur te steken dat als jij de boel zou oppakken, jij lacht, de boel volledig verwijderd en de code opnieuw schrijft waardoor er totaal niets maar dan ook niets meer overblijft van mijn code en dat het geheel met minimaal 40 regels wordt verkleint. :D. Positief bedoelt.
 
Laatst bewerkt:
Lachen is sowieso nooit verkeerd. Een voorbeeldbestand kan daaraan een belangrijke bijdrage leveren...:d
 
Wat ik al aangaf zal deze hier straks geplaatst worden. Ik ben even de boel met een frisse kijk aan het nalopen. Hierdoor ben ik voorlopig al een aantal coderegels tegengekomen waarbij ik zelf al vraagtekens plaats. Of zij doen niets of zij werken de boel tegen. Eerst laat ik hem bijvoorbeeld A zeggen terwijl deze B moet zeggen, maar omdat ik dan een opheffende code heb staan in het zelfde deel, wordt er toch A gezegd.

Hierdoor heb ik een paar probleempjes eruit gehaald, maar hierdoor verliest weer een andere code zijn doel terwijl dat ook weer niet de bedoeling is. Dus hier en daar moet ik het ook anders opzetten. Het lukt mij nog niet om SetFocus altijd te mijden, maar ik probeer dit wel te minimaliseren.
 
Voordat ik hier de zaak neerzet, wil ik nog 1 ding uitproberen. Dit omdat ik er vermoedelijk achter ben waar het probleem in zit. Ik geef nu in het event _Exit, telkens bij het verspringen middels AutoTab als volgt aan: If TextBox2=vbNullString then Cancel = False: Exit Sub. Hierdoor gebeurd er zoals eerder te lezen was en dat wil ik voorkomen. Immers als deze code weg is dan blijft werkt de TAB en AutoTab gewoon wel hoe ik wil. Alleen datgene erna de msgbox klapt er dan meteen in.

Er is toch een mogelijkheid, dacht ik, om dit onder de Reset te plaatsen middels ActiveControl en zo ja dat je dan middels deze de cancel = false kan uitvoeren?

Als dat zo is dan heb ik volgens mij wat ik heb willen.

Ik dacht iets van:

Code:
Private Sub cb_Reset_Click()
    With ActiveControl
        Cancel = True
        Exit sub 'Uit de lopende subroutine van Textbox Exit(ByVal .....
    End With
    
    For i = 2 To 7
        Me("TextBox" & i) = vbNullString
    Next
    
    Call StandaardWaarden
    


End Sub

Overigens had ik bovenstaande al geprobeerd en krijg ik deze niet werkend. Wellicht dat het aan de code opbouw ligt.

Ik probeer alleen maar mee te denken en meer niet.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan