Avatar billede JZA Nybegynder
24. januar 2013 - 16:23 Der er 11 kommentarer og
1 løsning

Me.Controls(TbNavn) i With sætning

Hej Eksperter

Hvad skal jeg gøre for at få nedenstående funktion til at virke ved Exit på flere tekstbokse?
Det virker fint hvis koden er skrevet direkte under eks. TextBox1_Exit og "Me.Controls(TbNavn)" er erstattet med "TextBox1"
Som koden er nedenfor, så er det som om den stopper når den kommer til en with sætning, men jeg kan ikke få den til at melde fejl. "SelLength = Len(.Text)" i with sætningen virker også problematisk.

Håber at der er nogen der kan hjælpe.

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CheckValue
End Sub
'--------------
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    CheckValue
End Sub
'-----------------
Private Function CheckValue()
If Me.Controls(TbNavn) = "" Or Len(Me.Controls(TbNavn)) = 1 Or Len(Me.Controls(TbNavn)) = 2 Or Len(Me.Controls(TbNavn)) = 3 Or Len(Me.Controls(TbNavn)) > 5 Then
    Cancel = True
    With Me.Controls(TbNavn)
        MsgBox "Please enter a time value [hhmm] or [hh:mm]!"
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
ElseIf Left(Me.Controls(TbNavn), 2) > 23 Then
    If InStr(TextBox1.Text, ":") Then
        Me.Controls(TbNavn).Text = Format(Me.Controls(TbNavn).Text, "hh:mm")
    Else
        Me.Controls(TbNavn).Text = Format(Me.Controls(TbNavn).Text, "00:00")
    End If
    Cancel = True
    With Me.Controls(TbNavn)
        MsgBox "Please enter a time value [hh] between 0 and 23!"
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
ElseIf Len(Me.Controls(TbNavn)) = 4 Then
    If InStr(Me.Controls(TbNavn).Text, ":") Then
        Cancel = True
        With Me.Controls(TbNavn)
            MsgBox "Please enter a time value [hhmm] or [hh:mm]!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
    ElseIf Right(Me.Controls(TbNavn), 2) > 59 Then
        Cancel = True
        With Me.Controls(TbNavn)
            MsgBox "Please enter a time value [mm] between 0 and 59!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
    Else
        Me.Controls(TbNavn).Text = Format(Me.Controls(TbNavn).Text, "00:00")
    End If
ElseIf Len(Me.Controls(TbNavn)) = 5 Then
    If InStr(Me.Controls(TbNavn).Text, ":") Then
        If Right(Me.Controls(TbNavn), 2) > 59 Then
        Cancel = True
        With Me.Controls(TbNavn)
            MsgBox "Please enter a time value [mm] between 0 and 59!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
        End If
    Else
    Cancel = True
    With Me.Controls(TbNavn)
        MsgBox "Please enter a time value [hhmm] or [hh:mm]!"
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
    End If
End If
End Function
Avatar billede kabbak Professor
02. februar 2013 - 19:26 #1
ret

Private Function CheckValue()
til

Private Function CheckValue(TbNavn)


Kaldes med

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
CheckValue("TextBox1")
End Sub

er ikke testet, men det burde virke.
husk at rette til
CheckValue("TextBox2")
i den anden
Avatar billede kabbak Professor
02. februar 2013 - 19:29 #2
måske skal du lave
Private Function CheckValue()
om til en
public Sub CheckValue(TbNavn)

og så bruge

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
call CheckValue("TextBox1")
End Sub
Avatar billede JZA Nybegynder
06. februar 2013 - 13:44 #3
Tak for svarene

Jeg har endnu ikke opnået det resultat jeg gerne vil, men jeg fornemmer at det går i den rigtige retning.
Når jeg laver ovenstående tilpasninger, så opnår jeg at der ikke kommer fejlmeddelelser og hvis jeg stopper kørslen af programmet efter "End With" og går tilbage til formularen, så er teksten i den tilhørende textbox også markeret som den skal. Jeg har dog fortsat det problem at hvis jeg køre hele programmet, så opnår jeg ikke en markering af teksten i de sammenhænge hvor indtastningen ikke opfylder reglerne. I den sammenhæng accepteres indtastningen og på exit flyttes der til den efterfølgende tekstbox.
Hvis jeg laver den simple og udskifter "Me.Controls(TbNavn)" med "TextBox1", så virker alt på TextBox 1 og indtastningen accepteres ikke før den opfylder kriterierne.
Avatar billede kabbak Professor
10. februar 2013 - 09:39 #4
prøv at sætte et
End Sub

ind lige før alle
    End With

NB, hvis det stadig er en funktion, skal det være

End  Function
Avatar billede JZA Nybegynder
14. februar 2013 - 17:17 #5
End Sub eller End Function lige før alle End With giver kun en Compile error: "Expected End With"
Avatar billede kabbak Professor
15. februar 2013 - 12:48 #6
Min fejl, det hedder Exit sub


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Call CheckValue("TextBox1")
End Sub
'--------------
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call CheckValue("TextBox2")
End Sub
'-----------------
Private Sub CheckValue(TbNavn As String)
If Me.Controls(TbNavn) = "" Or Len(Me.Controls(TbNavn)) = 1 Or Len(Me.Controls(TbNavn)) = 2 Or Len(Me.Controls(TbNavn)) = 3 Or Len(Me.Controls(TbNavn)) > 5 Then
    Cancel = True
    With Me.Controls(TbNavn)
        MsgBox "Please enter a time value [hhmm] or [hh:mm]!"
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
        Exit Sub
    End With
ElseIf Left(Me.Controls(TbNavn), 2) > 23 Then
    If InStr(TextBox1.Text, ":") Then
        Me.Controls(TbNavn).Text = Format(Me.Controls(TbNavn).Text, "hh:mm")
    Else
        Me.Controls(TbNavn).Text = Format(Me.Controls(TbNavn).Text, "00:00")
    End If
    Cancel = True
    With Me.Controls(TbNavn)
        MsgBox "Please enter a time value [hh] between 0 and 23!"
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
                Exit Sub
    End With
ElseIf Len(Me.Controls(TbNavn)) = 4 Then
    If InStr(Me.Controls(TbNavn).Text, ":") Then
        Cancel = True
        With Me.Controls(TbNavn)
            MsgBox "Please enter a time value [hhmm] or [hh:mm]!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
                    Exit Sub
        End With
    ElseIf Right(Me.Controls(TbNavn), 2) > 59 Then
        Cancel = True
        With Me.Controls(TbNavn)
            MsgBox "Please enter a time value [mm] between 0 and 59!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
                    Exit Sub
        End With
    Else
        Me.Controls(TbNavn).Text = Format(Me.Controls(TbNavn).Text, "00:00")
    End If
ElseIf Len(Me.Controls(TbNavn)) = 5 Then
    If InStr(Me.Controls(TbNavn).Text, ":") Then
        If Right(Me.Controls(TbNavn), 2) > 59 Then
        Cancel = True
        With Me.Controls(TbNavn)
            MsgBox "Please enter a time value [mm] between 0 and 59!"
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
                    Exit Sub
        End With
        End If
    Else
    Cancel = True
    With Me.Controls(TbNavn)
        MsgBox "Please enter a time value [hhmm] or [hh:mm]!"
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
                Exit Sub
    End With
    End If
End If
End Sub
Avatar billede JZA Nybegynder
19. februar 2013 - 17:37 #7
Desværre er der fortsat ingen løsning. det er som om programmet ikke køres helt fordi det står uden for Private Sub TextBox1_Exit
Hvis jeg stopper programmet lige inden Exit Sub, så bliver det indtastede markeret, så det må blive delvist kørt. stopper jeg lige efter Exit Sub, så accepteres exit på textboksen og der springes videre til den efterfølgende.
Kan det tænkes at der skal skrives mere i forbindelse med Call CheckValue("TextBox1")? Er det her der skal:
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
i forhold til TextBox1?
Avatar billede JZA Nybegynder
21. februar 2013 - 13:24 #8
Det virker nu. Jeg har flyttet fokus på det indtastede ind under Private Sub TextBox1_Exit og alle de øvrige. Jeg ved ikke om det er en nødløsning eller om det bare er nødvendigt at have det her. Hvad siger du?
Hvis du skriver et svar, så tildeler jeg dine point.
Avatar billede kabbak Professor
21. februar 2013 - 14:38 #9
et svar
Avatar billede JZA Nybegynder
21. februar 2013 - 14:46 #10
test
Avatar billede JZA Nybegynder
21. februar 2013 - 14:47 #11
Er det en kommentar du har skrevet? Jeg kan ikke give dig point!
Avatar billede kabbak Professor
21. februar 2013 - 14:52 #12
;-))
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