11. marts 2011 - 22:41Der er
11 kommentarer og 1 løsning
indtaste dato i celle UDEN bindestreger
I kolonne A indtaster jeg en masse datoer ind. Jeg har nedenstående kode, som laver binde streger.
Men jeg vil gerne have koden til at være mere specifik. Den skal sikre at det altid er en dato man skriver. I Sheet1 har jeg navn givet felterne "dato_fra" og "dato_til" I disse celler står der f.eks 01-01-2011 og 31-12-2011
Koden skal så teste om den indtastede dato ligger mellem disse to datoer. Hvis ikke, skal cellen "tømmes" og der skal komme en popup, med at det er en ulovlig dato.
Dvs at man ikke må kunne taste andet end dato i et given interval i cellen.
Er der nogen der kan knække den?
Min kode som virker.....
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1:A100")) Is Nothing Then If Not IsNumeric(Target.Value) Then Exit Sub Application.EnableEvents = False Select Case Len(Target.Value) Case 6 Target.Value = Left(Target.Value, 2) & "-" & Mid(Target.Value, 3, 2) & "-20" & Right(Target.Value, 2)
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1:A100")) Is Nothing Then If Not IsNumeric(Target.Value) Then Exit Sub Application.EnableEvents = False Select Case Len(Target.Value) Case 6 Target.Value = Left(Target.Value, 2) & "-" & Mid(Target.Value, 3, 2) & "-20" & Right(Target.Value, 2) If Target.Value >= Sheets("sheet1").Range("dato_fra") And Target.Value <= Sheets("sheet1").Range("dato_fra") Then Exit Sub Else: MsgBox ("Fejl") End If
Case 8 Target.Value = Left(Target.Value, 2) & "-" & Mid(Target.Value, 3, 2) & "-" & Right(Target.Value, 4) Selection.NumberFormat = "mm/dd/yyyy" If Target.Value >= Sheets("sheet1").Range("dato_fra") And Target.Value <= Sheets("sheet1").Range("dato_fra") Then Exit Sub Else: MsgBox ("Fejl") End If End Select Application.EnableEvents = True End If End Sub
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Løsning med kode: Noter dig i øvrigt, at denne har en Case 5 med også, da 010611 omdannes i cellen til 10611..!
Private Sub Worksheet_Change(ByVal Target As Range) Dim sDateString As String If Not Intersect(Target, Range("A1:A100")) Is Nothing Then If Not IsNumeric(Target.Value) Then Exit Sub Application.EnableEvents = False Select Case Len(Target.Value) Case 5: sDateString = "0" & Left(Target.Value, 1) & "-" & Mid(Target.Value, 2, 2) & "-20" & Right(Target.Value, 2) Case 6: sDateString = Left(Target.Value, 2) & "-" & Mid(Target.Value, 3, 2) & "-20" & Right(Target.Value, 2) Case 8: sDateString = Left(Target.Value, 2) & "-" & Mid(Target.Value, 3, 2) & "-" & Right(Target.Value, 4) End Select If IsDate(sDateString) Then If CDate(sDateString) >= CDate("01-01-2011") And CDate(sDateString) <= CDate("31-12-2011") Then Target.Value = sDateString Else Target.Value = "" End If Else Target.Value = "" End If Application.EnableEvents = True End If End Sub
Nu har jeg siddet og testet på smartoffices kode. Umiddelbart virker den fint, men efter nogle forskellige test fandt jeg nogle fejl.
Jeg har prøvet på 2 forskellige pcer og med henholdsvis excel 2007 dansk og office 2010 engelsk.
Når jeg skriver 101211 bliver det til 12-10-2011 Når jeg skriver 121211 bliver det rigtigt nok til 12-12-2011 osv.
Men når jeg så har tastet nogle forskellige forsøg ind, går koden lidt berserk på min pc. Feks bliver 51211 til 16-03-2040 og 121211 til 11-11-2031.
Er det kun hos mig den fejl kommer?
Iøvrigt må den meget gerne lave en msgbos med Fejl i dato, hvis datoen ikke ligger inde for lovligt interval.
Til Excellent Det er en god popup, men da jeg taster mange linjer ind med datoer i, vil jeg gerne have så let en indtastning som muligt og helst helt uden mus.
Der er flere problemer med koden, når nu vi kommer til det - hvis du indtaster 101212 og Excel selv laver det om til 07-02-2177 fordi cellen forventer en dato, så fejler koden også, så der er flere ting der skal justeres, for at det virker perfekt
Nu er koden forbedret, således 101212 bliver ulovlig og 101111 bliver lovlig samt at det tillades at indtaste 10-11-11 også, hvis en bruger skulle vælge at gøre det.
Private Sub Worksheet_Change(ByVal Target As Range) Dim sDateString As String If Not Intersect(Target, Range("A1:A100")) Is Nothing Then If Not IsNumeric(Target.Value) Then If Not IsDate(Target.Value) Then Exit Sub If Target.Value >= CDate("01-01-2011") And Target.Value <= CDate("31-12-2011") Then Exit Sub sDateString = CLng(Target.Value) Else sDateString = Target.Value End If
Application.EnableEvents = False Select Case Len(sDateString) Case 5: sDateString = "0" & Left(sDateString, 1) & "-" & Mid(sDateString, 2, 2) & "-20" & Right(sDateString, 2) Case 6: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-20" & Right(sDateString, 2) Case 8: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-" & Right(sDateString, 4) End Select If IsDate(sDateString) Then If CDate(sDateString) >= CDate("01-01-2011") And CDate(sDateString) <= CDate("31-12-2011") Then Target.Value = CDate(sDateString) Else MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation" Target.Value = "": Target.Select End If Else MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation" Target.Value = "": Target.Select End If Application.EnableEvents = True End If End Sub
Jep, det var meget bedre. Jeg har selv forsøgt at rette i koden, således den laver popup, på hvad der ikke er en dato. Feks. en tekst. Det virker umiidelbart, men popup´en kommer 2 gange. Kan jeg få det sidste fif med, så den kun kommer med en poup ?
Private Sub Worksheet_Change(ByVal Target As Range) Dim sDateString As String If Not Intersect(Target, Range("A1:A100")) Is Nothing Then If Not IsNumeric(Target.Value) Then If Not IsDate(Target.Value) Then GoTo forkertdato If Target.Value >= CDate("01-01-2011") And Target.Value <= CDate("31-12-2011") Then Exit Sub sDateString = CLng(Target.Value) Else sDateString = Target.Value End If
Application.EnableEvents = False Select Case Len(sDateString) Case 5: sDateString = "0" & Left(sDateString, 1) & "-" & Mid(sDateString, 2, 2) & "-20" & Right(sDateString, 2) Case 6: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-20" & Right(sDateString, 2) Case 8: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-" & Right(sDateString, 4) End Select If IsDate(sDateString) Then If CDate(sDateString) >= CDate("01-01-2011") And CDate(sDateString) <= CDate("31-12-2011") Then Target.Value = CDate(sDateString) Else Target.Value = "": Target.Select MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation"
End If Else Target.Value = "": Target.Select MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation"
End If Application.EnableEvents = True End If Exit Sub
forkertdato: Target.Value = "": Target.Select MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation" End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim sDateString As String If Not Intersect(Target, Range("A1:A100")) Is Nothing Then If Not IsNumeric(Target.Value) Then If Not IsDate(Target.Value) Then GoTo errDate If Target.Value >= CDate("01-01-2011") And Target.Value <= CDate("31-12-2011") Then Exit Sub sDateString = CLng(Target.Value) Else sDateString = Target.Value End If
Application.EnableEvents = False Select Case Len(sDateString) Case 5: sDateString = "0" & Left(sDateString, 1) & "-" & Mid(sDateString, 2, 2) & "-20" & Right(sDateString, 2) Case 6: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-20" & Right(sDateString, 2) Case 8: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-" & Right(sDateString, 4) End Select If IsDate(sDateString) Then If CDate(sDateString) >= CDate("01-01-2011") And CDate(sDateString) <= CDate("31-12-2011") Then Target.Value = CDate(sDateString) Else GoTo errDate End If Else GoTo errDate End If Application.EnableEvents = True End If
Exit Sub errDate: MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation" Target.Value = "": Target.Select Application.EnableEvents = True End Sub
Teknisk forbedring... nu står der ikke 2011 eller 20 nogle steder, hvorfor et årskifte er ligegyldigt.
Private Sub Worksheet_Change(ByVal Target As Range) Dim sDateString As String, sCurYear As String If Not Intersect(Target, Range("A1:A100")) Is Nothing Then sCurYear = Year(Now()) If Not IsNumeric(Target.Value) Then If Not IsDate(Target.Value) Then GoTo errDate If Target.Value >= CDate("01-01-" & sCurYear) And Target.Value <= CDate("31-12-" & sCurYear) Then Exit Sub sDateString = CLng(Target.Value) Else sDateString = Target.Value End If
Application.EnableEvents = False Select Case Len(sDateString) Case 5: sDateString = "0" & Left(sDateString, 1) & "-" & Mid(sDateString, 2, 2) & "-" & Left(sCurYear, 2) & Right(sDateString, 2) Case 6: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-" & Left(sCurYear, 2) & Right(sDateString, 2) Case 8: sDateString = Left(sDateString, 2) & "-" & Mid(sDateString, 3, 2) & "-" & Right(sDateString, 4) End Select If IsDate(sDateString) Then If sDateString >= CDate("01-01-" & sCurYear) And sDateString <= CDate("31-12-" & sCurYear) Then Target.Value = CDate(sDateString) Else GoTo errDate End If Else GoTo errDate End If Application.EnableEvents = True End If
Exit Sub errDate: MsgBox "Ulovlig dato!" & vbCrLf & vbCrLf & "Indtast en ny dato", vbCritical + vbOKOnly, "Systeminformation" Target.Value = "": Target.Select Application.EnableEvents = True End Sub
Det er godt nok længe siden jeg har lavet et nyt tip, men nu blev det alligevel til et.
Den er udvidet yderligere, således der kan indtastes 1-8 cifre og det giver en dato. F.eks. er det marts år 2011 - skrives der så 5 i en celle bliver dato'en 05-03-2011.
Mange tak for koden. Den vil helt sikkert lette min hverdag.
Den kommer godt nok stadig med 2 ens popups, hvis man ikke skriver et tal, men kommer til at skrive bogstaver i cellen, men det er kun en mindre detalje :-)
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.