Avatar billede Carsten Juniormester
21. februar 2022 - 22:06 Der er 3 kommentarer

Setfocus - efter cancel before update

Excel 2016 Windows
Jeg har en programkode som annullere opdateringen af tekstfeltet tbZyl hvis if-betingelsen er sand.
Jeg prøver at få at få VBA til at blive i tbZyl, men ligemeget om jeg klikker væk med musen eller "taber", så får jeg msgbox og feltet bliver rødt, men cursoren er ikke i feltet - brugeren skal klikke med musen  - Kan nogen hjæle

Private Sub tbZyl_BeforeUpdate(ByVal cancel As MSForms.ReturnBoolean)
Me.tbZyl.BackColor = &H80FFFF
If (Me.tbZyl = "" or Me.tbZyl = "0" Or Me.tbZyl = "00" Or Me.tbZyl = "000" Or Me.tbZyl = "0000") Then
        cancel = True
        Me.tbZyl.BackColor = &H8080FF
        MsgBox "Zylchrom skal angives i mindst en enhed", , "Fejl i enhedsangivelsen!"
        Me.Zyl.SetFocus
        Exit Sub
End If
Avatar billede Lene Fredborg Ekspert
21. februar 2022 - 23:47 #1
I din viste kode står der:
Me.Zyl.SetFocus
men navnet på din TextBox er tilsyneladende tbZyl, så:
Me.tbZyl.SetFocus
Avatar billede Carsten Juniormester
22. februar 2022 - 18:14 #2
Tak for din interesse.
Den har jeg stirret mig blind på, og er rettet.
MEN
Når jeg retter, sættes der stadigvæk ikke focus det rette sted.
Jeg har leget lidt. Sætter jeg appestrof (') som kommentar så msgbox ikke effektueres så fungere det. Det handler nok om at focus flyttes når man klikker [OK] til msgbox.

Kan man føre, så focus ikke sker når msgbox lukker, det er ikke en formular hvor jeg kan styre, hvad der skal ske når det lukker.
Avatar billede Lene Fredborg Ekspert
23. februar 2022 - 00:04 #3
Du kalder SetFocus i event BeforeUpdate. Se bemærkningen ”Events like Exit, Enter and AfterUpdate prevent you from using setfocus properly I'm afraid” fra jkpeiterse i denne tråd:
https://www.mrexcel.com/board/threads/cant-set-focus-back-to-textbox-after-user-error.1009681

Linjen:
Cancel = True
får i sig selv fokus til at blive i tbZyl. Prøv derfor helt at fjerne linjen:
Me.tbZyl.SetFocus

Det virker i min test. Alternativt kan du tilføje en separat function til at sætte fokus. I givet fald:

Udskift linjen:
Me.tbZyl.SetFocus

med følgende linje:
fncSetFocus_tbZyl

og tilføj følgende function i kodemodulet:

Function fncSetFocus_tbZyl()
    With Me.tbZyl
        .SetFocus
        'marker teksten
        .SelStart = 0
        .SelLength = Len(.Value)
    End With
End Function

--------------
TIP: Du kan forbedre din kode generelt og undgå problemer som det med forkert navn i første omgang, hvis du bruger With/End With, så du kun refererer til kontrolnavnet én gang. F.eks. sådan:

Private Sub tbZyl_BeforeUpdate(ByVal cancel As MSForms.ReturnBoolean)

    With Me.tbZyl
        .BackColor = &H80FFFF
        Select Case .Value
            Case "", "0", "00", "000", "0000"
                cancel = True
                .BackColor = &H8080FF
                MsgBox "Zylchrom skal angives i mindst en enhed", , "Fejl i enhedsangivelsen!"
           
                fncSetFocus_tbZyl
                Exit Sub
        End Select
    End With
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester