18. september 2006 - 16:57Der er
58 kommentarer og 3 løsninger
Inputmaske i en userform
Hvordan kan man i en Userform styre en brugers indtastning, således at man får det samme format skrevet i en celle på regnearket. Eks. Indtastning af bilnumre: i cellen vil jeg have følgende format: UB 12345. Kan det gøres i Userformen, eller skal det ske når data skrives i regnearket?
Hvis det er en TextBox. Marker den i VBA vinduet. I properties skriver du ved Controlsource A1. Hvis du bruger Application.Screenupdating = False, eller lignende, kan det være nødvendigt ved exit, at skrive værdien til cellen. Det er nemlig TextBox'en der følger cellen!
Nu kender jeg ikke cellens adresse før indholdet af userformen indføres i regnearket. Der er tale om et ark, hvor den sub der skriver data til regnearket finder første linie uden indhold. eks. der er f.eks. 100 linier, og der skrives så til linie 101. Linien kendes ikke, når brugeren indtaster i userformen. Det optimale er, hvis man kan lave en indtastningsmaske i userformen. mvh. Hubertus
Du kan, fra formen, bruge Nederste = Range("A65536").End(xlUp).Row til at finde hvor i arket du er. Du skal selvfølgelig ændre Range("A til den pågældende kolonne.
-> excelent - er det muligt at man via koden kan få den til automatisk at springe mellemrummet over, når de 2 først bogstaver er indtastet? ligeledes vil det være fint, hvis indtastningen er ufølsom overfor store/små bogstaver - men det som skrives i cellen er store bogstaver? mvh. Hubertus
I teorien er jeg ret sikker på det kan gøres, men om mine evner rækker, ved jeg ikke, (første gang jeg prøver) kikker på det- ved ikke hvor meget jeg når i dag.
Private Sub TextBox1_Change() If Len(Me.TextBox1.Text) = 2 Then Me.TextBox1.Text = Me.TextBox1.Text & " " End If End Sub
Den driller dog, når du sletter. Når der mangler 3 tegn til sletning, gendanner den mellemrummet! Brug Shift+Home til at markere de sidste 3 tegn for sletning.
Private Sub TextBox1_Change() If Len(Me.TextBox1.Text) = 2 Then Me.TextBox1.Text = Me.TextBox1.Text & " " End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) End Sub
- akyhne: Det ser lovende ud. dog er problematikken omkring sletning ikke så heldig. Er der en løsning på den? Kan man sikre sig at de første felter er tekst og de resterende er tal? Kan man give brugeren en meddelelse om hvad der forventes?
-> excelent: din henvisning til det tidligere spørgsmål ligner meget det jeg havde brug for - ser frem til dit løsningsforslag :-)
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Chr(8) Then Else If Len(Me.TextBox1.Text) = 2 Then If IsNumeric(Left(TextBox1.Text, 1)) Or IsNumeric(Mid(TextBox1.Text, 2, 1)) Then MsgBox " De 2 første tegn, skal være bogstaver" Me.TextBox1.Text = Me.TextBox1.Text & " " End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) End If
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = Chr(8) Then ' BACKSPACE Else If Len(Me.TextBox1.Text) = 2 Then If IsNumeric(Left(TextBox1.Text, 1)) Or IsNumeric(Mid(TextBox1.Text, 2, 1)) Then MsgBox " De 2 første tegn, skal være bogstaver" Me.TextBox1.Text = Me.TextBox1.Text & " " End If If Len(Me.TextBox1.Text) > 3 Then If Not IsNumeric(Mid(Me.TextBox1.Text, 4, Len(Me.TextBox1.Text) - 3)) Then MsgBox " De 2 første tegn, skal være bogstaver, resten tal" End If End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) End If End Sub
-> Kabbak - Din kode tager udgangspunkt i at cellen - her M1 er kendt, men jeg skal bruge den i to situationer: 1. i en søgerutine, 2. hvor der skal skrives i første ledige række.
Hvordan klares den? Til nr. 2 kan man bruge akyhnes forslag fra 18/09-2006 19:40:18? vil afprøve det senere. mvh Hubertus
Hvis nummeret står i kolonne A, så er søg og gem her, på en command knap.
Private Sub Cmd_Søg_Click() Dim RW As Long, I As Long, Nummerplader As Variant, Svar As String RW = Range("A65536").End(xlUp).Row Nummerplader = Range("A1:A" & RW) For I = 1 To RW If Nummerplader(I, 1) = Me.TextBox1.Text Then MsgBox " Nummeret eksisterer på række " & I Exit Sub End If Next
Svar = MsgBox(" nummeret er ikke fundet" & vbCrLf _ & " skal det tilføjes ", vbYesNo) If Svar = vbYes Then
End If Range("A65536").End(xlUp).Offset(1, 0) = Me.TextBox1.Text
-> Kabbak: Det ser meget ud som det jeg søger. Jeg afprøver den senere i dag. Et afklarende spørgsmål: Hvornår bruger man me.textbox1.text og hvornår bruger man textbox1.text. mao. hvilken funktion har me? mvh. Hubertus
me deklarerer bare at tekstboksen er på selve formlen, altså me=på mig selv. Som regel er det nok at udelukke me, men det er sikrest, altid først at skrive me.
Fordelen er også at så snart du skriver me. findes alle objekter på formen, og medtages i dine valg.
Hej igen - tilbage fra the big blue - derfor min passivitet. -> Kabbak din koden virker perfekt. jeg er siden blevet stillet spørgsmålet om det er muligheden for at håndtere to inputmasker: et som den hidtidige dk xx.xxx og et som ser således ud. dkdk 1234. Det første er et alm. bilnummer mens den sidste er et transportnummer. Kan det indholdes i samme felt, eller er jeg nødt til at lave et nyt indtastningsfelt? mvh. Hubertus
Private Sub Cmd_Søg_Click() Dim RW As Long, I As Long, Nummerplader As Variant, Svar As String RW = Range("A65536").End(xlUp).Row Nummerplader = Range("A1:A" & RW) For I = 1 To RW If Nummerplader(I, 1) = Me.TextBox1.Text Then MsgBox " Nummeret eksisterer på række " & I Exit Sub End If Next
Svar = MsgBox(" nummeret er ikke fundet" & vbCrLf _ & " skal det tilføjes ", vbYesNo) If Svar = vbYes Then Range("A65536").End(xlUp).Offset(1, 0) = Me.TextBox1.Text End If End Sub
Dit sidste spørgsmål on dkdk1234, skal det stå i samme celle som nummerpladen eller har det sit egen celle. Hvis det har sin egen skal du lave en anden tekstboks.
Vil de sige at du både har bilnummer og transportnummer i samme kolonne, de koder du har fået bruger samme kollonne, så de er ikke nemme at genbruge, hvis de står i 2 forskellige kollonner.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Chr(8) Then ' BACKSPACE Else If Bil = True Then
If Len(Me.TextBox1.Text) = 2 Then If IsNumeric(Left(TextBox1.Text, 1)) Or IsNumeric(Mid(TextBox1.Text, 2, 1)) Then MsgBox " De 2 første tegn, skal være bogstaver" Me.TextBox1.Text = Me.TextBox1.Text & " " End If If Len(Me.TextBox1.Text) > 3 Then If Not IsNumeric(Mid(Me.TextBox1.Text, 4, Len(Me.TextBox1.Text) - 3)) Then MsgBox " De 2 første tegn, skal være bogstaver, resten tal" End If End If
Else
If Len(Me.TextBox1.Text) = 4 Then If IsNumeric(Left(TextBox1.Text, 1)) Or IsNumeric(Mid(TextBox1.Text, 2, 1)) _ Or IsNumeric(Mid(TextBox1.Text, 3, 1)) Or IsNumeric(Mid(TextBox1.Text, 4, 1)) _ Then MsgBox " De 4 første tegn, skal være bogstaver" Me.TextBox1.Text = Me.TextBox1.Text & " " End If If Len(Me.TextBox1.Text) > 5 Then If Not IsNumeric(Mid(Me.TextBox1.Text, 6, Len(Me.TextBox1.Text) - 5)) Then MsgBox " De 4 første tegn, skal være bogstaver, resten tal" End If End If
End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) End If End Sub
-> Kabak - koden virker ikke helt efter hensigten, da den fokucere på 4 bogstaver + 3 tal (burde være 4). Hvis jeg forsøger at indtaste 2 bogstaver + 5 tal, så får jeg en meddelelse om at de 4 første skal være bogstaver. Hvis jeg derimod indtaster 4 bogstaver og 3 tal, så virker den perfekt. Kan du gennemskue årsagen?
-> der var lige en detalje som jeg havde overset, så nu virker det :-) Er det muligt at ændre koden lidt, således at følgende situation undgås:
der er valg bil brugeren får ved en fejl indtastet 3 bogstaver. Ved det fjerde bogstav kommer en boks med en fejltekst. I tekstboksen står nu de 4 bogstaver parvis.
Det ville være fint, hvis et tryk på ok, samtidig slettede de to sidste bogstaver, således at cursoren stod i den første position, hvori der skal indtastes tal.
Det er ikke muligt i den funktion koden kører(KeyPress), den kører nemelig inden tegnet er kommet ind i tekstboksen. KeyPress er når tasten er trykket ned og ikke sluppet endnu, så det sidste tegn, hænger så at sige i luften,
Ok jeg har prøvet her og fordelt koden i 2 events.
Private Sub TextBox1_Change() If Bil Then If Len(Me.TextBox1.Text) > 3 Then If Not IsNumeric(Mid(Me.TextBox1.Text, 4, Len(Me.TextBox1.Text) - 3)) Then MsgBox " De 2 første tegn, skal være bogstaver, resten tal" Me.TextBox1.Text = Left(Me.TextBox1.Text, 3) End If End If Else If Len(Me.TextBox1.Text) > 5 Then If Not IsNumeric(Mid(Me.TextBox1.Text, 6, Len(Me.TextBox1.Text) - 5)) Then MsgBox " De 4 første tegn, skal være bogstaver, resten tal" Me.TextBox1.Text = Left(Me.TextBox1.Text, 5) End If End If End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) End Sub Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Chr(8) Then ' BACKSPACE Else If Bil = True Then If Len(Me.TextBox1.Text) = 2 Then If IsNumeric(Left(TextBox1.Text, 1)) Or IsNumeric(Mid(TextBox1.Text, 2, 1)) Then MsgBox " De 2 første tegn, skal være bogstaver" Me.TextBox1.Text = Me.TextBox1.Text & " " End If Else If Len(Me.TextBox1.Text) = 4 Then If IsNumeric(Left(TextBox1.Text, 1)) Or IsNumeric(Mid(TextBox1.Text, 2, 1)) _ Or IsNumeric(Mid(TextBox1.Text, 3, 1)) Or IsNumeric(Mid(TextBox1.Text, 4, 1)) _ Then MsgBox " De 4 første tegn, skal være bogstaver" Me.TextBox1.Text = Me.TextBox1.Text & " " End If End If End If End Sub
Private Sub TextBox1_Change() If Bil Then ' Bilkoden If Len(Me.TextBox1.Text) > 3 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 3 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 2 første tegn, skal være bogstaver, resten tal" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 2 første tegn, skal være bogstaver" ' Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If Else ' Trailer koden If Len(Me.TextBox1.Text) > 5 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 5 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 4 første tegn, skal være bogstaver, resten tal" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then MsgBox " De 4 første tegn, skal være bogstaver" ' Tjekker om resten er tal Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) ' Lavet teksten til store bogstaver End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Chr(8) Then ' BACKSPACE, for at kunne slette i tekstboksen Else If Bil = True Then ' OptionButten bil er afmærket If Len(Me.TextBox1.Text) = 2 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 2 bogstaver End If Else ' OptionButten bil er ikke afmærket If Len(Me.TextBox1.Text) = 4 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 4 bogstaver End If End If End If End Sub
Private Sub TextBox1_Change() If Bil Then ' Bilkoden If Len(Me.TextBox1.Text) > 3 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 2 første tegn, skal være bogstaver, resten tal" 'Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 3 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 2 første tegn, skal være bogstaver" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If Else ' Trailer koden If Len(Me.TextBox1.Text) > 5 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 4 første tegn, skal være bogstaver, resten tal" 'Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 5 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 4 første tegn, skal være bogstaver" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) ' Lavet teksten til store bogstaver End Sub
If KeyAscii = Chr(8) Then ' BACKSPACE, for at kunne slette i tekstboksen Else If Bil = True Then ' OptionButten bil er afmærket If Len(Me.TextBox1.Text) = 2 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 2 bogstaver End If Else ' OptionButten bil er ikke afmærket If Len(Me.TextBox1.Text) = 4 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 4 bogstaver End If End If End If End Sub
Private Sub TextBox1_Change() If Bil Then ' Bilkoden If Len(Me.TextBox1.Text) > 3 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 2 første tegn, skal være bogstaver, resten tal" 'Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 3 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 2 første tegn, skal være bogstaver" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If Else ' Trailer koden If Len(Me.TextBox1.Text) > 5 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 4 første tegn, skal være bogstaver, resten tal" 'Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 5 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 4 første tegn, skal være bogstaver" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) ' Lavet teksten til store bogstaver End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Chr(8) Then ' BACKSPACE, for at kunne slette i tekstboksen Else If Bil = True Then ' OptionButten bil er afmærket If Len(Me.TextBox1.Text) = 2 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 2 bogstaver End If Else ' OptionButten bil er ikke afmærket If Len(Me.TextBox1.Text) = 4 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 4 bogstaver End If End If End If End Sub
Hej Kabbak - det er bare superflot arbejde - respekt for det! :-) Hvor sætter du længen af indtastningsfeltet i textboxen? i trailerdelen er der nemlig kun mulighed for 4 bogstaver og 3 tal, og der skal være 4 bogstaver og 4 tal.
Kan man i bildelen få indsat et punktum eller et mellemrum i taldelen, således at formatet er UM 23 345? (for læsevenlighedens skyld) mvh. hubertus
Hej igen - jeg har fundet længden af feltet under egenskaben max længden, så hvis du kan løse sidste del af spørgsmålet ang. bildelen er jeg en glad mand :-)
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Chr(8) Then ' BACKSPACE, for at kunne slette i tekstboksen Else If Bil = True Then ' OptionButten bil er afmærket If Len(Me.TextBox1.Text) = 2 or Len(Me.TextBox1.Text) = 5 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 2 bogstaver og igen efter 2 tal End If Else ' OptionButten bil er ikke afmærket If Len(Me.TextBox1.Text) = 4 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 4 bogstaver End If End If End If End Sub
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = Chr(8) Then ' BACKSPACE, for at kunne slette i tekstboksen Else If Bil = True Then ' OptionButten bil er afmærket If Len(Me.TextBox1.Text) = 2 Or Len(Me.TextBox1.Text) = 5 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 2 bogstaver og igen efter 2 tal End If Else ' OptionButten bil er ikke afmærket If Len(Me.TextBox1.Text) = 4 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 4 bogstaver End If End If End If End Sub
- den sidste kode virker ikke efter hensigten. Når jeg taster tal nr. 3, så kommer msgboxen med følgende: De 2 første tegn, skal være bogstaver, resten tal". trykkes ok indsættes det tal, som udløste msgboxen, hvorefter man kan indtaste resten. - men der indsættes ingen mellemrum.
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = Chr(8) Then ' BACKSPACE, for at kunne slette i tekstboksen Else If Bil = True Then ' OptionButten bil er afmærket If Len(Me.TextBox1.Text) = 2 Or Len(Me.TextBox1.Text) = 5 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 2 bogstaver og igen efter 2 tal End If Else ' OptionButten bil er ikke afmærket If Len(Me.TextBox1.Text) = 4 Then Me.TextBox1.Text = Me.TextBox1.Text & " " ' Sætter et mellemrum efter de 4 bogstaver End If End If End If End Sub Private Sub TextBox1_Change() If Bil Then ' Bilkoden If Len(Me.TextBox1.Text) > 3 And Len(Me.TextBox1.Text) <> 6 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 2 første tegn, skal være bogstaver, resten tal" 'Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 3 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 2 første tegn, skal være bogstaver" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If Else ' Trailer koden If Len(Me.TextBox1.Text) > 5 Then If Not IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker om resten er tal MsgBox " De 4 første tegn, skal være bogstaver, resten tal" 'Hvis ikke tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If Else If IsNumeric(Right(TextBox1.Text, 1)) Then ' Tjekker at de 5 første tegn er tekst(Mellemrummet) tælles med MsgBox " De 4 første tegn, skal være bogstaver" ' Hvis tal så besked Me.TextBox1.Text = Left(Me.TextBox1.Text, Len(Me.TextBox1.Text) - 1) ' sletter det forkert intastede End If End If End If Me.TextBox1.Text = UCase(Me.TextBox1.Text) ' Lavet teksten til store bogstaver End Sub
et lille tillægsspørgsmål til ovenstående. Længden af textboxen, hvori bilnummeret indtastes kan sættes i egenskaber for tekstboxen i feltet maxlength. Kan jeg via en kode bestemme længden? mvh. Hubertus
Husk at gøre det ved start af Userform, ellers kan man nå at skrive flere tegn.
Synes godt om
Ny brugerNybegynder
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.