24. januar 2013 - 16:23Der 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
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.
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
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?
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.
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.