2016-12-23 7 views
0

Vielen Dank für die Suche,Excel VBA Zeit Ausgabe

Ich habe ein Problem mit dem unten genannten VBA-Code. Wahrscheinlich etwas Einfaches.

Wenn ich geben Sie die Zeit als 23.30 wird es automatisch Änderung 23:29

Wenn ich ein, wie es 2330 bis 23:30 Uhr ändert, wie es sollte.

Also warum, wenn ich 23:30 eingeben, ändert es sich zu 23:29? es sollte als 23:30

Dank

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
    Dim xStr As String 
    Dim xVal As String 
    Set rng1 = Range("J:J") 
    Set rng2 = Range("P:P") 
    Set rng3 = Range("S:S") 
     On Error GoTo EndMacro 
    If Application.Intersect(Target, Union(rng1, rng2, rng3)) Is Nothing Then Exit Sub 
    If Target.Count > 1 Then Exit Sub 
    If Target.Value = "" Then Exit Sub 
    If Target.Row < 5 Then Exit Sub 
    Application.EnableEvents = False 
    With Target 
     If Not .HasFormula Then 
      Target.Value = Replace(Target.Value, ";", ":") 
      Target.Value = Left(Target.Value, 5) 
      xVal = .Value 
      Select Case Len(xVal) 
       Case 1 ' e.g., 1 = 00:01 AM 
        xStr = "00:0" & xVal 
       Case 2 ' e.g., 12 = 00:12 AM 
        xStr = "00:" & xVal 
       Case 3 ' e.g., 735 = 07:35 AM 
        xStr = "0" & Left(xVal, 1) & ":" & Right(xVal, 2) 
       Case 4 ' e.g., 1234 = 12:34 
        xStr = Left(xVal, 2) & ":" & Right(xVal, 2) 
       Case 5 ' e.g., 12:45 = 12:45 
        xStr = Left(xVal, 2) & Mid(xVal, 2, 1) & Right(xVal, 2) 
       Case Else 
        Err.Raise 0 
      End Select 
      .Value = Format(TimeValue(xStr), "hh:mm") 
     End If 
    End With 
    Application.EnableEvents = True 
    Exit Sub 
EndMacro: 
    Application.EnableEvents = True 
End Sub 
+0

Wann ändert es sich? In dem Blatt, wenn Sie es oder irgendwo im Code anzeigen? – mountainclimber

Antwort

1

Das liegt daran, dass Excel die Zeitfelder als Bruchteile eines Tages behandelt.

Zum Beispiel:

  • 24 Stunden = 1
  • 12 Stunden = 0,5
  • 6 Stunden = 0,25

In Ihrem Fall: 23h30 = 0,979166666 ...

Aber Sie erhalten nur die ersten 5 Zeichen: Left(Target.Value, 5) ' "0.979"

Und übergeben Sie diesen neuen Wert (0,979) als aktuellen Wert an die Zelle Target.Value = Left(Target.Value, 5).

Also auf Linie xStr = Left(xVal, 2) & Mid(xVal, 2, 1) & Right(xVal, 2), was Ihr Code tatsächlich tut, ist:

Left(0.979, 2) ' -> "0."

Mid(xVal, 2, 1) ' -> "."

Right(xVal, 2) ' -> "79"

Also, wenn Sie kommen, wird das Ergebnis wie folgt:

"0." & "." & "79" = "0..79"

Und "0..79" ist kein gültiger Wert für die Zelle.Dann tritt ein Fehler auf und die Funktion hält den Wert 0.979 ~ 23:29.

Mein Vorschlag, ändern Sie nicht den Wert der Zelle, wenn es bereits kleiner als eins ist. Weil es anzeigt, dass es schon eine Zeit ist.

  1. Löschen Sie die Zeile: Target.Value = Left(Target.Value, 5)
  2. den Wert xval Weisen direkt: xVal = Left(Target.Value, 5)
  3. Alter der "Fall 5" Zustand wie folgt: xStr = Format(Target.Value, "hh:mm")

Der vollständige Code sieht wie folgt aus:

Private Sub Worksheet_Change(ByVal Target As Excel.Range) 
    Dim xStr As String 
    Dim xVal As String 
    Set rng1 = Range("J:J") 
    Set rng2 = Range("P:P") 
    Set rng3 = Range("S:S") 
    On Error GoTo EndMacro 

    If Application.Intersect(Target, Union(rng1, rng2, rng3)) Is Nothing Then Exit Sub 
    If Target.Count > 1 Then Exit Sub 
    If Target.Value = "" Then Exit Sub 
    If Target.Row < 5 Then Exit Sub 
    Application.EnableEvents = False 
    With Target 
     If Not .HasFormula Then 
      Target.Value = Replace(Target.Value, ";", ":") 
      xVal = Left(Target.Value, 5) ' CHANGED! 
      Select Case Len(xVal) 
       Case 1 ' e.g., 1 = 00:01 AM 
        xStr = "00:0" & xVal 
       Case 2 ' e.g., 12 = 00:12 AM 
        xStr = "00:" & xVal 
       Case 3 ' e.g., 735 = 07:35 AM 
        xStr = "0" & Left(xVal, 1) & ":" & Right(xVal, 2) 
       Case 4 ' e.g., 1234 = 12:34 
        xStr = Left(xVal, 2) & ":" & Right(xVal, 2) 
       Case 5 ' e.g., 12:45 = 12:45 
        xStr = Format(Target.Value, "hh:mm") ' CHANGED! 
       Case Else 
        Err.Raise 0 
      End Select 
      .Value = Format(TimeValue(xStr), "hh:mm") ' CHANGED! 
     End If 
    End With 
    Application.EnableEvents = True 
    Exit Sub 
EndMacro: 
    Application.EnableEvents = True 
End Sub 
+0

Danke scheint zu funktionieren. – jynxy

0

bleibt Es scheint, dass Sie die Dinge mit Daten in die falsche Richtung, da die üblichen und empfohlenen Art und Weise zu tun versuchen Daten zu formatieren ist die Format Anweisung zu verwenden.

Wenn Sie jedoch die Daten/Zeiten als Strings manipulieren wollen, müssen Sie ein paar Änderungen an Ihrem Code tun, die drei Zeilen nur nach dem Test:

If Not .HasFormula Then 
     .Value = Replace(.Text, ";", ":") ' <-- use .Text 
     .Value = Left(.Text, 5)   ' <-- 
     xVal = .Text      ' <-- 

Oder noch besser, direkt zuweisen xVal:

If Not .HasFormula Then 
     xVal = Left(Replace(.Text, ";", ":"), 5) ' <-- 

auf der anderen Seite, was Sie bekommen mit .Value ein codierten Datum wurden, das in der Regel als eine Zahl codiert wird, und dann wurden Sie das Datum auf die äußersten linken 5 Ziffern Kürzen, die natürlich führen etwas Ungenauigkeit.