Avatar billede Gramstrup Mester
06. januar 2018 - 09:23 Der er 10 kommentarer og
1 løsning

VBA til Dato input i excel

Hejsa
Jeg har lavet en userform hvor brugeren skal indtaste forskellige værdier. Iet af felterne skal de taste en dato i formatet DDMMÅÅÅÅ hvordan tvinger jeg dem til det og sikre mig at de ikke får tastet et andet format ind.
Det er vigtigt fordi jeg skal arbejde videre med dataene andet sted.

Jeg bruger følgende VBA til at sikre mig at de kommer nogen info i. Men jeg kan ikke få den til at sikre at det er en dato.

If Me.TextBox4 = "" Then
    MsgBox "Du skal indtaste ønskede leverings dato", , "CBP manglende salgsregistrering"
    Me.TextBox4.SetFocus
    Exit Sub
    End If
Avatar billede finb Ekspert
06. januar 2018 - 10:14 #1
1. Du kunne lave 3 Inputboxe (1 til dag, 1 til måned, 1 til år) med hver sin datavalidering.
2. Du kunne køre CDATE på det vilkårligt indtastede
3. Du kunne lave en inputbox EFTER deres indtastning,
  hvor du spørger:
"Mener du DDMMÅÅÅÅ, tast 1
"Mener du ÅÅÅÅMMDD, tast 2
osv.osv.
Avatar billede Jan Hansen Ekspert
06. januar 2018 - 10:23 #2
noget i stil med

private sub textbox4_chance()
      if len(textbox4.value)=2 then textbox4.value=textbox4.value & "-"
      if len(textbox4.value)=5 then textbox4.value=textbox4.value & "-"

end sub
private sub textbox4_exit()
      If not len(textbox4.value)=10 Then msgbox "Ikke gyldig dato"
      textbox4.value=format(textbox4.value,"ddmmyyyy")
end sub

ej testet

Jan
Avatar billede finb Ekspert
06. januar 2018 - 10:32 #3
Eller du kunne lave en LOOP,
der siger
msgbox "Indtast kun DDMMÅÅÅÅ"
indtil det indtastede faktisk er DDMMÅÅÅÅ.
Avatar billede excelent Ekspert
06. januar 2018 - 11:58 #4
Private Sub TextBox4_Change()

If TextBox4 Like "*[!0-9]" Or Len(TextBox4) > 8 Then Beep: TextBox4 = Left(TextBox4, Len(TextBox4) - 1)

If Val(Left(TextBox4, 1)) < 0 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1 tal i dag min 0
If Val(Mid(TextBox4, 2, 1)) < 0 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) 'andet tal i dag min 0
If Val(Left(TextBox4, 1)) > 3 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1 tal i dag max 3
If Val(Left(TextBox4, 2)) > 31 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1&2 tal i dag max 31

'Lav selv minimums krav for måned og år og ret evt. kravene til dine forhold

If Val(Mid(TextBox4, 3, 1)) > 1 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1 tal i måned max 1
If Val(Mid(TextBox4, 3, 2)) > 12 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1&2 tal i måned max 12

If Val(Mid(TextBox4, 5, 1)) > 2 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) ' første tal i år max 2
If Val(Mid(TextBox4, 5, 2)) > 20 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) ' første 2 tal i år max 20
If Val(Mid(TextBox4, 5, 3)) > 201 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) ' første 3 tal i år max 201
If Val(Mid(TextBox4, 5, 4)) > 2019 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) ' 4 tal i år max 2019


End Sub
Avatar billede store-morten Ekspert
06. januar 2018 - 14:27 #5
Prøv:

If IsDate(TextBox4) = False Then
    MsgBox "Feltet bliver slettet.", , "Ikke en Dato!!"
    TextBox4 = ""
    Exit Sub
End If
    dDate = DateSerial(Year(Date), Month(Date), Day(Date))
    TextBox4.Value = Format(TextBox4.Value, "dd/mm/yyyy")
    dDate = TextBox4.Value
Avatar billede Gramstrup Mester
06. januar 2018 - 15:20 #6
Det var lige præcis den kode jeg manglede  store-morten. Takker.
Avatar billede store-morten Ekspert
06. januar 2018 - 19:19 #7
Velbekomme, prøv om du kan undvære 2 linier:
If IsDate(TextBox1) = False Then
    MsgBox "Feltet bliver slettet.", , "Ikke en Dato!!"
    TextBox1 = ""
    Exit Sub
End If
    TextBox1.Value = Format(TextBox1.Value, "dd/mm/yyyy")
Avatar billede finb Ekspert
07. januar 2018 - 10:41 #8
Ad #5 og #6:
Men
IsDate(050607)
og
IsDate(070605)
giver begge True,
uden at vi kender datoen.
Avatar billede store-morten Ekspert
07. januar 2018 - 12:50 #9

If IsDate(TextBox1) = False Or Len(TextBox1.Value) < 10 Then
    MsgBox "Indtast dato som: dd-mm-åååå" _
    + vbLf + vbLf + _
    "Feltet bliver slettet.", , "Ikke en Dato!!"
    TextBox1 = ""
    Exit Sub
End If
    TextBox1.Value = Format(TextBox1.Value, "dd/mm/yyyy")
Avatar billede finb Ekspert
08. januar 2018 - 09:27 #10
#9 også udmærket, men det sikrer stadig ikke indtasters syntaks.
Jeg skal ikke have ret, men kombiner 3 inputboxe:
Box 1 tillader ÅR: LEN=4 og INT og defineret MIN-MAX årstal.
Box 2 tillader MD: LEN=2 og INT og defineret MIN-MAX 1-12.
Box 3 tillader DG: LEN=2 og INT og defineret MIN-MAX 1-31.
Kør DateSerial på det.
Avatar billede store-morten Ekspert
08. januar 2018 - 19:07 #11
En kombi løsning:
Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 8 Then 'Kun tal og backspace
    If KeyAscii = 8 Then 'Hvis backspace, ignoreres + "-"
    Else
        If TextBox4.TextLength = 10 Then 'Begrænser textbox til 10 karaktere
        KeyAscii = 0
        Else
            If TextBox4.TextLength = 2 Or TextBox4.TextLength = 5 Then 'Tilføjer - automatisk
            TextBox4.Text = TextBox4.Text + "-"
            End If
        End If
    End If
Else
KeyAscii = 0
End If
End Sub

Private Sub TextBox4_Change()
'Dag
If Val(Left(TextBox4, 1)) < 0 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1 tal i dag min 0
If Val(Mid(TextBox4, 2, 1)) < 0 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) 'andet tal i dag min 0
If Val(Left(TextBox4, 1)) > 3 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1 tal i dag max 3
If Val(Left(TextBox4, 2)) > 31 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1&2 tal i dag max 31
'Måned
If Val(Mid(TextBox4, 4, 1)) > 1 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1 tal i måned max 1
If Val(Mid(TextBox4, 4, 2)) > 12 Then TextBox4 = Left(TextBox4, Len(TextBox4) - 1) '1&2 tal i måned max 12

End Sub

Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Tjekker er dato
If IsDate(TextBox4) = False Then
    MsgBox "Indtast dato som: ddmmåååå" _
    + vbLf + vbLf + _
    "Feltet bliver slettet.", , "Ikke en Dato!!"
    TextBox4 = ""
    Exit Sub
End If
    TextBox4.Value = Format(TextBox4.Value, "dd/mm/yyyy")
End Sub
Indtast kun tal, bindestreg tilføjes automatisk.
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