Avatar billede mrkr Juniormester
11. marts 2011 - 22:41 Der 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)
             
            Case 8
                Target.Value = Left(Target.Value, 2) & "-" & Mid(Target.Value, 3, 2) & "-" & Right(Target.Value, 4)
               
        End Select
        Application.EnableEvents = True
    End If
   
End Sub



Her er mit forsøg på at tilrette, uden held...

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
12. marts 2011 - 07:49 #1
Den kan knækkes uden kode...

Data - Data Validation
Allow: Date
Data: between
Start date: 01-01-2011
End date: 31-12-2011
12. marts 2011 - 08:01 #2
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
Avatar billede excelent Ekspert
12. marts 2011 - 10:33 #3
Måske en popup kalender kunne være en løsning:

http://pmexcelent.dk/Kalender.xls
Avatar billede mrkr Juniormester
14. marts 2011 - 16:13 #4
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 noget der ikke
14. marts 2011 - 16:59 #5
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
14. marts 2011 - 17:11 #6
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
Avatar billede mrkr Juniormester
14. marts 2011 - 18:43 #7
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
14. marts 2011 - 18:49 #8
Prøv denne her:

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
14. marts 2011 - 18:55 #9
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
14. marts 2011 - 20:07 #10
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.

http://www.smartoffice.dk/Tips/LibrarySource.asp?App=Excel&Lib=EnterShortDates

God fornøjelse
Avatar billede mrkr Juniormester
14. marts 2011 - 23:14 #11
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 :-)
15. marts 2011 - 08:17 #12
Sæt dette ind

Application.EnableEvents = False

på linien imellem errDate:  og  MsgBox ...
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
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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