Excel VBA: Warum funktioniert das mit jeder Uhrzeit außer mit 12:00?

Dieses Thema Excel VBA: Warum funktioniert das mit jeder Uhrzeit außer mit 12:00? im Forum "Microsoft Office Suite" wurde erstellt von klexy, 5. Juli 2011.

Thema: Excel VBA: Warum funktioniert das mit jeder Uhrzeit außer mit 12:00? Aufgabe: eine Uhrzeit per Makro aus Tabelle1, Zelle A1 in Tabelle2, Zelle A1 übertragen: Sub Test() Dim Zeit_1 As...

  1. Aufgabe: eine Uhrzeit per Makro aus Tabelle1, Zelle A1 in Tabelle2, Zelle A1 übertragen:
    Code:
    Sub Test()
      Dim Zeit_1 As String, Zeit_2 As String
      
    Sheets(Tabelle1).Select
      Zeit_1 = Range(A1).Value
      Zeit_2 = Range(B1).Value
    
    Sheets(Tabelle2).Select
      Range(A1).Formula = Format$(Zeit_1, hh:mm:ss)
      Range(B1).Formula = Format$(Zeit_2, hh:mm:ss)
    End Sub
    Wenn ich in Tabelle1 12:00 oder 0,5 eintrage, wird mir in Tabelle2 nur 00:00 angezeigt.
    Bei jeder anderen Uhrzeit funktioniert es korrekt.
    Wenn ich in B1 den Eintrag aus A1 mit einer Formel ableite, funktioniert der Übertrag von B1 nach B1:
    Formel in B1: =TEXT(A1;hh)&:&TEXT(A1;mm)


    Excel 2003
     
  2. Hallo Klexy,

    probier's mal mit der folgenden Version:
    Code:
    Sub Test()
     Dim Zeit_1 As Date, Zeit_2 As Date
      
     Zeit_1 = Sheets(Tabelle1).Range(A1).Value
     Zeit_2 = Sheets(Tabelle1).Range(B1).Value
    
     Sheets(Tabelle2).Range(A1).Value = Format(Zeit_1, hh:nn:ss)
     Sheets(Tabelle2).Range(B1).Value = Format(Zeit_2, hh:nn:ss)
    End Sub
    Gruß Matjes :)
     
  3. Hallo klexy,

    oder

    Code:
    Sub Test1()
      Worksheets(Tabelle2).Range(A1) = Worksheets(Tabelle1).Range(A1)
      Worksheets(Tabelle2).Range(B1) = Worksheets(Tabelle1).Range(B1)
      Worksheets(Tabelle2).Range(A1:B1).NumberFormat = [hh]:mm:ss
    End Sub
     
  4. Hi klexy,

    ich vermute, Du versuchtest, aus Tabelle1!A1 die Stunden in Tabelle2!A1 und die Minuten in Tabelle2!B1 zu extrahieren. (Die Tabellenformel funktioniert einwandfrei.)

    für das Verhalten Deines Codes gibt es zwei Ursachen:

    — zum einen ist Zeit_2 immer 0. Im Gegensatz zur Tabellenformel weist Du Zeit_2 den Wert von Tabelle1!B1 zu. Die ist aber leer und deshalb ist Zeit_2 immer 0

    — zum anderen definierst Du Zeit_1 und .../2 als String. Als ich Dein Problem nachgespielt habe, war Zeit_1 bei mir auch 0. Mein Erklärungsversuch ist nur geraten:
    VBA meckert nicht oft genug bei unklaren Variablentyp-Umwandlungen, sondern wendet ohne Rücksprache seine eigenen Konvertierungsmethoden an. Dein Problem:
    - der tatsächliche Wert in Tabelle!A1 ist 0,5
    - das allgegenwärtige Datums-Zeit-Autoformatierungs-Zeugs von Excel stellt das twar als 12:00 Uhr dar, aber Zeit_1 enthält unerwarteterweise nicht die angezeigten 12:00 als String, sondern 0,5 (aber eben als String!)
    - bei der Format-Funktion passiert es dann. Die scheint die Nachkommastellen abzuschneiden, wenn ihr ein String übergeben wird.

    Du siehst, es ist wichtig, Variablentypen und ihre Geltungsbereiche immer im Hinterkopf zu haben — selbst wenn man kleinste Makros schreibt.

    HTH.

    Markus
     
  5. Danke miteinander.

    @ Markus: ich trenne nicht Stunden von Minuten. Im Tabelle1 sieht ja alles perfekt aus und lässt sich auch korrekt weiterverarbeiten.
    Es liegt tatsächlich am String, was aber leider nicht erklärt, warum da nur mit der Uhrzeit 12:00 ein Problem auftaucht, und alle anderen Uhrzeiten trotz String korrekt übertragen werden.

    @ hddiesel: funktioniert
    Elegant umgangen, überhaupt irgendwas zu definieren. Allerdings kann ich das nicht gebrauchen, weil ich in Wirklichkeit relative Zellpositionen hab – ActiveCell.Offset(0, 3) und Activecell ist jedes Mal eine Zeile tiefer. Ich übertrage nämlich Zellen aus einer senkrechten Erfassungsmaske in eine waagrechte Tabelle.

    @ Matjes: funktioniert
    Es liegt tatsächlich daran, dass ich es als String und nicht als Date definiert habe. Dass man nicht erst in das Tabellenblatt wechselt, sondern es vor die Range schreibt, hat keine Auswirkung, ist nur etwas eleganter.

    Aaaaber:
    Wenn ich in der Zelle gar nix drinstehen hab (was auch manchmal vorkommt) trägt er mir in Tabelle2 den Wert 00:00 ein, statt die Zelle leer zu lassen.
    Es könnte andererseits tatsächlich einen Wert 00:00 geben, der dann eingetragen werden soll.

    Jetzt hab ich das probiert:
    Code:
    If Zeit_1 <>  Then
      Range(A1).Formula = Format$(Zeit_1, hh:mm:ss)
    End If
    Geht aber nicht. Fehlermeldung
    Auch nicht mit Zeit_1.Value <> . Fehlermeldung Typen unverträglich
    Auch nicht mit Len(Zeit_1) <> 0. Das trägt bei leerer Zelle den Wert 00:00 ein.

    Es sieht so aus, dass ich in Tabelle1 mit der Formel-Hilfskonstruktion in Zelle B1 weiterarbeiten muss. Dann allerdings muss ich wieder mit String arbeiten, weil mit der Formel in B1 auch eine leere Zelle in A1 abgefangen werden muss =IF(A1=;;TEXT(A1;hh)&:&TEXT(A1;mm)) und der Wert dann Date nicht verträgt.
    Letzter Absatz war nicht Teil der Frage und ist mir erst nachträglich aufgefallen. Es sind halt immer die Hausfrauenlösungen, die umständlich, aber letztendlich zuverlässig funktionieren.
     
  6. Na denn, versuch es mal so ;D

    Gruß Matjes :)
    Code:
    Sub Test()
     
     Dim d_Zeit As Date
     
    ->*** A1
     If Sheets(Tabelle1).Range(A1).Value =  Then
      Sheets(Tabelle2).Range(A1).Value = 
     Else
      On Error Resume Next
      d_Zeit = Sheets(Tabelle1).Range(A1).Value
      If Err.Number <> 0 Then
       MsgBox (Tabelle1 Zelle A1 kann nicht als Zeit interpretiert werden)
       Err.Clear
      Else
       Sheets(Tabelle2).Range(A1).Value = Format(d_Zeit, hh:nn:ss)
      End If
      On Error GoTo 0
     End If
     
    ->*** B1
     If Sheets(Tabelle1).Range(B1).Value =  Then
      Sheets(Tabelle2).Range(B1).Value = 
     Else
      On Error Resume Next
      d_Zeit = Sheets(Tabelle1).Range(B1).Value
      If Err.Number <> 0 Then
       MsgBox (Tabelle1 Zelle B1 kann nicht als Zeit interpretiert werden)
       Err.Clear
      Else
       Sheets(Tabelle2).Range(B1).Value = Format(d_Zeit, hh:nn:ss)
      End If
      On Error GoTo 0
     End If
     
    End Sub
     
  7. Danke. Hab ich durchgearbeitet und es funktioniert. Aber bei der Umarbeitung in meinen Fall hatte ich Probleme. Ich konnte sie zwar lösen, verstehe aber nicht, warum sie überhaupt aufgetreten sind.

    Konkretisierung der tatsächlichen Tabelle: Tabelle1 (Erfassungsmaske): A1 ist das Datum, A2 ist die Uhrzeit.
    In Tabelle2 sollen die erfassten Datensätze untereinander geschrieben werden: A: Datum, B: Uhrzeit (Sowas Ähnliches wie eine Anwesenheitsliste)

    Der Witz ist anscheinend, dass man beim Quellfeld zwischen Range und Value unterscheiden muss, obwohl man eigentlich nur Value übertragen will.

    So geht es:
    Code:
    Sub Test_Matjes_1()
      Dim Datum As Date
      Dim Quelle As Range, Zeit As Date
      Dim Ziel As Range
      
      Datum = Sheets(Tabelle1).Range(A1).Value
    'dies ist der Unterschied
      Set Quelle = Sheets(Tabelle1).Range(A2)
      Zeit = Quelle.Value
    'Unterschied Ende
      Set Ziel = Sheets(Tabelle2).Range(A10000).End(xlUp).Offset(1, 0)
      
      Ziel.Formula = Datum
      If Quelle.Value =  Then
       Ziel.Offset(0, 1).Value = 
      Else
        Ziel.Offset(0, 1).Value = Format(Zeit, hh:nn)
      End If
     End Sub
    So geht es nicht:
    Code:
    Sub Test_Matjes_2()
      Dim Datum As Date
      Dim von As Date
      Dim Ziel As Range
      
      Datum = Sheets(Tabelle1).Range(A1).Value
    ' dies ist der Unterschied
      von = Sheets(Tabelle1).Range(A2).Value
    'Unterschied Ende
      Set Ziel = Sheets(Tabelle2).Range(A10000).End(xlUp).Offset(1, 0)
      
      Ziel.Formula = Datum
      If von =  Then
       Ziel.Offset(0, 1).Value = 
      Else
        Ziel.Offset(0, 1).Value = Format(von, hh:nn)
      End If
     End Sub
    Keine Ahnung, warum, denn der Value vom Range wird bei beiden definiert, nur eben woanders.
    Das Quelle.Value oben und das von unten sind doch identisch. ???
     
  8. Hi,

    ich komme da nicht ganz mit. Warum heißt es Ziel.Formula und nicht Ziel.Value?

    M.
     
Die Seite wird geladen...

Excel VBA: Warum funktioniert das mit jeder Uhrzeit außer mit 12:00? - Ähnliche Themen

Forum Datum
Excel-Feature gesucht Microsoft Office Suite 11. Okt. 2016
Excel Tabelle Werte zu ordnen Microsoft Office Suite 23. Sep. 2016
Excel: Bereiche auf 'leer' Überprüfen Microsoft Office Suite 15. Sep. 2016
Import Datensatz inkl = und - Zeichen in Excel/Libre CALC Software: Empfehlungen, Gesuche & Problemlösungen 20. Mai 2016
Bestimmter User kann seine Excel Dateien nicht mehr direkt öffnen Software: Empfehlungen, Gesuche & Problemlösungen 16. Apr. 2016