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

  • #1
K

klexy

Bekanntes Mitglied
Themenersteller
Dabei seit
04.05.2002
Beiträge
802
Reaktionspunkte
0
Ort
Bayern
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.
 
Thema:

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

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben