Probleem SetFocus bij _Afterupate

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Om de zaken toch even gescheiden te houden en overzichtelijk heb ik hier de vraag opnieuw geplaatst en het andere Topic als opgelost beschouwd.

Ik heb nog steeds een probleem met de SetFocus.

Welk event moet ik gebruiken om dit wel werkend te krijgen.


Code:
Private Sub TextBox9_AfterUpdate()
    
   If CheckBox1 Then
        With ComboBox2
            .Enabled = True
            .BackColor = &HFFFFFF
                
        'SetFocus werkt niet. Deze moet nadat textbox9 al dan niet is veranderd, de focus zetten naar combobox2.
            .SetFocus
        End With
    End If

End Sub
 
Ik denk dat de SetFocus opdracht wel werkt maar dat de Focus daarna direct terugkeert maar het TextBox9 object omdat het Exit event nog moet worden uitgevoerd. Gebruik daarom de SetFocus opdracht in het Exit event van TextBox9 en zet daarin dan ook de Cancel parameter op True om uit te sluiten dat een ander event de focus weer wijzigt.
 
Setfocus is niet nodig als je goed programmeert.
Kijk eerst naar de tabvolgorde van de controls in een userform.
 
Dat heb ik al eerder geprobeerd uit te leggen ;)
 
Ja ik weet dat het mij vaker is uitgelegd, maar ik vroeg al eerder hoe de TabIndex dan wel moest staan. Kreeg ik geen antwoord op. Dit omdat textboxen, comboboxen etc allemaal hun eigen TabIndex kennen en ik de volgorde al eens had veranderd en dat daar iets verkeerds in ging. Tevens had ik ook al eens eerder begrepen dat je niet zomaar TabIndexen moet veranderen daar er dan problemen kunnen ontstaan met het userform. Dit laatste had ik ergens op internet begrepen.

Tevens is het ook zo dat niet ieder textbox achter elkaar benaderd moet worden daar hier dan enkel automatisch gegevens worden ingevuld. Deze mogen dus niet mee in de TabIndex.

Maar goed. Edmoor. Als ik de exit gebruik en dan achter Cancel=true plaats, dan komt er een foutmelding. In eerste plaats bedoelde jij dit, of vul ik dan toch nog iets verkeerds in?

Code:
Private Sub TextBox9_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    
   If CheckBox1 Then
        With ComboBox2
            .Enabled = True
            .BackColor = &HFFFFFF
                
        'SetFocus werkt niet. Deze moet nadat textbox9 al dan niet is veranderd, de focus zetten naar combobox2.
            .SetFocus
        End With
    End If

End Sub
 
Laatst bewerkt:
De = True moet niet achter de Cancel in de parameters maar als opdracht in de functie:
Code:
Private Sub TextBox9_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If CheckBox1 Then
        With ComboBox2
            .Enabled = True
            .BackColor = &HFFFFFF
            'SetFocus werkt niet. Deze moet nadat textbox9 al dan niet is veranderd, de focus zetten naar combobox2.
            .SetFocus
        End With
        Cancel = True
    End If
End Sub
 
Ik wil toch nog even terug komen op het TabIndex verhaal. Om dat goed te gebruiken maak je eerst je formulier op met alle objecten die je wilt hebben, dus ook de objecten die daarna verborgen worden. Als dat gereed is ga je de TabIndex per object in de juiste volgorde zetten, per formulier, dan per object en vervolgens per frame per object, van linksboven naar rechtsonder, zoals in dit plaatje. De rode cijfers zijn de TabIndex nummers:

250npec.jpg


Het is dus per containerobject en daarbinnen de andere objecten. Een veld onder het frame in het formulier zou dus nummer 3 krijgen. Wanneer je dan bij het openen van het formulier objecten op Visible = False zet, zet dan meteen ook TabStop is False. Bij het zichtbaar maken zet je dan Visible = True uiteraard en dan ook TabStop = True.

Zo is de volgorde altijd goed en heb je geen SetFocus nodig, tenzij je specifiek van de standaard volgorde wilt afwijken.
 
Laatst bewerkt:
De = True moet niet achter de Cancel in de parameters maar als opdracht in de functie:
Code:
Private Sub TextBox9_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If CheckBox1 Then
        With ComboBox2
            .Enabled = True
            .BackColor = &HFFFFFF
            'SetFocus werkt niet. Deze moet nadat textbox9 al dan niet is veranderd, de focus zetten naar combobox2.
            .SetFocus
        End With
        Cancel = True
    End If
End Sub

:rolleyes: Snorry borry torry. Shame shame
 
Ik wil toch nog even terug komen op het TabIndex verhaal. Om dat goed te gebruiken maak je eerst je formulier op met alle objecten die je wilt hebben, dus ook de objecten die daarna verborgen worden. Als dat gereed is ga je de TabIndex per object in de juiste volgorde zetten, per formulier, dan per object en vervolgens per frame per object, van linksboven naar rechtsonder, zoals in dit plaatje. De rode cijfers zijn de TabIndex nummers:

250npec.jpg


Het is dus per containerobject en daarbinnen de andere objecten. Een veld onder het frame in het formulier zou dus nummer 3 krijgen. Wanneer je dan bij het openen van het formulier objecten op Visible = False zet, zet dan meteen ook TabStop is False. Bij het zichtbaar maken zet je dan Visible = True uiteraard en dan ook TabStop = True.

Zo is de volgorde altijd goed en heb je geen SetFocus nodig, tenzij je specifiek van de standaard volgorde wilt afwijken.

Sorry maar ik begrijp er helemaal niets van. Het is ongetwijfeld simpel, maar ik krijg het niet aangepast. Daarbij dienen er wat ik al aangaf sommige objecten als volgende te worden overgeslagen. Ik bedoel textbox9 zit in frame 1 en combobox2 zit in frame 6. Alles wat daartussen zit wordt niet aangesproken. Daarnaast is het zo dat als ik de checkbox op false heb staan, de setfocus op combobox2 weer wel werkt. Ook merk ik dat als ik nummers geef de nummers gewoon terug veranderen of dat er een heel ander nummer komt te staan. De rest van de TabIndex nummers veranderen dan in het bewuste frame ook.

Dus ik begrijp er helemaal niets van. Sorry.

Overigens met Cancel = True werkt het ook niet.

No offense!!!
 
Laatst bewerkt:
Ik zit even door te borduren en te kijken wat er nu precies gebeurd in een nieuw userform. Ik denk dat ik jou totaal verkeerd begrepen heb en dat ik tegelijk te moeilijk denk.

TabStop = true, kun je dus gebruiken om die tab over te slaan. Een label wordt indirect meegenomen in de Tabvolgorde. De objecten in een frame kun je feitelijk ook anders lezen... het eerste object in een frame 1.0, het tweede object 1.1, het derde object 1.2 etc. Daarna ga je dus in een daarop volgende frame verder met 2.0, 2.1, 2.2 etc etc etc.

Ik denk dat ik het begin te begrijpen... na een halve krat bier........ :o
 
Zo kun je er inderdaad naar kijken. De TabIndex begint echter nooit bij 1, altijd bij 0. Maar het principe zoals je dat beschrijft is correct. Ik zeg het wel vaker, een biertje is altijd ergens goed voor ;)
 
@Masala09

Het wordt eenvoudig als je de denkstijl van de VBA ontwikkelaars probeert te begrijpen. Daar kom je niet achter door zomaar wat uit te proberen, maar door je af te vragen waarom in het ene geval dit en in het andere geval iets anders gebeurt. Daar zit meestal een algemene redenering achter.

Een userform is een object ,dat een verzameling(collection) controls (ook objecten) bevat.
De tabvolgorde is van toepassing op alle elementen van die verzameling controls.
De controls worden een voor een afgelopen.
De volgorde waarin de controls worden afgelopen kun je instellen met de tabvolgorde.
Omdat controls deel uitmaken van een verzameling (collection) krijgt het eerste element de index 0.
Als je met je cursor in een userform op de rechtermuisknop klikt zie je de optie 'tabvolgorde"; daarmee kun je de volgorde instellen. (de andere methode is via de eigenschap tabindex van ieder control).

Op de tabvolgorde is 1 uitzondering: als de control niet geslecteerd kan worden (= 'niet de focus kankrijgen.
Dat geldt in 2 gevallen
- een label kan niet geselecteerd worden
- een control die 'disabled' is (eigenschap enabled = false) kan ook niet geselecteerd worden

Met gebruik van de tabvolgorde, het onderbrengen van controls in 'frames' en het gebruik van de eigenschap 'enabled' kun je perfect de invulvolgorde van een userform controleren zonder gebruik te maken van 'events' of 'setfocus'.
 
Laatst bewerkt:
Ik heb de tabvolgorde meteen uitgeprobeerd in het vervolg userform. Deze heb ik op een hele andere manier opgezet dan ik normaal deed. Nu zie ik de volgorde ook en wat ik ook heb gemerkt is dat in het opmaken van het formulier de tabvolgorde ook al kan worden gevolgd. Ik merk dus dat je gewoon alles achter elkaar kan zetten. Maakt niet uit wat het object voor iets is. Zolang je de nummers der TabIndex maar wel gewoon laat optellen en datzelfde ook in een frame zoals ik heb beschreven in post 11.

In ieder geval lopen de acht factuurregels die ik in het tweede formulier heb geplaatst, op volgorde en per regel.

Ik ga dat straks proberen te veranderen in het andere userform. Ik vermoed dat ik er nu wel uit ben. Ik heb kennelijk weer wat ik al eerder schreef, te moeilijk nagedacht.

Toch belet dit mij niet meteen even een tweede vraag te stellen. Eigenlijk moet ik hier een nieuw topic voor openen, maar ik waag het er toch op. Alvast mijn excuus aan de moderators. ;)

Code:
Private Sub UserForm_Initialize()

    Label2 = " " & Frm_FactuurMaken1.ComboBox1
    Label4 = " " & Frm_FactuurMaken1.TextBox10
    
    Select Case Frm_FactuurMaken1.ComboBox4
        Case Is = "Ja"
            Label6 = " Verlegd"
        Case Is = "Nee"
            Label6 = " Niet verlegd"
    End Select
    
    Label8 = " " & Frm_FactuurMaken1.ComboBox3
    Label10 = " " & Frm_FactuurMaken1.TextBox11
    Label12 = " " & Frm_FactuurMaken1.TextBox12
    
    For Cmb = 1 To 8
        With Me("ComboBox" & Cmb)
            .RowSource = "Omschrijving"
        End With
    Next
    
    For Cmb = 9 To 16
        With Me("ComboBox" & Cmb)
            '.Value = Format("ComboBox" & Cmb.Value, "0%")
            .RowSource = "BTW"
        End With
    Next
    
    For i = 2 To 16 Step 2
        With Me("TextBox" & i)
             '.value=Format, " € 0.00"
        End With
        Next
    
 End Sub
 
Private Sub Cb_Wijzigen_Click()

    Me.Hide
    Frm_FactuurMaken1.Show
    
End Sub



'[U]Change ComboBoxen 9 To 16[/U]



Private Sub ComboBox9_Change()

    ComboBox9.Value = Format(ComboBox9.Value, "0%")

End Sub
Private Sub ComboBox10_Change()

    ComboBox10.Value = Format(ComboBox10.Value, "0%")
    
End Sub

Private Sub ComboBox11_Change()

    ComboBox11.Value = Format(ComboBox11.Value, "0%")
    
End Sub

Private Sub ComboBox12_Change()

    ComboBox12.Value = Format(ComboBox12.Value, "0%")
    
End Sub

Private Sub ComboBox13_Change()

    ComboBox13.Value = Format(ComboBox13.Value, "0%")
    
End Sub

Private Sub ComboBox14_Change()

    ComboBox14.Value = Format(ComboBox14.Value, "0%")
    
End Sub

Private Sub ComboBox15_Change()

    ComboBox15.Value = Format(ComboBox15.Value, "0%")
    
End Sub

Private Sub ComboBox16_Change()

    ComboBox16.Value = Format(ComboBox16.Value, "0%")
    
End Sub


'[U]AfterUpdate TextBoxen 2 To 16[/U]


Private Sub TextBox2_AfterUpdate()

    TextBox2 = Format(TextBox2, "0.00")
    
End Sub

Private Sub TextBox4_AfterUpdate()

    TextBox4 = Format(TextBox4, "0.00")
    
End Sub

Private Sub TextBox6_AfterUpdate()

    TextBox6 = Format(TextBox6, "0.00")
    
End Sub

Private Sub TextBox8_AfterUpdate()

    TextBox8 = Format(TextBox8, "0.00")
    
End Sub

Private Sub TextBox10_AfterUpdate()

    TextBox10 = Format(TextBox10, "0.00")
    
End Sub

Private Sub TextBox12_AfterUpdate()

    TextBox12 = Format(TextBox12, "0.00")
    
End Sub

Private Sub TextBox14_AfterUpdate()

    TextBox14 = Format(TextBox14, "0.00")
    
End Sub

Private Sub TextBox16_AfterUpdate()

    TextBox16 = Format(TextBox16, "0.00")
    
End Sub

Wat ik wil bereiken is dat ik in 1 sub de rowsource meteen de juiste format geef. Nu doe ik dit via een extra private sub combobox9_change().

Ik heb wat dat aangaat best aardig wat comboboxen hier staan die hetzelfde moeten krijgen. Ik tracht dit simpel voor elkaar te krijgen in 1 code via de For cmb = 9 To 16

Ditzelfde geldt ook voor de TextBox reeks 2 tot 16, met telkens een step 2. Dus de For i = 2 To 16 step 2. Op deze wijze wil ik dan de code laten gelden voor textbox 2,4,6,8,10,12,14 en 16. Deze code moet de format code geven die nu in textbox2 staat.

Als dit rond is dan moet ik nog berekeningen maken. Dus ik ben nog wel even bezig..... :confused:

Snb ook jij bedankt voor je aanvullende input. :thumb:


Update.

Code:
    For i = 2 To 16 Step 2
        With Me("TextBox" & i)
            TextBox = Format(TextBox, " € 0.00")
        End With
        Next
Werkt ook niet.
 
Laatst bewerkt:
Dat kan toch ook niet werken: VBA is een taal met een grammatica en spelling. Zomaar wat neerzetten leidt tot VBA koeterwaals.

Code:
For j = 2 To 16 Step 2
  Me("TextBox" & j).text= Formatcurrency(TextBox2.Text)
Next
 
Een tip is ook om, zeker wanneer je met zoveel objecten werkt, deze van een juiste naam te voorzien in plaats van de standaardnaam aan te houden.
 
Laatst bewerkt:
Snb.... Koeterwaals?? Het is nog zeer regelmatig Japans voor mij. Zoveel verschillende codes, maar het blijft leuk om er mee bezig te zijn. Een uitdaging.

Ik krijg bij jouw aangeboden code een foutmelding:

Fout 5 tijdens uitvoering

Ongeldige procedure-aanroep of ongeldig argument


Ik zal het bestand voor het gemak even opnieuw plaatsen.

Bekijk bijlage FrmFactuurMaken.xlsm

Edmoor. De objecten een naam geven, geeft inderdaad meer duidelijkheid, maar ik ben een beetje uitgeteld met namen geven. :D
 
Dan is er voor jou nog werk aan de winkel, want de code is correct.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan