• 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.

Macro tijdinvoer

Status
Niet open voor verdere reacties.

A4papiertje

Gebruiker
Lid geworden
24 nov 2015
Berichten
20
Goedemorgen,

Ik ben bezig met het bouwen van een macro code om een . te vervangen door : bij invoer in een bepaald bereik.
De behoefte naar de macro is om tijden snel in te kunnen voeren met het toetsenbord, het is immers niet gemakkelijk om steeds de : in te voeren.
Ik ben bezig geweest met de code maar het lukt me niet deze waterdicht te krijgen.
Bij een aantal waarden gaat het goed bijvoorbeeld als ik 2.25 invoer komt er 2:25 maar als ik 2.00 invoer springt de cel naar een datum notatie en geeft hij niet 2:00 weer.

Hierbij de code en het bestand, zouden jullie willen helpen?

Alvast bedankt!

Code:
Private Sub Worksheet_Change(ByVal target As Range)
On Error Resume Next
If Intersect(target, Range("C13:F19")) Is Nothing Then GoTo Einde
If IsEmpty(target) Then GoTo Einde

Range("C13:F19").NumberFormat = "h:mm"

If Len(target) > 0 Then
    If (Right(target, 3) = ",00") Or (Right(target, 3) = ".00") Then
        target = (Left(target, 1) & ":" & "00:00")
    ElseIf Len(target) = 4 Then
        target = (Left(target, 1) & ":" & Right(target, 2))
    ElseIf Len(target) = 5 Then
        target = (Left(target, 2) & ":" & Right(target, 2))
    With Columns(1)
        .NumberFormat = "h:mm"
        .Replace What:=",", Replacement:=":", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=True
    End With
    Else
    End If
ElseIf Len(target) = 0 Then
Else
    MsgBox ("Graag juiste tijd invullen")
End If

Einde:
ActiveSheet.Calculate
End Sub

Bekijk bijlage Macro punt in tijd test.xlsm
 
Die was ik inderdaad al tegen gekomen, echter deze zet bij een invoer van bijvoorbeeld 2.00 als tijd 00:02:00 neer en ik wil graag 02:00:00.
Of is dat niet mogelijk?
 
die moet je invoeren als 200 om 2:00 te krijgen
 
Test deze macro eens.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("C13:F19")) Is Nothing Then Exit Sub
    If IsEmpty(Target) Then Exit Sub
      If Target.Cells.Count > 1 Then Exit Sub
        ingave = Target.Value
        Application.EnableEvents = False
  If Hour(ingave) <> 0 Or Minute(ingave) <> 0 Then
    Target = Hour(ingave) & ":" & Minute(ingave)
      Application.EnableEvents = True
    Exit Sub
  End If
If Int(ingave / 100) < 0.1 Then
  Target = "00:" & ingave
Else
  Target = Int(ingave / 100) & ":" & Right(ingave, 2)
  Target.NumberFormat = "hh:mm:ss"
End If
  Application.EnableEvents = True
End Sub
 
Of

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C13:F19")) Is Nothing Then
    With Application
        .EnableEvents = False
        If Target.Count = 1 And Target <> vbNullString And IsNumeric(Target) And Target < 24 Then
            Target.NumberFormat = "General"
            If InStr(1, Target, ",") <> 0 Or InStr(1, Target, ".") <> 0 Then Target = .Substitute(Target, ".", ":") Else Target = TimeValue(Target & ":00:00")
            Target.NumberFormat = "hh:mm"
          Else
            Target = vbNullString
        End If
        .EnableEvents = True
    End With
End If
End Sub
 
@ExcelAmateur, die code doet helaas nog niet wat ik wil. Bijvoorbeeld bij 6,30 als invoer krijg ik 7:12:00 als uitvoer.

@VenA, dat werkt bijna perfect! Alleen nog een kleine vraag, als ik 2.20 invul maakt hij er 02:02 en geen 02:20. Zou dat nog aangepast kunnen? (A)
 
Je moet bij het invoeren geen komma of punt gebruiken.

Vul in 615 en zie wat het geeft.
 
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [A1:K10]) Is Nothing And Target.Count = 1 And Target <> "" Then
       On Error Resume Next
       c00 = CDate(Format(Right(String(4, "0") & Replace(Replace(Replace(Target, ",", ""), ".", ""), ":", ""), 4), "00:00"))
       
       If Err.Number = 0 Then
           Application.EnableEvents = False
           Target = c00
           Application.EnableEvents = True
        End If
    End If
End Sub
 
@ExcelAmateur, ja dat klopt dat werkt die perfect! :)

However, ik wil niet mijn proces aanpassen aan een macro, maar een macro aanpassen aan mijn proces. Dus ben op zoek naar een oplossing om wel met punt of komma in te voeren.
Als dat niet mogelijk blijkt is dat jammer maar helaas en gebruik ik die macro, maar de macro's van VenA en Snb komen behoorlijk in de buurt! :D :D

@Snb, dank voor je snelle hulp, echter als ik invoer 12,20 krijg ik 1:22 en geen 12:20... :(
Dit geldt voor alle tijden met een 0 op het einde

Maar we komen in de buurt! :D
 
aanpassing aan de code van SNB
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [A1:K10]) Is Nothing And Target.Count = 1 And Target <> "" Then
       On Error Resume Next
       c00 = TimeValue(Replace(Format(Target * 100, "00x00"), "x", ":"))
       If Err.Number = 0 Then
           Application.EnableEvents = False
           Target = c00
           Application.EnableEvents = True
        End If
    End If
End Sub
 
Dat is alleen het geval als je een komma gebruikt.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [A1:K10]) Is Nothing And Target.Count = 1 And Target <> "" Then
       On Error Resume Next

       c00 = Target
       If InStr(Format(Target), ",") Then c00 = Replace(Format(Target, "0.00"), ",", "")
       c00 = CDate(Format(Right(String(4, "0") & Replace(Replace(c00, ".", ""), ":", ""), 4), "00:00"))
       
       If Err.Number = 0 Then
           Application.EnableEvents = False
           Target = c00
           Application.EnableEvents = True
        End If
    End If
End Sub
 
maak eens een lijstje met voorbeelden wat de macro aanmoet passen.
bvb:
1 --> 1:00
12--> 12:00 of 12--> 0:12
123 --> 12:30 of 123 --> 1:23
12.5--> 12:30 of 12.5 --> 12:50

misschien weet je nog wel wat twijfel gevallen
een universele function maken met instelmogelijkheden voor de twijfelgevallen is best nuttig.
 
Laatst bewerkt:
Met het gebied als numberformt 'Text'

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [A1:K10]) Is Nothing And Target.Count = 1 And Target <> "" Then
        Application.EnableEvents = False
        Target = Format(Format(--Replace(Replace(Replace(Target, ",", ""), ".", ""), ":", ""), "00:00"), "hh:mm")
        Application.EnableEvents = True
    End If
End Sub
 
Jaaa, het werkt prima! Heb wat kleine aanpassingen gedaan om het te personaliseren maar werkt perfect!

Dit is de code die ik nu gebruik:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
    If Not Intersect(Target, [C13:F19]) Is Nothing And Target.Count = 1 And Target <> "" Then
       On Error Resume Next
       c00 = TimeValue(Replace(Format(Target * 100, "00x00"), "x", ":"))
       If Err.Number = 0 Then
           Application.EnableEvents = False
           Target = c00
           Application.EnableEvents = True
        End If
    End If
    Range("C13:F19").NumberFormat = "h:mm"

On Error Resume Next
If Intersect(Target, Range("C13:F19")) Is Nothing Then GoTo Einde
If IsEmpty(Target) Then GoTo Einde

If Hour(Target.Value) <> 0 Or Minute(Target.Value) <> 0 Then GoTo Einde
Application.EnableEvents = False
If Int(Target.Value / 100) < 0.1 Then
Target = "00:" & Target.Value
Else
Target = Int(Target.Value / 100) & ":" & Right(Target.Value, 2)
End If
Application.EnableEvents = True

Einde:
ActiveSheet.Calculate
End Sub

Zou misschien nog wel minder complex kunnen maar nu werkt zoweel 1200 als 12,00 als invoer met als uitkomst 12:00. Bedankt allen! :D
 
Laatst bewerkt:
A4papiertje, jij schrijft o.a.

@ExcelAmateur, ja dat klopt dat werkt die perfect!

However, ik wil niet mijn proces aanpassen aan een macro, maar een macro aanpassen aan mijn proces. Dus ben op zoek naar een oplossing om wel met punt of komma in te voeren.

Hier is geen sprake van een macro, maar van het gebruik van een standaard mogelijkheid binnen Excel, die werkelijk in ALLE sheets is te gebruiken, ook in sheets zonder macro's (dus met extensie .xlsx).
Ik zou dat niet noemen "mijn proces aanpassen aan een macro".
 
Zijn toch nog wat dingen waar ik tegenaan loop:

1) Als ik de code gebruik werkt , als invoer dus 12,00 wordt 12:00 maar als ik 12:00 invoer blijft het geen 12:00 maar wordt het 00:50. Als ik de code aanpas naar
Code:
c00 = TimeValue(Replace(Format(Target * 10000, "00x00"), "x", ":"))
werkt 12:00 wel weer, maar 12,00 niet meer....

Ook invoer met een punt is nog niet gelukt. (Nogmaals ik zou dit graag willen ALS het kan)

Iemand een idee?
 
Laatst bewerkt:
A4papiertje,

als je vraagt om een oplossing voor de invoer 12,00 die 12:00 moet worden en je krijgt die oplossing, dan moet je vervolgens wel ALLE tijden ook zo (met ","' invoeren.
Ik blijf voorstander van de oplossing zoals in post #2 aangegeven. Daar werk ik al jaren met volle tevredenheid mee.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan