• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Probleem met datum notatie

Status
Niet open voor verdere reacties.

A4papiertje

Gebruiker
Lid geworden
24 nov 2015
Berichten
20
Goedemiddag,

Ik ben bezig met een bestand dat een datum maakt van een notatie met . en ,

Nu heb ik de volgende code gebruikt:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Object
Dim rRng As Range
Set rRng = Range("B13:B19")

For Each rCell In rRng.Cells
    With rCell
        Select Case InStr(1, .Value, ".")
            Case Is > 0
                Target = Replace(Target, ".", "-")
        End Select
        Select Case InStr(1, .Value, ",")
            Case Is > 0
                Target = Replace(Target, ",", "-")
        End Select
    End With
Next rCell

Range("B11:B19").NumberFormat = "d/mm/yy;@"
Range("B11:B19").HorizontalAlignment = xlRight
End Sub

Werkt niet helemaal goed, als ik bijvoorbeeld 31.12.2016 intyp dan is dit niet gelijk aan 31-12-2016 (Geeft dit wel weer in excel maar krijgt niet die waarde). Als ik vervolgens de cel activeer (Dubbelklik) en enter doe, springt hij wel naar de goede datum... Wat doe ik verkeerd?

(zie bijlage)
 

Bijlagen

  • Datumprobleem.xlsm
    14,7 KB · Weergaven: 36
Probeer het eens zo:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Object
Dim rRng As Range
Set rRng = Range("B13:B19")

Application.EnableEvents = False
For Each rCell In rRng.Cells
    With rCell
        Select Case InStr(1, .Value, ".")
            Case Is > 0
                Target = DateValue(Replace(Target, ".", "-"))
        End Select
        Select Case InStr(1, .Value, ",")
            Case Is > 0
                Target = DateValue(Replace(Target, ",", "-"))
        End Select
    End With
Next rCell

Range("B11:B19").NumberFormat = "d/mm/yy;@"
Range("B11:B19").HorizontalAlignment = xlRight
Application.EnableEvents = True
End Sub
 
Het veld wordt tekst (ook al wijzig je later het formaat naar een datumformaat, dan blijft het gewoon tekst).
Gebruik cdate: Target = cdate(Replace(Target, ",", "-"))

Edit: cdate is vergelijkbaar met datevalue
 
Iets korter werkt volgens mij ook.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B13:B19")) Is Nothing And Target.Count = 1 Then
    Application.EnableEvents = False
    Target.Value = CDate(Replace(Replace(Target, ".", "-"), ",", "-"))
    Target.NumberFormat = "d/mm/yy;@"
    Application.EnableEvents = True
End If
End Sub
 
Iets korter werkt volgens mij ook.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B13:B19")) Is Nothing And Target.Count = 1 Then
    Application.EnableEvents = False
    Target.Value = CDate(Format(Replace(Replace(Target, ".", "-"), ",", "-"), "d/mm/yy"))
    Application.EnableEvents = True
End If
End Sub
 
Nog een kleine aanpassing indien mogelijk, als ik 01122015 invoer, zou het dan mogelijk zijn om 01-12-2015 als uitvoer te krijgen (Uiteraard ook als datum instelling). Ik kom er niet uit.

Code:
If Len(Target) = 8 Then
    Target = CDate(Format(Left(Target, 2) & "-" & Left(Right(Target, 6), 2) & "-" & Right(Target, 4), "d/mm/yy"))
End If

Eventueel zou het ook mooi zijn dat 011215, 11215, 1122015 ook 01-12-2015 wordt, maar ik vermoed dat dat onmogelijk is.
 
Je maakt me wel nieuwsgierig waar dit allemaal goed voor is.
Waarom niet gewoon een datumveld zonder achterliggende macro?
Dan hoef je ook niet zoveel in te typen, bijvoorbeeld als je 1-12 intypt, dan komt er keurig 01-12-2015 te staan (bij datumformaat dd-mm-jjjj en zolang we in 2015 leven).
En voor de datum van vandaag kun je volstaan met Ctrl+; .

Wat je wilt, is volgens mij niet mogelijk. Je zou je veld nog als tekst kunnen definiëren zodat je 01122015 kunt intypen en er dan met een macro een datumveld van maken.
Maar dat werkt maar 1 keer, omdat dan de tekstopmaak weg is.

Overigens zou 11215 in jouw voorbeeld zowel 11-2-2015 als 1-12-2015 kunnen betekenen.
 
Laatst bewerkt:
Je maakt me wel nieuwsgierig waar dit allemaal goed voor is.
Waarom niet gewoon een datumveld zonder achterliggende macro?
Dan hoef je ook niet zoveel in te typen, bijvoorbeeld als je 1-12 intypt, dan komt er keurig 01-12-2015 te staan (bij datumformaat dd-mm-jjjj en zolang we in 2015 leven).
En voor de datum van vandaag kun je volstaan met Ctrl+; .

Binnen de organisatie is mij gevraagd om een bestand te maken waarin tijden en data kan worden ingevuld zodat aan de hand hiervan wat kan worden berekend. Ik probeer daar nu de veelgemaakte fouten uit te halen zodat het bestand niet in de soep loopt.

Wat je wilt, is volgens mij niet mogelijk. Je zou je veld nog als tekst kunnen definiëren zodat je 01122015 kunt intypen en er dan met een macro een datumveld van maken.
Maar dat werkt maar 1 keer, omdat dan de tekstopmaak weg is.

Overigens zou 11215 in jouw voorbeeld zowel 11-2-2015 als 1-12-2015 kunnen betekenen.

Dat dacht ik inderdaad ook al, helaas.
 
Misschien kun je nog wat doen met data validatie: dat biedt mogelijkheden om op datum / tijd te valideren.
 
Als je eerst de opmaak op standaard zet en je acht cijfers typt (01012015) kan zo.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B13:B19")) Is Nothing And Target.Count = 1 Then
  Application.EnableEvents = False
    If Not IsEmpty(Target) Then Target.NumberFormat = "00\/00\/0000"  'of: 00\-00\-0000"
  Application.EnableEvents = True
End If
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan